我想在以下BNF中解析比较:
expression ::= comparison | number | string | "(" expression ")"
comparison ::= ( expression ( ">" | "<" | ">=" | "<=" | "==" | "!=" ) expression )
因为我无法知道表达式后面是否会有比较运算符,所以我想首先尝试解析比较。此代码将调用该函数再次解析表达式,然后将导致无限循环。如何妥善处理这个问题?
答案 0 :(得分:1)
所以最后我通过调用另一个函数expression
的函数expression_without_infix
来解决它。然后它测试下一个运算符是否为中缀运算符并相应地解析它。
答案 1 :(得分:0)
Douglas Crockford为JSLint使用Pratt Parser,它可以处理未知深度的嵌套表达式。他在文章Top Down Operator Precedence中解释了背后的理论。似乎还有a Pratt Parser on NPM(虽然我还没有测试过它)。
也许这样的事情会有用吗?