antlr4是否支持自适应语法?

时间:2015-05-19 02:35:23

标签: antlr4

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

实施例: 基本语言包括以下标记定义:

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

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

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

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

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

2 个答案:

答案 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的函数,做pnameparam匹配的数量,类型是匹配还是可转换等等。

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

答案 1 :(得分:0)

自适应语法本质上是“自扩展”解析器的语法,该解析器从其输入中“学习”新的语法规则。 ANTLR似乎不支持自适应语法,但是还有其他一些支持它们的解析器生成器,例如dypgen,它基于GLR解析算法。