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