N-ary运算符解析

时间:2014-06-15 18:30:51

标签: antlr4

我正在尝试匹配变量arity的运算符(例如,在数学表达式中,给定3

expression: '(' expression ')'                  # parenthesisExpression
      | expression ('*' | '/' | '%') expression # multiplicationExpression
      | expression ('+' | '-') expression       # additionExpression
      | expression (SMALLER_THAN expression)+   # smallerThanExpression
      | IDENTIFIER                              # variableExpression
      ;

我们如何保持优先级,但仍然将smallThanExpression解析为尽可能贪婪?

例如; “1&lt; 1 + 1&lt; 3”应该被解析为具有三个子节点的单个解析节点“smallerThanExpression”,每个子节点是表达式。此时,较小的表达式以两个较小的表达式(1 <(1 + 1 <3))分解。

1 个答案:

答案 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;作为孩子的节点。

(注意,标识符可能引用非整数对象;这在上下文检查器中检查)