From 6a3a9c0144b1187107fba82bbc21b31cce404f6d Mon Sep 17 00:00:00 2001 From: zhaochaoyi <1251887477@qq.com> Date: Wed, 23 Mar 2022 13:55:17 +0800 Subject: [PATCH] Lab2 symbol table end --- Code/data.h | 9 +- Code/lex.yy.c | 88 ++++++------- Code/parser | Bin 0 -> 60008 bytes Code/symbol.c | 66 ++++++++-- Code/syntax.tab.c | 306 +++++++++++++++++++++++----------------------- Code/syntax.tab.h | 10 +- 6 files changed, 266 insertions(+), 213 deletions(-) create mode 100755 Code/parser diff --git a/Code/data.h b/Code/data.h index d2d0b01..02fbcf6 100644 --- a/Code/data.h +++ b/Code/data.h @@ -1,7 +1,7 @@ #ifndef STRUCT_H #define STRUCT_H - +#include <stdbool.h> //璇硶鏍戠粨鏋� typedef struct Tree_node_t { @@ -88,10 +88,12 @@ typedef struct Symbol_Node_t { struct Symbol_Node_t * scope_prev, * scope_next; }Symbol_Node_t; +extern struct Info_Node_Ops * nodeop; + struct SymbolInfoList_t { Symbol_Node_t head,tail; - + int list_cnt; //鍦╨ist閾捐〃鑺傜偣cur涔嬪悗鎻掑叆鏂拌妭鐐筺ew !!!娉ㄦ剰鎻掑叆鑺傜偣鍓嶈鍏坢alloc涓€涓妭鐐� //鍦╨ist閾捐〃涓垹闄ur鑺傜偣, !!!娉ㄦ剰锛氬垹闄よ妭鐐规椂鍊欎笉free锛屽湪stack涓璸op鐨勬椂鍊檉ree; }; @@ -106,9 +108,10 @@ typedef struct SymbolTable_t { //Api Symbol_Node_t * (* node_alloc)(); - void (*init)(int); //鍒濆鍖栧搱甯岃〃 + void (*init)(int); //鍒濆鍖栧搱甯岃〃 void (*insert)(Symbol_Node_t *); //鎻掑叆鑺傜偣 void (*remove)(Symbol_Node_t *); //鍒犻櫎鑺傜偣 + Symbol_Node_t * (*find)(char *); //鏌ヨ鍏冪礌锛岃繑鍥瀟rue锛屾壘鍒帮紝false娌℃湁鎵惧埌 }SymbolTable_t; diff --git a/Code/lex.yy.c b/Code/lex.yy.c index 94b77ff..c8e8b39 100644 --- a/Code/lex.yy.c +++ b/Code/lex.yy.c @@ -1,6 +1,6 @@ -#line 1 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lex.yy.c" +#line 1 "./lex.yy.c" -#line 3 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lex.yy.c" +#line 3 "./lex.yy.c" #define YY_INT_ALIGNED short int @@ -523,8 +523,8 @@ int yy_flex_debug = 0; #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *yytext; -#line 1 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" -#line 2 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 1 "./lexical.l" +#line 2 "./lexical.l" #include <stdio.h> #include "debug.h" #include "syntax.tab.h" @@ -535,8 +535,8 @@ char *yytext; extern int syntax; int last_lineno = 0,cur_lineno = 0; static Node_t* add_node_text(char * content,char *text,int len); -#line 538 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lex.yy.c" -#line 539 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lex.yy.c" +#line 538 "./lex.yy.c" +#line 539 "./lex.yy.c" #define INITIAL 0 @@ -753,9 +753,9 @@ YY_DECL } { -#line 44 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 44 "./lexical.l" -#line 758 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lex.yy.c" +#line 758 "./lex.yy.c" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -814,163 +814,163 @@ do_action: /* This label is used only to access EOF actions. */ case 1: YY_RULE_SETUP -#line 45 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 45 "./lexical.l" { ELEMENT("STRUCT"); return STRUCT; } YY_BREAK case 2: YY_RULE_SETUP -#line 46 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 46 "./lexical.l" { ELEMENT("RETURN"); return RETURN; } YY_BREAK case 3: YY_RULE_SETUP -#line 47 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 47 "./lexical.l" { ELEMENT("IF"); return IF; } YY_BREAK case 4: YY_RULE_SETUP -#line 48 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 48 "./lexical.l" { ELEMENT("ELSE"); return ELSE; } YY_BREAK case 5: YY_RULE_SETUP -#line 49 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 49 "./lexical.l" { ELEMENT("WHILE"); return WHILE; } YY_BREAK case 6: YY_RULE_SETUP -#line 50 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 50 "./lexical.l" { ELEMENT("TYPE"); return TYPE; } YY_BREAK case 7: YY_RULE_SETUP -#line 51 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 51 "./lexical.l" { ELEMENT("INT"); return INT;} YY_BREAK case 8: YY_RULE_SETUP -#line 52 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 52 "./lexical.l" { ELEMENT("FLOAT"); return FLOAT;} YY_BREAK case 9: YY_RULE_SETUP -#line 53 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 53 "./lexical.l" { ELEMENT("ID"); return ID; } YY_BREAK case 10: YY_RULE_SETUP -#line 54 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 54 "./lexical.l" { ELEMENT("SEMI"); return SEMI;} YY_BREAK case 11: YY_RULE_SETUP -#line 55 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 55 "./lexical.l" { ELEMENT("COMMA"); return COMMA;} YY_BREAK case 12: YY_RULE_SETUP -#line 56 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 56 "./lexical.l" { ELEMENT("ASSIGNOP"); return ASSIGNOP;} YY_BREAK case 13: YY_RULE_SETUP -#line 57 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 57 "./lexical.l" { ELEMENT("RELOP"); return RELOP;} YY_BREAK case 14: YY_RULE_SETUP -#line 58 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 58 "./lexical.l" { ELEMENT("PLUS"); return PLUS;} YY_BREAK case 15: YY_RULE_SETUP -#line 59 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 59 "./lexical.l" { ELEMENT("MINUS"); return MINUS;} YY_BREAK case 16: YY_RULE_SETUP -#line 60 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 60 "./lexical.l" { ELEMENT("STAR"); return STAR;} YY_BREAK case 17: YY_RULE_SETUP -#line 61 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 61 "./lexical.l" { ELEMENT("DIV"); return DIV;} YY_BREAK case 18: YY_RULE_SETUP -#line 62 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 62 "./lexical.l" { ELEMENT("AND"); return AND;} YY_BREAK case 19: YY_RULE_SETUP -#line 63 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 63 "./lexical.l" { ELEMENT("OR"); return OR;} YY_BREAK case 20: YY_RULE_SETUP -#line 64 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 64 "./lexical.l" { ELEMENT("DOT"); return DOT;} YY_BREAK case 21: YY_RULE_SETUP -#line 65 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 65 "./lexical.l" { ELEMENT("NOT"); return NOT;} YY_BREAK case 22: YY_RULE_SETUP -#line 66 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 66 "./lexical.l" { ELEMENT("LP"); return LP;} YY_BREAK case 23: YY_RULE_SETUP -#line 67 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 67 "./lexical.l" { ELEMENT("RP"); return RP;} YY_BREAK case 24: YY_RULE_SETUP -#line 68 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 68 "./lexical.l" { ELEMENT("LB"); return LB;} YY_BREAK case 25: YY_RULE_SETUP -#line 69 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 69 "./lexical.l" { ELEMENT("RB"); return RB;} YY_BREAK case 26: YY_RULE_SETUP -#line 70 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 70 "./lexical.l" { ELEMENT("LC"); return LC;} YY_BREAK case 27: YY_RULE_SETUP -#line 71 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 71 "./lexical.l" { ELEMENT("RC"); return RC;} YY_BREAK case 28: YY_RULE_SETUP -#line 72 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 72 "./lexical.l" { strcat(linetext," ");} YY_BREAK case 29: YY_RULE_SETUP -#line 73 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 73 "./lexical.l" { yycolumn += 3; strcat(linetext,"\t");} YY_BREAK case 30: /* rule 30 can match eol */ YY_RULE_SETUP -#line 74 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 74 "./lexical.l" { yycolumn = 1; yylineno += 1; memset(linetext,0,sizeof(linetext)); } YY_BREAK case 31: YY_RULE_SETUP -#line 75 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 75 "./lexical.l" { char c = input(); while(c != '\n') { c = input(); } yylineno += 1; } YY_BREAK case 32: YY_RULE_SETUP -#line 76 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 76 "./lexical.l" { char c1 = input(),c2 = input(); if (c1 == '\n') { @@ -993,15 +993,15 @@ YY_RULE_SETUP YY_BREAK case 33: YY_RULE_SETUP -#line 95 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 95 "./lexical.l" { LexicalError("%s",yytext); syntax++; } YY_BREAK case 34: YY_RULE_SETUP -#line 97 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 97 "./lexical.l" ECHO; YY_BREAK -#line 1004 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lex.yy.c" +#line 1004 "./lex.yy.c" case YY_STATE_EOF(INITIAL): yyterminate(); @@ -2006,7 +2006,7 @@ void yyfree (void * ptr ) #define YYTABLES_NAME "yytables" -#line 97 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l" +#line 97 "./lexical.l" extern int syntax; diff --git a/Code/parser b/Code/parser new file mode 100755 index 0000000000000000000000000000000000000000..e525621f021f4732c78f3cf8e4c2c168c1134983 GIT binary patch literal 60008 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 BB7Oh> literal 0 HcmV?d00001 diff --git a/Code/symbol.c b/Code/symbol.c index ee2ba00..4388f0e 100644 --- a/Code/symbol.c +++ b/Code/symbol.c @@ -11,20 +11,35 @@ typedef SymbolInfoList_t list_t; typedef struct SymbolStack_ele_t stack_ele_t; //閮藉簲璇ヤ娇鐢╯tatic + static void node_init(); static void node_delete(void * cur,int mode); +static bool node_equal(unit_t*,unit_t*); + +static struct Info_Node_Ops { + void (*init)(); + void (*delete)(void *,int); + bool (*equal)(unit_t*,unit_t*); +}InfoNodeOp = { + .init = node_init, + .delete = node_delete, + .equal = node_equal, +}; + +struct Info_Node_Ops * nodeop = &InfoNodeOp; + static void SymbolInfoList_insert(list_t * list,unit_t * cur,unit_t * new); static void SymbolInfoList_remove(list_t * list,unit_t * cur); static void SymbolInfoList_init(list_t * list); -static unit_t * SymbolInfoList_find(unit_t * cur); +static unit_t * SymbolInfoList_find(list_t * list,char * name); static list_t * SymbolInfoList_alloc(); static struct Hash_List_Ops { void (*insert)(list_t * list,unit_t * cur,unit_t * new); //鍦╨ist閾捐〃鑺傜偣cur涔嬪悗鎻掑叆鏂拌妭鐐筺ew !!!娉ㄦ剰鎻掑叆鑺傜偣鍓嶈鍏坢alloc涓€涓妭鐐� void (*remove)(list_t * list,unit_t * cur); //鍦╨ist閾捐〃涓垹闄ur鑺傜偣, !!!娉ㄦ剰锛氬垹闄よ妭鐐规椂鍊欎笉free锛屽湪stack涓璸op鐨勬椂鍊檉ree; void (*init)(list_t * list); //鍒濆鍖� - unit_t * (* find)(unit_t * cur); + unit_t * (* find)(list_t * list,char * name); list_t * (*alloc)(); }listop = { .insert = SymbolInfoList_insert, @@ -38,10 +53,11 @@ static struct Hash_List_Ops { //hash table list 鎺ュ彛 -static void SymbolTable_init(int size); static unit_t * SymbolTable_node_alloc(); +static void SymbolTable_init(int size); static void SymbolTable_insert(unit_t * cur); static void SymbolTable_remove(unit_t * cur); +static unit_t * SymbolTable_find(char *); //SymbolTable API @@ -59,6 +75,7 @@ MODULE_DEF(SymbolTable_t,symbol_table) = { .init = SymbolTable_init, .insert = SymbolTable_insert, .remove = SymbolTable_remove, + .find = SymbolTable_find, }; @@ -131,6 +148,16 @@ static void SymbolTable_remove(unit_t * cur) { }//璇存槑瑙佹渶鍚庯紝杩欓噷涓峟ree //Symbol Table +static unit_t * SymbolTable_find(char * name) { + int id = symbol_table->hash(name); + list_t * list = symbol_table->table[id]; + if(list == NULL) { + return NULL; + } else { + return listop.find(list,name); + } +} + /* * 鍦╯tack涓紝unit_t *鐨勬寚閽堜綔鐢� @@ -207,7 +234,6 @@ static stack_ele_t * SymbolStack_top() { } else { Log("The Symbol Stack is empty!"); assert(0); - return NULL; } } //Symbol Stack @@ -215,13 +241,22 @@ static stack_ele_t * SymbolStack_top() { //Symbol List static void SymbolInfoList_insert(list_t * list,unit_t * cur,unit_t * new) { - unit_t * next = cur->hash_next, * prev = cur->hash_prev; - prev->hash_next = next; - next->hash_prev = prev; + unit_t * next = cur->hash_next; + cur->hash_next = new; + new->hash_next = next; + next->hash_prev = new; + new->hash_prev = cur; + list->list_cnt++; } static void SymbolInfoList_init(list_t * list) { + list->list_cnt = 0; + list->head.hash_next = &list->tail; + list->tail.hash_prev = &list->head; + + list->head.hash_prev = list->tail.hash_next = NULL; + list->head.type = list->tail.type = HASHLIST; } static void SymbolInfoList_remove(list_t * list,unit_t * cur) { @@ -229,9 +264,10 @@ static void SymbolInfoList_remove(list_t * list,unit_t * cur) { assert(prev != NULL && next != NULL); prev->hash_next = next; next->hash_prev = prev; + list->list_cnt++; } -static unit_t * SymbolInfoList_find(unit_t * cur) { +static unit_t * SymbolInfoList_find(list_t * list,char * name) { } @@ -241,6 +277,20 @@ static list_t * SymbolInfoList_alloc() { //Symbol List +//Symbol Info node ops +static void node_init() { + +} + +static void node_delete(void * cur,int mode) { + +} + +static bool node_equal(unit_t* n1,unit_t* n2) { + +} +//Symbol Info node + /* 姣忔鍚戞暎鍒楄〃涓彃鍏ュ厓绱犳椂锛屾€绘槸灏嗘柊鎻掑叆鐨勫厓绱犳斁鍒拌妲戒笅鎸傜殑閾捐〃浠ュ強璇ュ眰 鎵€瀵瑰簲鐨勯摼琛ㄧ殑琛ㄥご銆傛瘡娆℃煡琛ㄦ椂濡傛灉瀹氫綅鍒版煇涓Ы锛屽垯鎸夐『搴忛亶鍘嗚繖涓Ы涓嬫寕鐨勯摼琛ㄥ苟杩斿洖 diff --git a/Code/syntax.tab.c b/Code/syntax.tab.c index 0c611a8..0fc737b 100644 --- a/Code/syntax.tab.c +++ b/Code/syntax.tab.c @@ -67,7 +67,7 @@ /* First part of user prologue. */ -#line 3 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 3 "./syntax.y" int yycolumn = 1; char linetext[128]; @@ -78,7 +78,7 @@ yycolumn += yyleng; //#define YYDEBUG 1 //int yydebug = 1; -#line 15 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 15 "./syntax.y" #include <stdio.h> #include "lex.yy.c" @@ -93,7 +93,7 @@ extern int syntax; -#line 97 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 97 "./syntax.tab.c" # ifndef YY_CAST # ifdef __cplusplus @@ -1364,451 +1364,451 @@ yyreduce: switch (yyn) { case 2: /* Program: ExtDefList */ -#line 107 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 107 "./syntax.y" { tree->root = (yyval.node) = Operator((yyval.node),"Program",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1370 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1370 "./syntax.tab.c" break; case 3: /* ExtDefList: ExtDef ExtDefList */ -#line 109 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 109 "./syntax.y" { (yyval.node) = Operator((yyval.node),"ExtDefList",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1376 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1376 "./syntax.tab.c" break; case 4: /* ExtDefList: %empty */ -#line 110 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 110 "./syntax.y" { (yyval.node) = NULL; } -#line 1382 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1382 "./syntax.tab.c" break; case 5: /* ExtDef: Specifier ExtDecList SEMI */ -#line 112 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 112 "./syntax.y" { (yyval.node) = Operator((yyval.node),"ExtDef",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1388 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1388 "./syntax.tab.c" break; case 6: /* ExtDef: Specifier SEMI */ -#line 113 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 113 "./syntax.y" { (yyval.node) = Operator((yyval.node),"ExtDef",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1394 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1394 "./syntax.tab.c" break; case 7: /* ExtDef: Specifier FunDec CompSt */ -#line 114 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 114 "./syntax.y" { (yyval.node) = Operator((yyval.node),"ExtDef",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1400 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1400 "./syntax.tab.c" break; case 8: /* ExtDef: error SEMI */ -#line 115 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 115 "./syntax.y" { (yyval.node) = NULL;yyerror("ExtDef"); } -#line 1406 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1406 "./syntax.tab.c" break; case 9: /* ExtDef: Specifier error */ -#line 116 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 116 "./syntax.y" { (yyval.node) = NULL;yyerror("ExtDef,missing ;"); } -#line 1412 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1412 "./syntax.tab.c" break; case 10: /* ExtDef: Specifier error SEMI */ -#line 117 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 117 "./syntax.y" { (yyval.node) = NULL;yyerror("ExtDef"); } -#line 1418 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1418 "./syntax.tab.c" break; case 11: /* ExtDef: Specifier error CompSt */ -#line 118 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 118 "./syntax.y" { (yyval.node) = NULL;yyerror("ExtDef"); } -#line 1424 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1424 "./syntax.tab.c" break; case 12: /* ExtDecList: VarDec */ -#line 120 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 120 "./syntax.y" { (yyval.node) = Operator((yyval.node),"ExtDecList",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1430 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1430 "./syntax.tab.c" break; case 13: /* ExtDecList: VarDec COMMA ExtDecList */ -#line 121 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 121 "./syntax.y" { (yyval.node) = Operator((yyval.node),"ExtDecList",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1436 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1436 "./syntax.tab.c" break; case 14: /* Specifier: TYPE */ -#line 126 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 126 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Specifier",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1442 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1442 "./syntax.tab.c" break; case 15: /* Specifier: StructSpecifier */ -#line 127 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 127 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Specifier",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1448 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1448 "./syntax.tab.c" break; case 16: /* StructSpecifier: STRUCT OptTag LC DefList RC */ -#line 129 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 129 "./syntax.y" { (yyval.node) = Operator((yyval.node),"StructSpecifier",(yyloc).first_line,5,(yyvsp[-4].node),(yyvsp[-3].node),(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1454 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1454 "./syntax.tab.c" break; case 17: /* StructSpecifier: STRUCT Tag */ -#line 130 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 130 "./syntax.y" { (yyval.node) = Operator((yyval.node),"StructSpecifier",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1460 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1460 "./syntax.tab.c" break; case 18: /* OptTag: ID */ -#line 132 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 132 "./syntax.y" { (yyval.node) = Operator((yyval.node),"OptTag",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1466 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1466 "./syntax.tab.c" break; case 19: /* OptTag: %empty */ -#line 133 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 133 "./syntax.y" { (yyval.node) = NULL; } -#line 1472 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1472 "./syntax.tab.c" break; case 20: /* Tag: ID */ -#line 135 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 135 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Tag",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1478 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1478 "./syntax.tab.c" break; case 21: /* VarDec: ID */ -#line 139 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 139 "./syntax.y" { (yyval.node) = Operator((yyval.node),"VarDec",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1484 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1484 "./syntax.tab.c" break; case 22: /* VarDec: VarDec LB INT RB */ -#line 140 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 140 "./syntax.y" { (yyval.node) = Operator((yyval.node),"VarDec",(yyloc).first_line,4,(yyvsp[-3].node),(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1490 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1490 "./syntax.tab.c" break; case 23: /* VarDec: VarDec LB error RB */ -#line 141 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 141 "./syntax.y" { (yyval.node) = NULL; yyerror("VarDec"); } -#line 1496 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1496 "./syntax.tab.c" break; case 24: /* FunDec: ID LP VarList RP */ -#line 143 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 143 "./syntax.y" { (yyval.node) = Operator((yyval.node),"FunDec",(yyloc).first_line,4,(yyvsp[-3].node),(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1502 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1502 "./syntax.tab.c" break; case 25: /* FunDec: ID LP RP */ -#line 144 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 144 "./syntax.y" { (yyval.node) = Operator((yyval.node),"FunDec",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1508 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1508 "./syntax.tab.c" break; case 26: /* FunDec: ID LP error RP */ -#line 145 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 145 "./syntax.y" { (yyval.node) = NULL; yyerror("FunDec"); } -#line 1514 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1514 "./syntax.tab.c" break; case 27: /* FunDec: error LP VarList RP */ -#line 146 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 146 "./syntax.y" { (yyval.node) = NULL; yyerror("FunDec"); } -#line 1520 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1520 "./syntax.tab.c" break; case 28: /* VarList: ParamDec COMMA VarList */ -#line 148 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 148 "./syntax.y" { (yyval.node) = Operator((yyval.node),"VarList",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1526 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1526 "./syntax.tab.c" break; case 29: /* VarList: ParamDec */ -#line 149 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 149 "./syntax.y" { (yyval.node) = Operator((yyval.node),"VarList",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1532 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1532 "./syntax.tab.c" break; case 30: /* ParamDec: Specifier VarDec */ -#line 151 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 151 "./syntax.y" { (yyval.node) = Operator((yyval.node),"ParamDec",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1538 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1538 "./syntax.tab.c" break; case 31: /* CompSt: LC DefList StmtList RC */ -#line 156 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 156 "./syntax.y" { (yyval.node) = Operator((yyval.node),"CompSt",(yyloc).first_line,4,(yyvsp[-3].node),(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1544 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1544 "./syntax.tab.c" break; case 32: /* CompSt: LC DefList error RC */ -#line 157 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 157 "./syntax.y" { (yyval.node) = NULL; yyerror("CompSt"); } -#line 1550 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1550 "./syntax.tab.c" break; case 33: /* StmtList: Stmt StmtList */ -#line 159 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 159 "./syntax.y" { (yyval.node) = Operator((yyval.node),"StmtList",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1556 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1556 "./syntax.tab.c" break; case 34: /* StmtList: %empty */ -#line 160 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 160 "./syntax.y" { (yyval.node) = NULL; } -#line 1562 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1562 "./syntax.tab.c" break; case 35: /* Stmt: Exp SEMI */ -#line 162 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 162 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Stmt",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1568 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1568 "./syntax.tab.c" break; case 36: /* Stmt: CompSt */ -#line 163 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 163 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Stmt",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1574 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1574 "./syntax.tab.c" break; case 37: /* Stmt: RETURN Exp SEMI */ -#line 164 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 164 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Stmt",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1580 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1580 "./syntax.tab.c" break; case 38: /* Stmt: IF LP Exp RP Stmt */ -#line 165 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 165 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Stmt",(yyloc).first_line,5,(yyvsp[-4].node),(yyvsp[-3].node),(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1586 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1586 "./syntax.tab.c" break; case 39: /* Stmt: IF LP Exp RP Stmt ELSE Stmt */ -#line 166 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 166 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Stmt",(yyloc).first_line,7,(yyvsp[-6].node),(yyvsp[-5].node),(yyvsp[-4].node),(yyvsp[-3].node),(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1592 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1592 "./syntax.tab.c" break; case 40: /* Stmt: WHILE LP Exp RP Stmt */ -#line 167 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 167 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Stmt",(yyloc).first_line,5,(yyvsp[-4].node),(yyvsp[-3].node),(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1598 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1598 "./syntax.tab.c" break; case 41: /* Stmt: error SEMI */ -#line 168 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 168 "./syntax.y" { (yyval.node) = NULL; yyerror("1Stmt"); } -#line 1604 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1604 "./syntax.tab.c" break; case 42: /* Stmt: Exp error */ -#line 169 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 169 "./syntax.y" { (yyval.node) = NULL; yyerror("2Stmt"); } -#line 1610 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1610 "./syntax.tab.c" break; case 43: /* Stmt: IF LP Exp error RP Stmt */ -#line 170 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 170 "./syntax.y" { (yyval.node) = NULL; yyerror("3Stmt"); } -#line 1616 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1616 "./syntax.tab.c" break; case 44: /* Stmt: RETURN error SEMI */ -#line 171 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 171 "./syntax.y" { (yyval.node) = NULL; yyerror("4Stmt"); } -#line 1622 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1622 "./syntax.tab.c" break; case 45: /* Stmt: RETURN Exp error */ -#line 172 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 172 "./syntax.y" { (yyval.node) = NULL; yyerror("5Stmt"); } -#line 1628 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1628 "./syntax.tab.c" break; case 46: /* DefList: Def DefList */ -#line 177 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 177 "./syntax.y" { (yyval.node) = Operator((yyval.node),"DefList",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1634 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1634 "./syntax.tab.c" break; case 47: /* DefList: %empty */ -#line 178 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 178 "./syntax.y" { (yyval.node) = NULL; } -#line 1640 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1640 "./syntax.tab.c" break; case 48: /* Def: Specifier DecList SEMI */ -#line 180 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 180 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Def",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1646 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1646 "./syntax.tab.c" break; case 49: /* Def: Specifier error SEMI */ -#line 181 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 181 "./syntax.y" { (yyval.node) = NULL; yyerror("Def"); } -#line 1652 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1652 "./syntax.tab.c" break; case 50: /* Def: Specifier DecList error SEMI */ -#line 182 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 182 "./syntax.y" { (yyval.node) = NULL; yyerror("Def"); } -#line 1658 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1658 "./syntax.tab.c" break; case 51: /* DecList: Dec */ -#line 184 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 184 "./syntax.y" { (yyval.node) = Operator((yyval.node),"DecList",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1664 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1664 "./syntax.tab.c" break; case 52: /* DecList: Dec COMMA DecList */ -#line 185 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 185 "./syntax.y" { (yyval.node) = Operator((yyval.node),"DecList",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1670 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1670 "./syntax.tab.c" break; case 53: /* Dec: VarDec */ -#line 187 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 187 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Dec",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1676 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1676 "./syntax.tab.c" break; case 54: /* Dec: VarDec ASSIGNOP Exp */ -#line 188 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 188 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Dec",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1682 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1682 "./syntax.tab.c" break; case 55: /* Exp: Exp ASSIGNOP Exp */ -#line 193 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 193 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1688 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1688 "./syntax.tab.c" break; case 56: /* Exp: Exp AND Exp */ -#line 194 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 194 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1694 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1694 "./syntax.tab.c" break; case 57: /* Exp: Exp OR Exp */ -#line 195 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 195 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1700 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1700 "./syntax.tab.c" break; case 58: /* Exp: Exp RELOP Exp */ -#line 196 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 196 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1706 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1706 "./syntax.tab.c" break; case 59: /* Exp: Exp PLUS Exp */ -#line 197 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 197 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1712 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1712 "./syntax.tab.c" break; case 60: /* Exp: Exp MINUS Exp */ -#line 198 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 198 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1718 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1718 "./syntax.tab.c" break; case 61: /* Exp: Exp STAR Exp */ -#line 199 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 199 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1724 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1724 "./syntax.tab.c" break; case 62: /* Exp: Exp DIV Exp */ -#line 200 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 200 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1730 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1730 "./syntax.tab.c" break; case 63: /* Exp: LP Exp RP */ -#line 201 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 201 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1736 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1736 "./syntax.tab.c" break; case 64: /* Exp: MINUS Exp */ -#line 202 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 202 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1742 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1742 "./syntax.tab.c" break; case 65: /* Exp: NOT Exp */ -#line 203 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 203 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1748 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1748 "./syntax.tab.c" break; case 66: /* Exp: ID LP Args RP */ -#line 204 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 204 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,4,(yyvsp[-3].node),(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1754 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1754 "./syntax.tab.c" break; case 67: /* Exp: ID LP RP */ -#line 205 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 205 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1760 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1760 "./syntax.tab.c" break; case 68: /* Exp: Exp LB Exp RB */ -#line 206 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 206 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,4,(yyvsp[-3].node),(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1766 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1766 "./syntax.tab.c" break; case 69: /* Exp: Exp DOT ID */ -#line 207 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 207 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1772 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1772 "./syntax.tab.c" break; case 70: /* Exp: ID */ -#line 208 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 208 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1778 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1778 "./syntax.tab.c" break; case 71: /* Exp: INT */ -#line 209 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 209 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1784 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1784 "./syntax.tab.c" break; case 72: /* Exp: FLOAT */ -#line 210 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 210 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1790 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1790 "./syntax.tab.c" break; case 73: /* Args: Exp COMMA Args */ -#line 212 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 212 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Args",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1796 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1796 "./syntax.tab.c" break; case 74: /* Args: Exp */ -#line 213 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 213 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Args",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1802 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1802 "./syntax.tab.c" break; case 75: /* Args: error Args */ -#line 214 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 214 "./syntax.y" { (yyval.node) = NULL; yyerror("Wrong Args"); } -#line 1808 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1808 "./syntax.tab.c" break; -#line 1812 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c" +#line 1812 "./syntax.tab.c" default: break; } @@ -2006,7 +2006,7 @@ yyreturnlab: return yyresult; } -#line 217 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 217 "./syntax.y" diff --git a/Code/syntax.tab.h b/Code/syntax.tab.h index 2886c8e..6c3c38e 100644 --- a/Code/syntax.tab.h +++ b/Code/syntax.tab.h @@ -35,8 +35,8 @@ especially those whose name start with YY_ or yy_. They are private implementation details that can be changed or removed. */ -#ifndef YY_YY_HOME_PPX_ZHAOCHAOYI_COMPILER_LAB2_CODE_SYNTAX_TAB_H_INCLUDED -# define YY_YY_HOME_PPX_ZHAOCHAOYI_COMPILER_LAB2_CODE_SYNTAX_TAB_H_INCLUDED +#ifndef YY_YY_SYNTAX_TAB_H_INCLUDED +# define YY_YY_SYNTAX_TAB_H_INCLUDED /* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 0 @@ -91,11 +91,11 @@ extern int yydebug; #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED union YYSTYPE { -#line 31 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y" +#line 31 "./syntax.y" struct Tree_node_t * node; -#line 99 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.h" +#line 99 "./syntax.tab.h" }; typedef union YYSTYPE YYSTYPE; @@ -124,4 +124,4 @@ extern YYLTYPE yylloc; int yyparse (void); -#endif /* !YY_YY_HOME_PPX_ZHAOCHAOYI_COMPILER_LAB2_CODE_SYNTAX_TAB_H_INCLUDED */ +#endif /* !YY_YY_SYNTAX_TAB_H_INCLUDED */ -- GitLab