【问题标题】:java syntax for Expression (JDK7 only)表达式的 java 语法(仅限 JDK7)
【发布时间】:2016-06-05 15:27:52
【问题描述】:

这仅适用于 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: 
|| && | ^ & == != < > <= >= << >> >>> + - * / %

看这段代码sn-p

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

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

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

但我无法按照语法解析:

  1. ">= EDGE" 是 Expression2Rest。
  2. “Math.abs(x) >= EDGE”是一个表达式2(因为“Math.abs(x)”是一个表达式3)。
  3. 同样,“Math.abs(y) >= EDGE”是一个表达式2。
  4. “||”是一个中缀 op,表示下一部分应该是 Expression3。

问题是:“Math.abs(y)>=EDGE”不能是 Expression3,因为它包含中缀 op。它是语法的Expression2。解析后的例子变成了

Expression2 InfixOp Expression2

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

【问题讨论】:

    标签: java parsing syntax


    【解决方案1】:

    阅读文档:

    • [x] 表示 x 出现 0 次或 1 次。
    • {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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-27
      • 1970-01-01
      • 2020-01-13
      相关资源
      最近更新 更多