Expression的java语法(仅限JDK7)

时间:2016-02-23 16:56:34

标签: java parsing syntax

这仅适用于jdk 7。以下语法取自 https://docs.oracle.com/javase/specs/jls/se7/html/jls-18.html

Expression: 
    Expression1 [AssignmentOperator Expression1]

Expression1: 
    Expression2 [Expression1Rest]

Expression2:
    Expression3 [Expression2Rest]

Expression2Rest:
    { InfixOp Expression3 }
    instanceof Type

InfixOp: 
|| && | ^ & == != < > <= >= << >> >>> + - * / %

请查看此代码段

 if (Math.abs(x) >= EDGE || Math.abs(y) >= EDGE)
        clear();

括号内的一行是一个表达式(根据ParExpression的定义,未在上面列出)

 Math.abs(x) >= EDGE || Math.abs(y) >= EDGE

但我无法根据语法解析它:

  1. &#34;&gt; = EDGE&#34;是Expression2Rest。
  2. &#34; Math.abs(x)&gt; = EDGE&#34;是一个Expression2(因为&#34; Math.abs(x)&#34;是一个Expression3)。
  3. 同样,&#34; Math.abs(y)&gt; = EDGE&#34;是一个Expression2。
  4. &#34; ||&#34;是一个中缀op,表示下一部分应该是Expression3。
  5. 问题在于:&#34; Math.abs(y)&gt; = EDGE&#34;不能是Expression3,因为它包含中缀op。它是语法的Expression2。解析后的示例变为

    Expression2 InfixOp Expression2
    

    这不会导致有效的表达式。上述逻辑有什么问题?另外,目前我使用递归来进行解析。效率低下。任何按树或图解析的教程?我需要解析真正的java代码,关于解析简单算术表达式的教程没有帮助。感谢。

1 个答案:

答案 0 :(得分:2)

阅读文档:

  
      
  • [x] 表示 x 出现零次或一次。
  •   
  • {x} 表示零次或多次出现 x
  •   

所以:

Expression2:
    Expression3 [Expression2Rest]
Expression2Rest:
    { InfixOp Expression3 }

意味着:

Expression2:
    Expression3 InfixOp Expression3 InfixOp Expression3 InfixOp Expression3 ...

因此:

Math.abs(x) >=      EDGE  ||      Math.abs(y) >=      EDGE
=========== ------- ===== ------- =========== ------- =====
Expr3       InfixOp Expr3 InfixOp Expr3       InfixOp Expr3

Math         . abs           ( x          )
==========     ==========    ================
Identifier { . Identifier } [IdentifierSuffix]   <-- Primary
                             ( Expression )      <-- Arguments