在解析"表达式<的形式的比较时,如何避免无限递归?表达"

时间:2017-11-24 15:15:52

标签: parsing bnf

我想在以下BNF中解析比较:

expression ::= comparison | number | string | "(" expression ")"
comparison ::= ( expression ( ">" | "<" | ">=" | "<=" | "==" | "!=" ) expression ) 

因为我无法知道表达式后面是否会有比较运算符,所以我想首先尝试解析比较。此代码将调用该函数再次解析表达式,然后将导致无限循环。如何妥善处理这个问题?

2 个答案:

答案 0 :(得分:1)

所以最后我通过调用另一个函数expression的函数expression_without_infix来解决它。然后它测试下一个运算符是否为中缀运算符并相应地解析它。

答案 1 :(得分:0)

Douglas Crockford为JSLint使用Pratt Parser,它可以处理未知深度的嵌套表达式。他在文章Top Down Operator Precedence中解释了背后的理论。似乎还有a Pratt Parser on NPM(虽然我还没有测试过它)。

也许这样的事情会有用吗?