我在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 ”的内容?
答案 0 :(得分:2)
语法¹中的编码类型不能很好地扩展。添加的类型越多,所需的语法规则就越多,并且一旦内置的类型超过固定数量(例如,您可以使用元组类型甚至用户定义的类型),就变得毫无可能。 / p>
即使没有这些,也有很多机会遇到问题。例如,假设您向语言添加了变量和函数(或许多其他可能的功能)。变量和函数调用是bool_expr
或int_expr
还是两者?除非您只想将变量和函数限制为一种类型,否则就必须同时使用。函数参数相同。但是现在你的语法是模棱两可的。假设您使用f(x)
作为表达式。仅通过该表达式就无法知道x
是bool_expr
还是int_expr
-您必须知道x
是如何定义的(这需要上下文敏感) )。
因此,拥有一个表达式规则可以匹配语法中所有类型的表达式,并作为一个单独的步骤对树执行类型检查会更加可靠。
¹就是说,通过这样的方式来构造语法,即可以通过知道匹配的产生式来知道表达式的类型,并且所有生成的表达式在构造上都是正确的。