我的ANTLR v4语法的摘录如下:
expression:
| expression BINARY_OPERATOR expression
| unaryExpression
| nularExpression
;
unaryExpression:
ID expression
;
nularExpression:
ID
| NUMBER
| STRING
;
我的目标是在不知道所有必要关键字的情况下匹配语言,因此我只是将关键字作为ID匹配
然而,有二元运算符对关键字的两边(例如关键字)进行参数,因此它们需要“特殊处理”。如您所见,我已在expression
规则中包含此“特殊处理”。
现在的实际问题在于,这些二元运算符中的一些可以用作一元运算符(=普通关键字),这意味着不必指定左参数。
上面的语法不能适应这种情况,因为每当我试图实现这一点时,我最终将每个二元运算符作为一元运算符使用。
示例:
我们假设count
是二元运算符
可能的语法为<arg1> count <arg2>
和count <arg>
我实施上述案例的所有尝试最终都将myArgument count otherArgument
分组为(myArgument (count (otherArgument) ) )
而不是(myArgument) count (otherArgument)
我的大脑告诉我这个问题的解决方案是告诉解析器总是为二元运算符取两个参数,如果失败,它应该尝试将二元运算符作为一元运算符使用。
有人知道如何做到这一点吗?
答案 0 :(得分:0)
这样的事情怎么样:
lower_precedence_expression
: ID higher_precedence_expression
| higher_precedence_expression
;
higher_precedence_expression
: higher_precedence_expression ID lower_precedence_expression
| ID
| NUMBER
| STRING
;