tiger 抽象语法树生成

这篇博客介绍如何在语法分析过程中添加语义动作,以生成Tiger语言的抽象语法树。根据官方提供的框架和构造函数代码,在tiger.y文件中插入相应的语义动作,实现了这一过程。虽然文法修改后出现了两个新的shift/reduce冲突,但它们不会影响最终结果。
摘要由CSDN通过智能技术生成

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

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

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

/**********************************************************
 * Author        : lh
 * Email         : lhcoder@163.com
 * 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值