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解析算法。