【发布时间】: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
但我无法按照语法解析:
- ">= EDGE" 是 Expression2Rest。
- “Math.abs(x) >= EDGE”是一个表达式2(因为“Math.abs(x)”是一个表达式3)。
- 同样,“Math.abs(y) >= EDGE”是一个表达式2。
- “||”是一个中缀 op,表示下一部分应该是 Expression3。
问题是:“Math.abs(y)>=EDGE”不能是 Expression3,因为它包含中缀 op。它是语法的Expression2。解析后的例子变成了
Expression2 InfixOp Expression2
这不会导致有效的表达式。上述逻辑有什么问题?另外,目前我使用递归来进行解析。那是低效的。任何通过树或图解析的教程?我需要解析真正的java代码,关于解析简单算术表达式的教程没有帮助。谢谢。
【问题讨论】: