请教虎书上的 tiger.grm

发布于 2022-09-18 18:28:08 字数 14396 浏览 14 评论 0

请教虎书上的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

地狱即天堂 2022-09-25 18:28:08

先顶一下

国产ˉ祖宗 2022-09-25 18:28:08

有人知道吗?

软糯酥胸 2022-09-25 18:28:08

看清楚对应的环境描述了么

南七夏 2022-09-25 18:28:08

楼上,不太明白你的意思

他夏了夏天 2022-09-25 18:28:08

书上只有一个frame,内容要自己添的,这是一个教材,课后作业是完成tiger.grm,其实那一学期就是一个tiger.grm。
自己好好看看吧,到作者的学校网站看看有没有学生完成的。

深居我梦 2022-09-25 18:28:08

下面这个好像可以,
另外 http://www.lrde.epita.fr/cgi-bin/twiki/view/Tiger/WebHome  有tiger的项目

#include <stdio.h>
#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
       ;

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文