在语法分析基础上添加语义动作,生成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