【问题标题】:Is it logical for several parser reduction functions to get called along the way of reducing one expression?在缩减一个表达式的过程中调用多个解析器缩减函数是否合乎逻辑?
【发布时间】:2014-02-16 08:36:19
【问题描述】:

我编写了一个解析器,它可以像 lex 和 yacc 一样分析代码并减少它(几乎)。

我想知道这件事的一个方面。如果我有一组规则如下:

unary: IDENTIFIER
     | IDENTIFIER '(' expr_list ')'

只要找到标识符,就可以减少只有 IDENTIFIER 的第一条规则。但是,只有在输入还包括括号之间的有效表达式列表时,才能减少第二条规则。

在这种情况下,解析器应该如何工作?

如果我立即减少第一个标识符,我可以保留结果并在我意识到第二个规则确实匹配时将其丢弃。如果第二条规则不匹配,那么我可以返回早期减少的结果。

这也意味着如果第二条规则适用,两个归约函数都将被调用。

我们是否希望保留早期减少并仅在第二条更长的规则适用时才应用它?


对于那些感兴趣的人,我将我的解析器语法的更完整版本放在这个答案中:https://codereview.stackexchange.com/questions/41769/numeric-expression-parser-calculator/41786#41786

【问题讨论】:

    标签: parsing software-design yacc


    【解决方案1】:

    自下而上的解析器(如bisonyacc)在到达生产结束之前不会减少。他们不必猜测他们将使用哪种减少,直到他们需要它。因此,拥有两个具有相同前缀的产品确实不是问题。从这个意义上说,该算法与用于递归下降解析的自顶向下算法完全不同。

    为了使您提供的片段可由 LALR(1) 解析器生成器解析 - 即,自下而上的解析器能够在生产结束后仅检查一个 (1) 令牌-- 语法必须保证unary 后面不能跟 (。只要是这样,解析器就可以看到 ( 足以防止单位缩减 unary: IDENTIFIER 在应该与其他 unary 生产一起缩减的上下文中发生。

    (这有点过于简单化了,但我认为在 SO 上重现关于 LALR 解析的标准文本是不正确的。)

    【讨论】:

    • 是的。这证实了我的想法。 unary 本身也包括 '(' expr_list ')' 但一元不能跟随另一个一元所以我没有一个跟随一元的(。然而有时我的实现在错误的地方错误地减少了......需要更多的调试!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    相关资源
    最近更新 更多