0

我正在按照老虎书编写编译器。

在第 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是一个列表可以包含fundecstydecs。因此fundecs,例如 的列表可以简化为decs 的列表或 s 的列表fundec

因此我想问为什么要这样做,为解析器添加冲突语法的原因是什么?

非常感谢!!!

4

0 回答 0