这仅适用于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
但我无法根据语法解析它:
问题在于:&#34; Math.abs(y)&gt; = EDGE&#34;不能是Expression3,因为它包含中缀op。它是语法的Expression2。解析后的示例变为
Expression2 InfixOp Expression2
这不会导致有效的表达式。上述逻辑有什么问题?另外,目前我使用递归来进行解析。效率低下。任何按树或图解析的教程?我需要解析真正的java代码,关于解析简单算术表达式的教程没有帮助。感谢。
答案 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