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 冲突的东西,这让我想知道你提供的是否是完整的文字语法文件。
一些问题:
在 program
中,'is'
不是有效的 single-character 令牌。
compound_statement
中的END
后有一个分号。
declaration
未在任何地方使用。
id_loop
生成一个 ID
后跟任意数量的逗号。所以 a,,,,
是有效的 id_loop
但不是 a, b, c
.
如果 factor
.
的第三行,我很确定你在开头缺少 |
右递归太多了。在某些情况下,这只会产生过多的解析器堆栈使用,但对于算术运算符来说尤其严重,因为它会产生 right-associative 而它们不会。
特别是,它将 1 - 2 - 3
解析为 1 - (2 - 3)
而不是正确的 (1 - 2) - 3
一元减号的优先级太高了。您最终会像 -(2 + 6)
那样解析 -2 + 6
,因此结果将是 -8 而不是 4。
我正在尝试让一个基本的编译器解析和解释一种简单的编程语言。我创建了我的上下文无关语法,并尝试在 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 冲突的东西,这让我想知道你提供的是否是完整的文字语法文件。
一些问题:
在
program
中,'is'
不是有效的 single-character 令牌。compound_statement
中的END
后有一个分号。declaration
未在任何地方使用。id_loop
生成一个ID
后跟任意数量的逗号。所以a,,,,
是有效的id_loop
但不是a, b, c
.如果
factor
. 的第三行,我很确定你在开头缺少 右递归太多了。在某些情况下,这只会产生过多的解析器堆栈使用,但对于算术运算符来说尤其严重,因为它会产生 right-associative 而它们不会。
特别是,它将
1 - 2 - 3
解析为1 - (2 - 3)
而不是正确的(1 - 2) - 3
一元减号的优先级太高了。您最终会像
-(2 + 6)
那样解析-2 + 6
,因此结果将是 -8 而不是 4。
|