antlr4支持自适应语法吗?



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

的例子:基语言包括以下标记定义:

  • 令牌1定义为[a-z][0-9]*
  • 令牌#2是[A-Z][0-9]*

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

用户可以"声明"Fxy,并且F的每个后续实例必须有两个变量。我希望解析器执行"新规则"。

也许这是编译器的标准公平,我知道当我没有为我在其他地方声明的函数传递正确数量的参数时,我使用的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 s的类型和数量是否正确是一个语义问题,只能通过遍行生成的树实现分析来回答:给定的fname是否存在函数,pname s和param s的数量是否匹配,类型是否匹配或它们是否可转换等。

Antlr的书会有帮助。您可能希望花一些时间查看存储库语法,以便更好地了解如何用语法来描述不同的语言。

自适应语法本质上是"自扩展"解析器的语法,它从输入中"学习"新的语法规则。ANTLR似乎不支持自适应语法,但是有一些其他的解析器生成器确实支持自适应语法,比如digen,它基于GLR解析算法。

最新更新