解析 "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
解决了这个问题。然后它测试下一个运算符是否是中缀运算符并相应地解析它。
我想在下面的 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
解决了这个问题。然后它测试下一个运算符是否是中缀运算符并相应地解析它。