我为具有以下语法的语言创建了一个编译器,由 ML-Yacc 定义(起始符号是底部定义的“程序”):
%nonassoc FUN VAR ASSIGN PLUSASSIGN MINUSASSIGN TIMESASSIGN DIVIDEASSIGN
%right ELSE
%left OR
%left AND
%nonassoc EQ NEQ GT LT GE LE
%left PLUS MINUS
%left TIMES DIVIDE
%left UNARY
%left LPAREN
%%
const: INT
| FLOAT
| BOOL
| STRING
ty: ID
| FUN LPAREN typeList RPAREN ARROW ty
typeList: typeList'
|
typeList': ty COMMA typeList'
| ty
exp: primaryExp
| callExp
| boolExp
| opExp
| assignExp
assignExp: ID ASSIGN exp
| ID PLUSASSIGN exp
| ID MINUSASSIGN exp
| ID TIMESASSIGN exp
| ID DIVIDEASSIGN exp
tyargs: LT typeList' GT
callExp: exp LPAREN expList RPAREN
boolExp: exp AND exp
| exp OR exp
opExp: ID PLUSPLUS
| ID MINUSMINUS
| PLUSPLUS ID
| MINUSMINUS ID
| exp PLUS exp
| exp MINUS exp
| MINUS exp %prec UNARY
| BANG exp %prec UNARY
| exp TIMES exp
| exp DIVIDE exp
| exp EQ exp
| exp NEQ exp
| exp GT exp
| exp LT exp
| exp GE exp
| exp LE exp
expList: expList'
|
expList': exp COMMA expList'
| exp
primaryExp: ID
| const
| lambdaExp
| LPAREN exp RPAREN
varDecl: ty ID ASSIGN exp
| ty ID
| VAR ID ASSIGN exp
expStat: exp SEMICOLON
| SEMICOLON
statList: stat statList
|
compoundStat: LBRACE statList RBRACE
selectionStat: IF LPAREN exp RPAREN stat ELSE stat
| IF LPAREN exp RPAREN stat
jumpStat: RETURN exp
| RETURN
| BREAK
iterationStat: WHILE LPAREN exp RPAREN stat
| FOR LPAREN SEMICOLON SEMICOLON RPAREN stat
| FOR LPAREN SEMICOLON SEMICOLON exp RPAREN stat
| FOR LPAREN SEMICOLON exp SEMICOLON RPAREN stat
| FOR LPAREN SEMICOLON exp SEMICOLON exp RPAREN stat
| FOR LPAREN varDecl SEMICOLON SEMICOLON RPAREN stat
| FOR LPAREN varDecl SEMICOLON SEMICOLON exp RPAREN stat
| FOR LPAREN varDecl SEMICOLON exp SEMICOLON RPAREN stat
| FOR LPAREN varDecl SEMICOLON exp SEMICOLON exp RPAREN stat
| FOR LPAREN exp SEMICOLON SEMICOLON RPAREN stat
| FOR LPAREN exp SEMICOLON SEMICOLON exp RPAREN stat
| FOR LPAREN exp SEMICOLON exp SEMICOLON RPAREN stat
| FOR LPAREN exp SEMICOLON exp SEMICOLON exp RPAREN stat
stat: expStat
| compoundStat
| selectionStat
| iterationStat
| jumpStat SEMICOLON
| varDecl SEMICOLON
declList: declList'
|
declList': varDecl COMMA declList'
| varDecl
functionDecl: FUN ID LPAREN declList RPAREN ARROW ty compoundStat
lambdaExp: LPAREN declList RPAREN ARROW ty compoundStat
declarations: varDecl SEMICOLON declarations
| functionDecl declarations
|
program: declarations
这个语法很好,但是现在我想引入参数多态性,因此在语法中添加了以下产生式:
tyargs: LT typeList' GT
ty: ID tyargs
callExp: exp tyargs LPAREN expList RPAREN
idList: ID COMMA idList
| ID
tyvars: LT idList GT
functionDecl: FUN ID tyvars LPAREN declList RPAREN ARROW ty compoundStat
现在我遇到了以下 2 个减少/减少冲突,我不知道如何解决
error: state 75: reduce/reduce conflict between rule 46 and rule 5 on GT
error: state 75: reduce/reduce conflict between rule 46 and rule 5 on COMMA
谁能告诉我如何消除这两个冲突?
编辑:这是来自 mlyacc http://pastebin.com/2w26ytuV的完整 .desc 输出。并不是说这个也显示了 2 个良性移位/减少错误