解析 "expression < expression" 形式的比较时如何避免无限递归

How do I avoid infinite recursion when parsing a comparison in form of "expression < expression"

我想在下面的 BNF 中解析一个比较:

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

因为不知道表达式后面会不会有比较运算符,所以想到先尝试解析比较。这段代码会再次调用解析表达式的函数,这将导致死循环。如何正确处理这个问题?

Douglas Crockford 使用 Pratt Parser for JSLint,它可以处理未知深度的嵌套表达式。他在他的文章 Top Down Operator Precedence. There also appears to be a Pratt Parser on NPM 中解释了它背后的理论(尽管我还没有测试过)。

也许类似的东西会有用?

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