请教虎书上的 tiger.grm
请教虎书上的 tiger.grm。老是通过不了。冲突归约的先不说,光是 never reduce 就有 11 条,弄了很久还是没能弄明白。以下是 tiger.grm的完整代码:
%{
#include <stdio.h>
#include "util.h"
#include "errormsg.h"
int yylex(void); /* function prototype */
void yyerror(char *s)
{
EM_error(EM_tokPos, "%s", s);
}
%}
%union {
int pos;
int ival;
string sval;
}
%token <sval> ID STRING
%token <ival> INT
%token
COMMA COLON SEMICOLON LPAREN RPAREN LBRACK RBRACK
LBRACE RBRACE DOT
PLUS MINUS TIMES DIVIDE EQ NEQ LT LE GT GE
AND OR ASSIGN
ARRAY IF THEN ELSE WHILE FOR TO DO LET IN END OF
BREAK NIL
FUNCTION VAR TYPE
%start glb
%left OR
%left AND
%nonassoc EQ,NEQ,LT,LE,GT,GE
%left PLUS,MINUS
%left TIMES,DIVIDE
%left LBRACE
%left LBRACK
%right UMINUS
%%
/* globle */
glb : declist
| explist
| lvalue
;
/* left value */
lvalue : simplevar
| fieldvar
| subscriptvar
;
simplevar : ID
;
fieldvar : fieldvar DOT ID
;
subscriptvar : subscriptvar LBRACK exp RBRACK
;
/* declare */
declist : dec declist
|
;
dec : typedec
| vardec
| functiondec
;
functiondec : fundeclist
;
fundec : fundec1 EQ exp
| fundec1 COLON typeid EQ exp
;
fundeclist : fundec fundeclist
| COMMA fundeclist
|
;
fundec1 : FUNCTION ID LPAREN fieldlist RPAREN
;
vardec : VAR ID ASSIGN exp
| VAR ID COLON typeid ASSIGN exp
;
typedec : nametylist
;
nametylist : namety1 nametylist
|
;
namety1 : TYPE ID EQ ty
;
ty : namety
| recordty
| arrayty
;
namety : typeid
;
recordty : LBRACE fieldlist RBRACE
;
arrayty : ARRAY OF typeid
;
fieldlist : field fieldlist
| COMMA fieldlist
|
;
field : ID COLON typeid
;
/* expression */
explist : exp explist
| SEMICOLON explist
|
;
exp : ifexp
| otherexp
;
otherexp : varexp
| nilexp
| intexp
| stringexp
| callexp
| opexp
| recordexp
| seqexp
| assignexp
| whileexp
| breakexp
| forexp
| letexp
| arrayexp
| minusexp
;
minusexp : MINUS opexp %prec UMINUS
;
letexp : LET declist IN explist END
;
ifexp : M
| U
;
M : IF exp THEN M ELSE M
| otherexp
;
U : IF exp THEN ifexp
| IF exp THEN M ELSE U
;
whileexp : WHILE exp DO exp
;
forexp : FOR assignexp TO exp DO exp
;
assignexp : lvalue ASSIGN exp
;
varexp : lvalue
;
callexp : ID LPAREN explist RPAREN
;
opexp : exp op exp
;
op : PLUS
| MINUS
| TIMES
| DIVIDE
| EQ
| NEQ
| LT
| LE
| GT
| GE
| OR
| AND
;
arrayexp : typeid LBRACK exp RBRACK OF exp
;
recordexp : typeid LBRACE efieldlist RBRACE
;
efieldlist : efield efieldlist
| COMMA efieldlist
|
;
efield : ID EQ exp
;
seqexp : explist
;
intexp : INT
;
stringexp : ID
;
nilexp : NIL
;
breakexp : BREAK
;
typeid : INT
| STRING
;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
先顶一下
有人知道吗?
看清楚对应的环境描述了么
楼上,不太明白你的意思
书上只有一个frame,内容要自己添的,这是一个教材,课后作业是完成tiger.grm,其实那一学期就是一个tiger.grm。
自己好好看看吧,到作者的学校网站看看有没有学生完成的。
下面这个好像可以,
另外 http://www.lrde.epita.fr/cgi-bin/twiki/view/Tiger/WebHome 有tiger的项目
#include "util.h"
#include "errormsg.h"
#define YYDEBUG 1
int yylex(void); /* function prototype */
void yyerror(char *s)
{
EM_error(EM_tokPos, "%s", s);
}
%}
%union {
int pos;
int ival;
string sval;
}
%token <sval> ID STRING
%token <ival> INT
%token
COMMA COLON SEMICOLON LPAREN RPAREN LBRACK RBRACK
LBRACE RBRACE DOT
PLUS MINUS TIMES DIVIDE EQ NEQ LT LE GT GE
AND OR ASSIGN
ARRAY IF THEN ELSE WHILE FOR TO DO LET IN END OF
BREAK NIL
FUNCTION VAR TYPE
%start program
%right ASSIGN
%left OR
%left AND
%nonassoc GT LT GE LE NEQ EQ
%left PLUS MINUS
%left TIMES DIVIDE
%left UMINUS
%%
program: exp
| decs
| error {printf("error 0.\n");}
;
exp :
NIL
| INT
| STRING
| type_id LBRACE assignment RBRACE
| lvalue
| ID LPAREN exps RPAREN
| MINUS exp %prec UMINUS
| exp op exp
| LPAREN expseq RPAREN
| lvalue ASSIGN exp
| IF exp THEN exp
| IF exp THEN exp ELSE exp
| WHILE exp DO exp
| FOR ID ASSIGN exp TO exp DO exp
| BREAK
| LET decs IN expseq END
;
assignment:
ID EQ exp
| assignment COMMA ID EQ exp
|
;
lvalue : ID
| lvalue DOT ID
| lvalue LBRACK exp RBRACK
| lvalue OF exp
;
exps : expss
|
;
expss: exp
| expss COMMA exp
;
expseq: expseqs
|
;
expseqs: exp
| expseqs SEMICOLON exp
;
decs : dec decs
|
;
dec :
TYPE type_id EQ ty
| vardec
| FUNCTION ID LPAREN tyfields RPAREN EQ exp
| FUNCTION ID LPAREN tyfields RPAREN COLON type_id EQ exp
;
vardec : VAR ID ASSIGN exp
| VAR ID COLON type_id ASSIGN exp
;
ty : type_id
| LBRACE tyfields RBRACE
| ARRAY OF type_id
;
tyfields : ID COLON type_id
| tyfields COMMA ID COLON type_id
|
;
type_id : ID
;
op : PLUS | MINUS | TIMES | DIVIDE | EQ | NEQ | GE | LE | GT | LT | AND | OR
;