tiger 抽象语法树生成

在语法分析基础上添加语义动作,生成tiger语言抽象语法树。

官网给出框架和构造函数代码,仅仅需要在tiger.y添加相应语义动作,实现比较容易。

文法:
文法稍作改变,增加了tydecs和fundecs来对应书中要求的nametylist和functionlist。由此产生了两个新shift/reduce conflict, 但均无害。

/**********************************************************
 * Author        : lh
 * Email         : [email protected]
 * Create time   : 2017-03-01 16:27
 * Last modified : 2017-03-02 09:51
 * Filename      : tiger.y
 * Description   : 
 * *******************************************************/

%{
#include <stdio.h>
#include "util.h"
#include "symbol.h" 
#include "errormsg.h"
#include "absyn.h"

#define YYDEBUG 1

int yylex(void); /* function prototype */

void yyerror(char *s)
{
    EM_error(EM_tokPos, "%s", s);
}

A_exp absyn_root;
%}


%union {
    int pos;
    int ival;
    string sval;
    A_exp exp;
    A_var var;
    A_expList expList;
    A_efieldList efieldList;
    A_decList decList;
    A_dec dec;
    A_ty ty;
    A_nametyList nametyList;
    A_fundecList fundecList;
    A_namety namety;
    A_fundec fundec;
    A_fieldList fieldList;
    A_field field;
}

%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 

%left SEMICOLON
%right THEN ELSE DOT DO OF
%right ASSIGN
%left OR
%left AND
%nonassoc EQ NEQ LT LE GT GE
%left PLUS MINUS
%left TIMES DIVIDE
%left UMINUS


%type <exp> program exp funcall
%type <var> lvalue
%type <expList> expseq paraseq
%type <efieldList> asseq
%type <decList> decs
%type <dec> dec vardec
%type <nametyList> tydecs
%type <fundecList> fundecs
%type <namety> tydec
%type <fundec> fundec
%type <t
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值