antl4是否支持允许用户指定新规则的自适应语法,例如强制执行函数声明中指定的参数数量?
实施例: 基本语言包括以下标记定义:
大写字母是为函数名保留的,小写字母是为传递给函数的变量保留的。
用户可以声明" Fxy,以及F的每个后续实例都必须有两个变量。我希望解析器强制执行"新规则"。
也许这是编译器中的标准公平,我知道我用于C,python等的编译器,当我没有为我在别处声明的函数传递正确数量的参数时。但是,我不知道如何在自己的语法中做到这一点;我在编译器上学习的本科课程已经超过15年了,我不记得它包括如何强制执行用户声明的函数所需的参数#。我编写了一些简单的语言,包含五个关键字和范围(括号),有些类似于您在教科书中找到的计算器示例,但并不复杂。
所以,我想我也想知道的是,ANTLR书籍是否会教会我如何做到这一点(如果书籍没有解释我想要实现的目标,不要花钱)。
答案 0 :(得分:0)
自适应语法将是用于产生另一种语法的语法。但这不是您真正要求的,或者解析器通常用于您描述的目的。
通常,语法定义语言(或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
和param
匹配的数量,类型是匹配还是可转换等等。
Antlr的书籍会有所帮助。您可能希望花一些时间查看repository grammars,以便更好地了解语法如何描述不同的语言。
答案 1 :(得分:0)