YACC 7 条规则从未减少 15 reduce/reduce 次冲突

YACC 7 rules never reduced 15 reduce/reduce conflicts

我正在尝试让一个基本的编译器解析和解释一种简单的编程语言。我创建了我的上下文无关语法,并尝试在 YACC 中实现它,但我一直收到“6 fules never reduced”。这是我在 yacc 文件中的作品

%token BEGIN END INT INT_CONST STRING STRING_LIT TERM ID PRINT

%%


start : program
      ;

program: ID 'is' compound_statement
                    ; 

compound_statement: BEGIN statement_loop END; {;}
                    ;

statement_loop: statement statement_loop
                | statement
                ;

statement:      ID '=' expr ';'
                | ID'=' STRING_LIT ';'
                | PRINT value_loop ';'
                ;

value_loop:     value '.' value_loop
                | value
                ;

value:          STRING_LIT
                | expr
                ;

expr:           term_loop
                | '-' term_loop
                ;

term_loop:      term
                | term '+' term_loop
                | term '-' term_loop
                ;

term:           factor_loop
                ;

factor_loop:    factor_loop
                | factor '*' factor_loop
                | factor '/' factor_loop
                ;

declaration:    INT id_loop
                | STRING id_loop
                ;

id_loop:        ID
                | id_loop ','
                ;

factor:         INT_CONST
                | ID
                '(' expr ')'
                ;

factor_loop 没有 non-recursive 产量,因此它永远无法生产任何东西。您的意思可能是第一个作品是 factor_loop: factor.

既然factor_loop不能生产任何东西,所有依赖factor_loop的生产也没有用。

该语法还有许多其他问题,因此可能会出现其他错误消息。我没有看到任何会导致 reduce-reduce 冲突的东西,这让我想知道你提供的是否是完整的文字语法文件。

一些问题:

  1. program 中,'is' 不是有效的 single-character 令牌。

  2. compound_statement中的END后有一个分号。

  3. declaration 未在任何地方使用。

  4. id_loop 生成一个 ID 后跟任意数量的逗号。所以 a,,,, 是有效的 id_loop 但不是 a, b, c.

  5. 如果 factor.

  6. 的第三行,我很确定你在开头缺少 |
  7. 右递归太多了。在某些情况下,这只会产生过多的解析器堆栈使用,但对于算术运算符来说尤其严重,因为它会产生 right-associative 而它们不会。

    特别是,它将 1 - 2 - 3 解析为 1 - (2 - 3) 而不是正确的 (1 - 2) - 3

  8. 一元减号的优先级太高了。您最终会像 -(2 + 6) 那样解析 -2 + 6,因此结果将是 -8 而不是 4。