我正在尝试匹配变量arity的运算符(例如,在数学表达式中,给定3 我们如何保持优先级,但仍然将smallThanExpression解析为尽可能贪婪? 例如; “1&lt; 1 + 1&lt; 3”应该被解析为具有三个子节点的单个解析节点“smallerThanExpression”,每个子节点是表达式。此时,较小的表达式以两个较小的表达式(1 <(1 + 1 <3))分解。expression: '(' expression ')' # parenthesisExpression
| expression ('*' | '/' | '%') expression # multiplicationExpression
| expression ('+' | '-') expression # additionExpression
| expression (SMALLER_THAN expression)+ # smallerThanExpression
| IDENTIFIER # variableExpression
;
答案 0 :(得分:1)
为&#34;后代&#34;给出答案:我们通过将算术表达式与其他表达式分开来修复它。我们知道只有算术表达式可以用作变量运算符的操作数(&#39; true&lt; false&#39;不是有效的表达式)。
expression:
'!' expression
| arithmetic (SMALLER_THAN arithmetic)+
| arithmetic (GREATER_THAN arithmetic)+
| ....
;
arithmetic:
'(' expression ')'
| expression ('*' | '/' | '%') expression
| expression ('+' | '-') expression
| IDENTIFIER
| ...
;
这会强制执行一个表达式,例如&#34; x&lt; y&lt; ž&#34;被解析为一个单独的表达&#39;具有三个算术的节点&#39;作为孩子的节点。
(注意,标识符可能引用非整数对象;这在上下文检查器中检查)