应该在ANTLR语法中或在访问者中检查类型?

时间:2018-08-09 21:26:40

标签: java antlr4

我在ANTRL中的语法的一部分是布尔表达式。目前, expr 仅适用于字符串。

bool_expr
 : '(' bool_expr ')'             #boolParenOp
 | left=expr oper=OP right=expr  #boolOp
 | TRUE                          #boolAtom
 | FALSE                         #boolAtom
 ;

expr
 : attributeAccess
 | STRING
 ;

如果我想向 bool_expr 添加整数或数字,我应该检查语法类型,添加更多规则,例如“ left = num_expr oper = OP right = num_expr ”或查看访问者中“ expr ”的内容?

1 个答案:

答案 0 :(得分:2)

语法¹中的编码类型不能很好地扩展。添加的类型越多,所需的语法规则就越多,并且一旦内置的类型超过固定数量(例如,您可以使用元组类型甚至用户定义的类型),就变得毫无可能。 / p>

即使没有这些,也有很多机会遇到问题。例如,假设您向语言添加了变量和函数(或许多其他可能的功能)。变量和函数调用是bool_exprint_expr还是两者?除非您只想将变量和函数限制为一种类型,否则就必须同时使用。函数参数相同。但是现在你的语法是模棱两可的。假设您使用f(x)作为表达式。仅通过该表达式就无法知道xbool_expr还是int_expr-您必须知道x是如何定义的(这需要上下文敏感) )。

因此,拥有一个表达式规则可以匹配语法中所有类型的表达式,并作为一个单独的步骤对树执行类型检查会更加可靠。


¹就是说,通过这样的方式来构造语法,即可以通过知道匹配的产生式来知道表达式的类型,并且所有生成的表达式在构造上都是正确的。