我正在按照老虎书编写编译器。
在第 3 章中,根据 github 的代码和我的理解,我为 : 填写了以下规则dec
:
decs:
%empty
| decs dec
;
dec:
tydec
| vardec
| fundec
;
tydec:
TYPE ID '=' ty
;
vardec:
VAR ID ASSIGN exp
| VAR ID ':' ID ASSIGN exp
;
fundec:
FUNCTION ID '(' tyfields ')' '=' exp
| FUNCTION ID '(' tyfields ')' ':' ID '=' exp
但是,在第 4 章中,本书为 ast 提供了以下功能:
A_fundecList A_FundecList(A_fundec head, A_fundecList tail);
A_nametyList A_NametyList(A_namety head, A_nametyList tail);
这充分利用了我发现的代码调整decs
令牌如下
decs:
%empty
| decs dec
;
dec:
tydecs
| vardec
| fundecs
;
tydecs:
tydec
| tydec tydecs
tydec:
TYPE ID '=' ty
;
vardec:
VAR ID ASSIGN exp
| VAR ID ':' ID ASSIGN exp
;
fundecs:
fundec
| fundec fundecs {$$ = A_FundecList($1, $2);}
;
fundec:
FUNCTION ID '(' tyfields ')' '=' exp
| FUNCTION ID '(' tyfields ')' ':' ID '=' exp
列表标记fundecs
并被tydecs
添加到生产规则中。
我不明白为什么要这样做,因为这显然会产生冲突。因为decs
是一个列表可以包含fundecs
和tydecs
。因此fundecs
,例如 的列表可以简化为dec
s 的列表或 s 的列表fundec
。
因此我想问为什么要这样做,为解析器添加冲突语法的原因是什么?
非常感谢!!!