Parsing 在缩减一个表达式的过程中调用几个解析器缩减函数是否合乎逻辑?

Parsing 在缩减一个表达式的过程中调用几个解析器缩减函数是否合乎逻辑?,parsing,software-design,yacc,Parsing,Software Design,Yacc,我编写了一个解析器来分析代码,并像lex和yacc(相当多)那样减少代码 我想知道事情的一个方面。如果我有一套规则,例如: unary: IDENTIFIER | IDENTIFIER '(' expr_list ')' 只要找到一个标识符,就可以减少第一个只包含标识符的规则。但是,只有当输入还包括括号之间写入的表达式的有效列表时,才能减少第二条规则 在这种情况下,解析器应该如何工作 如果我立即减少第一个标识符,我可以保留结果,如果我意识到第二个规则不匹配,就将其丢弃。如果第二条规则

我编写了一个解析器来分析代码,并像lex和yacc(相当多)那样减少代码

我想知道事情的一个方面。如果我有一套规则,例如:

unary: IDENTIFIER
     | IDENTIFIER '(' expr_list ')'
只要找到一个标识符,就可以减少第一个只包含标识符的规则。但是,只有当输入还包括括号之间写入的表达式的有效列表时,才能减少第二条规则

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

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

这也意味着,如果第二条规则适用,将调用这两个缩减函数

相反,我们是否希望保留早期削减,并仅在第二条更长的规则适用时才实施


对于那些感兴趣的人,我在这个答案中提供了一个更完整的解析器语法版本:

自下而上的解析器(如
bison
yacc
)在生产结束之前不会减少。在他们需要之前,他们不必猜测他们将使用哪种降价。因此,有两个具有相同前缀的产品并不是一个问题。从这个意义上讲,该算法与自顶向下算法(例如,在递归下降解析中使用的自顶向下算法)完全不同

为了让您提供的片段能够被LALR(1)解析器生成器解析——也就是说,一个自底向上的解析器能够在一个产品结束后只检查一个
(1)
标记——语法必须是这样的:在任何地方都不能有
一元数
跟在后面(.只要这是真的,解析器可以看到a(的事实就足以防止单位缩减
一元:标识符
发生在它应该与另一个
一元
生成一起缩减的上下文中

(这有点过于简单了,但我认为在这里复制LALR解析的标准文本是不正确的。)

自下而上的解析器(如
bison
yacc
)在生产结束之前不要进行缩减。他们不必猜测在需要之前将使用哪种缩减。因此,使用相同前缀的两个生产并不是一个问题。从这个意义上讲,该算法与自顶向下算法(例如,在递归下降解析中使用的自顶向下算法)完全不同

为了让您提供的片段能够被LALR(1)解析器生成器解析——也就是说,一个自底向上的解析器能够在一个产品结束后只检查一个
(1)
标记——语法必须是这样的:在任何地方都不能有
一元数
跟在后面(.只要这是真的,解析器可以看到a(的事实就足以防止单位缩减
一元:标识符
发生在它应该与另一个
一元
生成一起缩减的上下文中

(这有点过于简单了,但我认为在这里复制LALR解析的标准文本是不正确的。)

自下而上的解析器(如
bison
yacc
)在生产结束之前不要进行缩减。他们不必猜测在需要之前将使用哪种缩减。因此,使用相同前缀的两个生产并不是一个问题。从这个意义上讲,该算法与自顶向下算法(例如,在递归下降解析中使用的自顶向下算法)完全不同

为了让您提供的片段能够被LALR(1)解析器生成器解析——也就是说,一个自底向上的解析器能够在一个产品结束后只检查一个
(1)
标记——语法必须是这样的:在任何地方都不能有
一元数
跟在后面(.只要这是真的,解析器可以看到a(的事实就足以防止单位缩减
一元:标识符
发生在它应该与另一个
一元
生成一起缩减的上下文中

(这有点过于简单了,但我认为在这里复制LALR解析的标准文本是不正确的。)

自下而上的解析器(如
bison
yacc
)在生产结束之前不要进行缩减。他们不必猜测在需要之前将使用哪种缩减。因此,使用相同前缀的两个生产并不是一个问题。从这个意义上讲,该算法与自顶向下算法(例如,在递归下降解析中使用的自顶向下算法)完全不同

为了让您提供的片段能够被LALR(1)解析器生成器解析——也就是说,一个自底向上的解析器能够在一个产品结束后只检查一个
(1)
标记——语法必须是这样的:在任何地方都不能有
一元数
跟在后面(.只要这是真的,解析器可以看到a(的事实就足以防止单位缩减
一元:标识符
发生在它应该与另一个
一元
生成一起缩减的上下文中


(这有点过于简单,但我认为在这里复制LALR解析的标准文本是不正确的。)

是的。这证实了我的想法。
一元
本身也包括
(“expr_list”)
但一元不能跟在另一个一元后面,所以我没有
紧跟着一元数。但有时我的实现在错误的地方错误地减少了…需要更多的调试!是的。这证实了我的想法。
一元数本身也包括
”(“expr\u li