0
expression -> expression OPER expression
expression -> PREFIX expression
expression -> expression POSTFIX
expression -> expression ‘?’ expression ‘:’ expression
expression -> expression ‘[’ expression ‘]’
expression -> expression ‘(’ expression ‘)’
expression -> ID
expression -> CONSTANT
expression ->‘(’ expression ‘)’

LR解析器在分析过程中,该语法中的reduce-reduce和shift-reduce冲突有哪些?

4

2 回答 2

1

该摘录中没有减少-减少冲突,但肯定到处都有移位-减少冲突。所有这些都具有相同的原因:语法没有尝试定义各种运算符的优先级,结果任何具有多个运算符的表达式都是模棱两可的。

例如, PREFIX ID POSTFIX可以将其解析为书面(PREFIX ID) POSTFIXPREFIX (ID POSTFIX). ID这显然会在减少到后产生移位减少冲突expression

Stack: PREFIX expression
Lookahead: POSTFIX

此时,解析器可以将堆栈减少到expressionusing expression -> PREFIX expression。但它也可以POStFIX从输入转移到堆栈上,为减少做准备expression -> expression POSTFIX

每个其他运算符都会发现相同的歧义。

于 2021-02-16T22:30:16.343 回答
0

reduce-reduce意味着它已经达到了这样一种状态,在一个语言符号前面,它可以减少两个不同的规则,导致两个不同的语法树代表你的句子。由于下一个符号在两种情况下都有效,并且是一个单符号解析器,这意味着您的语法不明确,您需要提供更多信息(如优先规则或类似规则)以使解析器接受一个减少或其他。

yacc您可以从类型语法编译器或shift-reduce收到此错误,这再次意味着您的语法有歧义。虽然没有解决方案,只能改变语法的定义方式,或者切换到基于运算符优先级的语法来解决这个问题,但在这两种情况下,我们都在寻找某种歧义,导致两种不同的语法树描述你的语言句子.

在你的情况下,规则

expression : expression OPER expression

充满了歧义,因为您无法猜测:

3 + 5 + 8

将产生一个解析树:

   /--- <3>         expression : CONSTANT
<+>                 expression : expression OPER expression
   \       /--- <5> expression : CONSTANT
    \--- <+>        expression : expression OPER
           \--- <8> expression : CONSTANT

或者

           /--- <3> expression : CONSTANT
    /--- <+>        expression : expression OPER expression
   /       \--- <5> expression : CONSTANT
<+>                 expression : expression OPER expression
   \--- <8>         expression : CONSTANT

第一个表示表达式被解析为(以完整的括号表示)(3 + (5 + 8)),第二个表示您的解析器已解释((3 + 5) + 8)

于 2021-02-22T18:49:38.053 回答