antlr4支持自适应语法吗?

Does antlr4 support adaptive grammar?

antl4 是否支持允许用户指定新规则的自适应语法,例如强制执行函数声明中指定的参数数量?

示例: 基础语言包括以下标记定义:

函数名保留大写字母,传递给函数的变量保留小写字母。

用户可以"declare" Fxy,F的每个后续实例都必须有两个变量。我希望解析器强制执行 "new rule".

也许这在编译器中是标准公平的,我知道我用于 C、python 等的编译器。当我没有为我在别处声明的函数传递正确数量的参数时,这很糟糕。但是,我不知道如何用我自己的语法自己做到这一点;我上的编译器本科课程是 15 多年前的事了,我不记得它包括如何强制执行用户声明函数所需的参数数量。我写了一些带有五个关键字和范围(括号)的简单语言,有些类似于您在教科书中找到的计算器示例,但并不复杂。

所以,我想我还想知道 ANTLR 书籍是否会教我如何做到这一点(如果书籍没有解释我想要实现的目标,我不想花钱)。

自适应文法是一种用于生成另一种文法的文法。但这不是您真正要求的,也不是解析器通常如何用于您描述的目的。

一般来说,语法定义了语言(或 DSL)允许的语法,而从语法生成的树的访问者确定是否满足语言语义。对命名函数的调用是否包含正确数量和类型的参数是语义问题,而不是语法问题。

考虑以下语法片段:

decl   : fName AS FUNC LPAREN params? RPAREN body ;
func   : FUNC fName LPAREN params? RPAREN body ;
params : param ( COMMA param)* ;
param  : type pname ;

stmnt  : fname LPAREN ( pname ( COMMA pname )* )? RPAREN SEMI ;

它允许标准函数(方法)并允许声明新函数。 stmnt 规则允许调用命名函数。

pname 的类型和数量是否正确是一个语义问题,只能通过遍历生成的树进行分析来回答:是否存在给定 [=13= 的函数], pnameparam 的数量是否匹配,类型是否匹配或是否可转换等

Antlr 书籍会有所帮助。您可能希望花一些时间查看 repository grammars 以更好地了解语法如何描述不同的语言。

自适应文法本质上是 "self-extensible" 解析器的文法,"learns" 新文法规则来自其输入。 ANTLR似乎不支持自适应文法,但是有some other parser generators that do support them, such as dypgen, which is based on the GLR个解析算法。