diff --git a/Code/data.c b/Code/data.c
index f2c7cf6f6a0b47212e7fb31f779071d6656e0892..23fb292b56a487cc6f339bf00cf1d22ee8daa3d4 100644
--- a/Code/data.c
+++ b/Code/data.c
@@ -1,7 +1,3 @@
-#include <malloc.h>
-#include <assert.h>
-#include <string.h>
-#include <stdarg.h>
 #include <stdlib.h>
 #include "data.h"
 #include "debug.h"
@@ -95,16 +91,17 @@ void MultiwayTree_insert_all(Node_t* cur,int argc,Node_t* childs[]) {
     }
 }//娉ㄦ剰锛宎rgc涓篶hilds鏁扮粍鍙傛暟鐨勬暟閲忥紝鍚屾椂娉ㄦ剰鍙彉鍙傛暟鐨勬暟閲�
 
-extern MultiwayTree_t * tree;
+
 MultiwayTree_t Multiwaytree = {
-    .init = MultiwayTree_init,
-    .lminsert = MultiwayTree_leftmostinsert,
-    .rminsert = MultiwayTree_rightmostinsert,
-    .Node_alloc = MultiwayTree_Node_alloc,
-    .remove = MultiwayTree_remove,
-    .traverse = MultiwayTree_Traverse,
-    .insert_all = MultiwayTree_insert_all,
+        .init = MultiwayTree_init,
+        .lminsert = MultiwayTree_leftmostinsert,
+        .rminsert = MultiwayTree_rightmostinsert,
+        .Node_alloc = MultiwayTree_Node_alloc,
+        .remove = MultiwayTree_remove,
+        .traverse = MultiwayTree_Traverse,
+        .insert_all = MultiwayTree_insert_all,
 };
+
 MultiwayTree_t * tree = &Multiwaytree;
 
 Node_t * Operator(Node_t * cur,char * content,int line,int argc,...) {
diff --git a/Code/data.h b/Code/data.h
index 02fbcf60cc17d000df00ba0b7a58749ad4f6e1c6..c7890211fd61d59d63378cd21abf50b6bbcbe16e 100644
--- a/Code/data.h
+++ b/Code/data.h
@@ -2,6 +2,11 @@
 #define STRUCT_H
 
 #include <stdbool.h>
+#include <malloc.h>
+#include <assert.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stdio.h>
 //璇硶鏍戠粨鏋�
 
 typedef struct Tree_node_t {
@@ -75,13 +80,14 @@ typedef struct SymbolInfoList_t SymbolInfoList_t;
 //鍝堝笇琛ㄧ敤鍒扮殑缁撴瀯
 typedef struct Symbol_Node_t {
     char *  name;
-    FieldList field;
     int deep;
     enum {
         HASHLIST,STACKLIST,STACKNODE,INFONODE,
     }type;
+    FieldList field;
     //绫诲瀷寰呭鐞嗭紝鍒楀嚭鐨勪负淇濈暀灞炴€э紝涓嶅厑璁镐娇鐢紝鐢ㄤ綔head锛宼ail锛宭ast,first绛夊睘鎬�
-    SymbolInfoList_t * list; //鍦╤ash table涓瘡涓猻lot涓殑姣忎釜鑺傜偣鎵€浠ュ湪list
+
+    //SymbolInfoList_t * list; //鍦╤ash table涓瘡涓猻lot涓殑姣忎釜鑺傜偣鎵€鍦╨ist
 
     //缁存姢鏁版嵁缁撴瀯闇€瑕佺殑淇℃伅
     struct Symbol_Node_t * hash_prev, * hash_next;
@@ -141,6 +147,7 @@ typedef struct SymbolStack_t {
     void (*init)();                             //鍒濆鍖栨爤
     void (*push)(SymbolStack_ele_t * );         //鍦╬ush鍓嶅簲璋冪敤stack鐨刵ode_alloc鏉ュ垎閰嶆爤涓殑鑺傜偣
     void (*pop)();                              //鍦╬op鏃秄ree鎺夋墍鏈夎繖涓€灞備綔鐢ㄥ煙鐢宠鐨勮妭鐐�
+    bool (*empty)();
     SymbolStack_ele_t * (*top)();
 }SymbolStack_t;
 
diff --git a/Code/debug.h b/Code/debug.h
index 3ab58753309deddb0de83b3ea8a6079bfb0df2e3..dd27c789994bf1ee1b3f52250370a261e92576ee 100644
--- a/Code/debug.h
+++ b/Code/debug.h
@@ -41,5 +41,13 @@
     #define Treedebug(format, ...) {;}
 #endif
 
+#define panic_on(A,expr)        \
+            do {                \
+                Log(A);         \
+                assert(0);      \
+            } while(1)
+
+
+#define panic(A) panic_on(A,0)
 
 #endif
\ No newline at end of file
diff --git a/Code/lex.yy.c b/Code/lex.yy.c
index c8e8b398718e392fe97820e88c2493892448858c..94b77ff733867140565b2c5f5655bdbe3119859c 100644
--- a/Code/lex.yy.c
+++ b/Code/lex.yy.c
@@ -1,6 +1,6 @@
-#line 1 "./lex.yy.c"
+#line 1 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lex.yy.c"
 
-#line 3 "./lex.yy.c"
+#line 3 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/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 "./lexical.l"
-#line 2 "./lexical.l"
+#line 1 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
+#line 2 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/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 "./lex.yy.c"
-#line 539 "./lex.yy.c"
+#line 538 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lex.yy.c"
+#line 539 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lex.yy.c"
 
 #define INITIAL 0
 
@@ -753,9 +753,9 @@ YY_DECL
 		}
 
 	{
-#line 44 "./lexical.l"
+#line 44 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 
-#line 758 "./lex.yy.c"
+#line 758 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/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 "./lexical.l"
+#line 45 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { ELEMENT("STRUCT"); return STRUCT; }
 	YY_BREAK
 case 2:
 YY_RULE_SETUP
-#line 46 "./lexical.l"
+#line 46 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { ELEMENT("RETURN"); return RETURN; }
 	YY_BREAK
 case 3:
 YY_RULE_SETUP
-#line 47 "./lexical.l"
+#line 47 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { ELEMENT("IF"); return IF; }
 	YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 48 "./lexical.l"
+#line 48 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { ELEMENT("ELSE"); return ELSE; }
 	YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 49 "./lexical.l"
+#line 49 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { ELEMENT("WHILE"); return WHILE; }
 	YY_BREAK
 case 6:
 YY_RULE_SETUP
-#line 50 "./lexical.l"
+#line 50 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { ELEMENT("TYPE"); return TYPE; }
 	YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 51 "./lexical.l"
+#line 51 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { ELEMENT("INT"); return INT;}
 	YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 52 "./lexical.l"
+#line 52 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { ELEMENT("FLOAT"); return FLOAT;}
 	YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 53 "./lexical.l"
+#line 53 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { ELEMENT("ID"); return ID; }
 	YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 54 "./lexical.l"
+#line 54 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { ELEMENT("SEMI"); return SEMI;}
 	YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 55 "./lexical.l"
+#line 55 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { ELEMENT("COMMA"); return COMMA;}
 	YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 56 "./lexical.l"
+#line 56 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { ELEMENT("ASSIGNOP"); return ASSIGNOP;}
 	YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 57 "./lexical.l"
+#line 57 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { ELEMENT("RELOP"); return RELOP;}
 	YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 58 "./lexical.l"
+#line 58 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { ELEMENT("PLUS"); return PLUS;}
 	YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 59 "./lexical.l"
+#line 59 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { ELEMENT("MINUS"); return MINUS;}
 	YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 60 "./lexical.l"
+#line 60 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { ELEMENT("STAR"); return STAR;}
 	YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 61 "./lexical.l"
+#line 61 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { ELEMENT("DIV"); return DIV;}
 	YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 62 "./lexical.l"
+#line 62 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { ELEMENT("AND"); return AND;}
 	YY_BREAK
 case 19:
 YY_RULE_SETUP
-#line 63 "./lexical.l"
+#line 63 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { ELEMENT("OR"); return OR;}
 	YY_BREAK
 case 20:
 YY_RULE_SETUP
-#line 64 "./lexical.l"
+#line 64 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { ELEMENT("DOT"); return DOT;}
 	YY_BREAK
 case 21:
 YY_RULE_SETUP
-#line 65 "./lexical.l"
+#line 65 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { ELEMENT("NOT"); return NOT;}
 	YY_BREAK
 case 22:
 YY_RULE_SETUP
-#line 66 "./lexical.l"
+#line 66 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { ELEMENT("LP"); return LP;}
 	YY_BREAK
 case 23:
 YY_RULE_SETUP
-#line 67 "./lexical.l"
+#line 67 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { ELEMENT("RP"); return RP;}
 	YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 68 "./lexical.l"
+#line 68 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { ELEMENT("LB"); return LB;}
 	YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 69 "./lexical.l"
+#line 69 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { ELEMENT("RB"); return RB;}
 	YY_BREAK
 case 26:
 YY_RULE_SETUP
-#line 70 "./lexical.l"
+#line 70 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { ELEMENT("LC"); return LC;}
 	YY_BREAK
 case 27:
 YY_RULE_SETUP
-#line 71 "./lexical.l"
+#line 71 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { ELEMENT("RC"); return RC;}
 	YY_BREAK
 case 28:
 YY_RULE_SETUP
-#line 72 "./lexical.l"
+#line 72 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { strcat(linetext," ");}
 	YY_BREAK
 case 29:
 YY_RULE_SETUP
-#line 73 "./lexical.l"
+#line 73 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { yycolumn += 3; strcat(linetext,"\t");}
 	YY_BREAK
 case 30:
 /* rule 30 can match eol */
 YY_RULE_SETUP
-#line 74 "./lexical.l"
+#line 74 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { yycolumn = 1; yylineno += 1; memset(linetext,0,sizeof(linetext)); }
 	YY_BREAK
 case 31:
 YY_RULE_SETUP
-#line 75 "./lexical.l"
+#line 75 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { char c = input(); while(c != '\n') { c = input(); } yylineno += 1; }
 	YY_BREAK
 case 32:
 YY_RULE_SETUP
-#line 76 "./lexical.l"
+#line 76 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/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 "./lexical.l"
+#line 95 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 { LexicalError("%s",yytext); syntax++; }
 	YY_BREAK
 case 34:
 YY_RULE_SETUP
-#line 97 "./lexical.l"
+#line 97 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 ECHO;
 	YY_BREAK
-#line 1004 "./lex.yy.c"
+#line 1004 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lex.yy.c"
 case YY_STATE_EOF(INITIAL):
 	yyterminate();
 
@@ -2006,7 +2006,7 @@ void yyfree (void * ptr )
 
 #define YYTABLES_NAME "yytables"
 
-#line 97 "./lexical.l"
+#line 97 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/lexical.l"
 
 
 extern int syntax;
diff --git a/Code/parser b/Code/parser
index e525621f021f4732c78f3cf8e4c2c168c1134983..b59058d162fa91b3007b8787c2d99a1a2ad8af02 100755
Binary files a/Code/parser and b/Code/parser differ
diff --git a/Code/symbol.c b/Code/symbol.c
index 4388f0e6499c367b9c1bfd578ee085f5125b74e5..b71e7915f1335ea4a903a8b1819487db025e94ff 100644
--- a/Code/symbol.c
+++ b/Code/symbol.c
@@ -1,10 +1,8 @@
-#include <malloc.h>
-#include <stdio.h>
-#include <assert.h>
 #include "data.h"
 #include "debug.h"
 
-#define NONE_INFO_NAME_LENGTH 32
+#define NAME_LENGTH 32
+
 
 typedef Symbol_Node_t unit_t;
 typedef SymbolInfoList_t list_t;
@@ -12,18 +10,18 @@ typedef struct SymbolStack_ele_t stack_ele_t;
 
 //閮藉簲璇ヤ娇鐢╯tatic
 
-static void node_init();
+static void node_init(unit_t * cur,int argc,...);
 static void node_delete(void * cur,int mode);
-static bool node_equal(unit_t*,unit_t*);
+static bool struct_node_equal(unit_t*,unit_t*);
 
 static struct Info_Node_Ops {
-    void (*init)();
+    void (*init)(unit_t * cur,int,...); //argc,char * name,deep,Type
     void (*delete)(void *,int);
     bool (*equal)(unit_t*,unit_t*);
 }InfoNodeOp = {
         .init = node_init,
         .delete = node_delete,
-        .equal = node_equal,
+        .equal = struct_node_equal,
 };
 
 struct Info_Node_Ops * nodeop = &InfoNodeOp;
@@ -32,6 +30,7 @@ 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 void SymbolInfoList_delete(list_t * list);
 static unit_t * SymbolInfoList_find(list_t * list,char * name);
 static list_t * SymbolInfoList_alloc();
 
@@ -39,6 +38,7 @@ 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);                             //鍒濆鍖�
+    void (*delete)(list_t * list);
     unit_t * (* find)(list_t * list,char * name);
     list_t * (*alloc)();
 }listop = {
@@ -48,6 +48,7 @@ static struct Hash_List_Ops {
 
         .find = SymbolInfoList_find,
         .alloc = SymbolInfoList_alloc,
+        .delete = SymbolInfoList_delete,
 };
 
 //hash table list 鎺ュ彛
@@ -66,6 +67,7 @@ static void SymbolStack_init();                     //鍒濆鍖栨爤
 static void SymbolStack_push(stack_ele_t * );     //鍦╬ush鍓嶅簲璋冪敤stack鐨刵ode_alloc鏉ュ垎閰嶆爤涓殑鑺傜偣
 static void SymbolStack_pop();                      //鍦╬op鏃秄ree鎺夋墍鏈夎繖涓€灞備綔鐢ㄥ煙鐢宠鐨勮妭鐐�
 static stack_ele_t * SymbolStack_top();
+static bool SymbolStack_empty();
 
 
 
@@ -86,6 +88,7 @@ MODULE_DEF(SymbolStack_t,symbol_stack) = {
         .push = SymbolStack_push,
         .pop = SymbolStack_pop,
         .top = SymbolStack_top,
+        .empty = SymbolStack_empty,
 };
 
 
@@ -174,17 +177,13 @@ static stack_ele_t * SymbolStack_node_alloc() {
     unit_t * head = &node->head;
     unit_t * tail = &node->tail;
 
+    nodeop->init(head,2,"Stack node head",STACKNODE,symbol_stack->stack_size + 1);
+    nodeop->init(tail,2,"Stack node tail",STACKNODE,symbol_stack->stack_size + 1);
 
     head->hash_prev = head->hash_next = tail->hash_prev = tail->hash_next = NULL;
     head->scope_prev = NULL,tail->scope_next = NULL;
 
-    head->type = tail->type = STACKNODE;
-
-    head->name = malloc(NONE_INFO_NAME_LENGTH),tail->name = malloc(NONE_INFO_NAME_LENGTH);
-    sprintf(head->name,"Stack node deep %d",symbol_stack->stack_size + 1);
-    sprintf(tail->name,"Stack node deep %d",symbol_stack->stack_size + 1);
 
-    head->deep = tail->deep = symbol_stack->stack_size + 1;
 
     head->scope_next = tail;
     tail->scope_prev = head;
@@ -196,11 +195,8 @@ static void SymbolStack_init() {
     symbol_stack->stack_size = 0;
     stack_ele_t * first = &symbol_stack->first;
     stack_ele_t * last = &symbol_stack->last;
-    first->prev = last->next = NULL;
-
-    first->head.type = last->head.type = STACKLIST;
-    first->head.name = "Stack List top",last->head.name = "Stack List down";
 
+    first->prev = last->next = NULL;
     first->next = last;
     last->prev = first;
 }//鍒濆鍖栨爤涓殑涓や釜鑺傜偣
@@ -219,13 +215,13 @@ static void SymbolStack_pop() {
     unit_t * cur = top->head.scope_next, * temp;
     while (cur != &top->tail) {
         temp = cur->scope_next;
-        node_delete(cur,INFONODE);
+        nodeop->delete(cur,INFONODE);
         cur = temp;
     }
     stack_ele_t * head = &symbol_stack->first, * next = top->next;
     head->next = next;
     next->prev = head;
-    node_delete(top,STACKNODE);
+    nodeop->delete(top,STACKNODE);
 }
 
 static stack_ele_t * SymbolStack_top() {
@@ -236,6 +232,11 @@ static stack_ele_t * SymbolStack_top() {
         assert(0);
     }
 }
+
+static bool SymbolStack_empty() {
+    if(symbol_stack->stack_size == 0) return true;
+    else return false;
+}
 //Symbol Stack
 
 
@@ -264,30 +265,90 @@ 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++;
+    list->list_cnt--;
+    if(list->list_cnt == 0) {
+        listop.delete(list);
+    }
 }
 
-static unit_t * SymbolInfoList_find(list_t * list,char * name) {
+static void SymbolInfoList_delete(list_t * list) {
+    free(list);
+}
 
+static unit_t * SymbolInfoList_find(list_t * list,char * name) {
+    unit_t * cur = list->head.hash_next;
+    while (cur != &list->tail) {
+        if(strcmp(name,cur->name) == 0) {
+            return cur;
+        }
+        cur = cur->hash_next;
+    }
+    return NULL;
 }
 
 static list_t * SymbolInfoList_alloc() {
-
+    list_t * list = (list_t *)malloc(sizeof(list_t));
+    listop.init(list);
+    return list;
 }
 //Symbol List
 
 
 //Symbol Info node ops
-static void node_init() {
+//argc,char * name,deep,Type
+static void node_init(unit_t * cur,int argc,...) {
+    //argc,char * name,deep,Type
+    va_list ap;
+    va_start(ap,argc);
+    if(argc >= 1) {
+        char * name = va_arg(ap,char *);
+        cur->name = malloc(NAME_LENGTH);
+        assert(NAME_LENGTH > strlen(name));
+        strcpy(cur->name,name);
+    }
+    if(argc >= 2) {
+        int deep = va_arg(ap,int);
+        cur->type = deep;
+    }
+    if(argc >= 3) {
+        int type = va_arg(ap,int);
+        cur->type = type;
+    }
+    va_end(ap);
+    //鍒濆鍖栫洰鍓嶄粎娑夊強浜�
+    cur->hash_next = cur->hash_prev = cur->scope_next = cur->scope_prev = NULL;
 
 }
 
 static void node_delete(void * cur,int mode) {
-
+    unit_t * info_node = (unit_t*) cur;
+    SymbolStack_ele_t * stack_node = (SymbolStack_ele_t *) cur;
+    switch (mode) {
+        case INFONODE:
+            free(info_node->name);
+            free(info_node);
+            //瀛樺疄闄呬俊鎭殑鑺傜偣
+            break;
+        case HASHLIST:
+            panic("Delete hash list node not allowed!");
+            //涓嶅厑璁搁€氳繃璇PI鍒犻櫎
+            //hash table涓瘡涓摼琛ㄧ殑澶村熬鑺傜偣
+            break;
+        case STACKNODE:
+            free(stack_node);
+            break;
+        case STACKLIST:
+            panic("Delete stack list node not allowed!");
+            //涓嶅厑璁搁€氳繃璇PI鍒犻櫎
+            //stack涓殑
+            break;
+        default:
+            panic("Wrong mode");
+    }
 }
 
-static bool node_equal(unit_t* n1,unit_t* n2) {
-
+static bool struct_node_equal(unit_t* n1,unit_t* n2) {
+    panic("Not implemented");
 }
 //Symbol Info node
 
diff --git a/Code/syntax.tab.c b/Code/syntax.tab.c
index 0fc737b04c9fe21eabfddcad52e42e1c24ad6c41..285d0d3f6ee10bbad903aa6d21ebd3b393d7f817 100644
--- a/Code/syntax.tab.c
+++ b/Code/syntax.tab.c
@@ -67,7 +67,7 @@
 
 
 /* First part of user prologue.  */
-#line 3 "./syntax.y"
+#line 1 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
 
     int yycolumn = 1;
     char linetext[128];
@@ -78,7 +78,7 @@
                 yycolumn += yyleng;
     //#define YYDEBUG 1
     //int yydebug = 1;
-#line 15 "./syntax.y"
+#line 13 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
 
     #include <stdio.h>
     #include "lex.yy.c"
@@ -93,7 +93,7 @@
     extern int syntax;
 
 
-#line 97 "./syntax.tab.c"
+#line 97 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
 
 # ifndef YY_CAST
 #  ifdef __cplusplus
@@ -566,14 +566,14 @@ static const yytype_int8 yytranslate[] =
 /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_uint8 yyrline[] =
 {
-       0,   107,   107,   109,   110,   112,   113,   114,   115,   116,
-     117,   118,   120,   121,   126,   127,   129,   130,   132,   133,
-     135,   139,   140,   141,   143,   144,   145,   146,   148,   149,
-     151,   156,   157,   159,   160,   162,   163,   164,   165,   166,
-     167,   168,   169,   170,   171,   172,   177,   178,   180,   181,
-     182,   184,   185,   187,   188,   193,   194,   195,   196,   197,
-     198,   199,   200,   201,   202,   203,   204,   205,   206,   207,
-     208,   209,   210,   212,   213,   214
+       0,   105,   105,   107,   108,   110,   111,   112,   113,   114,
+     115,   116,   118,   119,   124,   125,   127,   128,   130,   131,
+     133,   137,   138,   139,   141,   142,   143,   144,   146,   147,
+     149,   154,   155,   157,   158,   160,   161,   162,   163,   164,
+     165,   166,   167,   168,   169,   170,   175,   176,   178,   179,
+     180,   182,   183,   185,   186,   191,   192,   193,   194,   195,
+     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
+     206,   207,   208,   210,   211,   212
 };
 #endif
 
@@ -1364,451 +1364,451 @@ yyreduce:
   switch (yyn)
     {
   case 2: /* Program: ExtDefList  */
-#line 107 "./syntax.y"
+#line 105 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { tree->root = (yyval.node) = Operator((yyval.node),"Program",(yyloc).first_line,1,(yyvsp[0].node)); }
-#line 1370 "./syntax.tab.c"
+#line 1370 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 3: /* ExtDefList: ExtDef ExtDefList  */
-#line 109 "./syntax.y"
+#line 107 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"ExtDefList",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1376 "./syntax.tab.c"
+#line 1376 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 4: /* ExtDefList: %empty  */
-#line 110 "./syntax.y"
+#line 108 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = NULL; }
-#line 1382 "./syntax.tab.c"
+#line 1382 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 5: /* ExtDef: Specifier ExtDecList SEMI  */
-#line 112 "./syntax.y"
+#line 110 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"ExtDef",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1388 "./syntax.tab.c"
+#line 1388 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 6: /* ExtDef: Specifier SEMI  */
-#line 113 "./syntax.y"
+#line 111 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"ExtDef",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1394 "./syntax.tab.c"
+#line 1394 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 7: /* ExtDef: Specifier FunDec CompSt  */
-#line 114 "./syntax.y"
+#line 112 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"ExtDef",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1400 "./syntax.tab.c"
+#line 1400 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 8: /* ExtDef: error SEMI  */
-#line 115 "./syntax.y"
+#line 113 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = NULL;yyerror("ExtDef"); }
-#line 1406 "./syntax.tab.c"
+#line 1406 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 9: /* ExtDef: Specifier error  */
-#line 116 "./syntax.y"
+#line 114 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = NULL;yyerror("ExtDef,missing ;"); }
-#line 1412 "./syntax.tab.c"
+#line 1412 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 10: /* ExtDef: Specifier error SEMI  */
-#line 117 "./syntax.y"
+#line 115 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = NULL;yyerror("ExtDef"); }
-#line 1418 "./syntax.tab.c"
+#line 1418 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 11: /* ExtDef: Specifier error CompSt  */
-#line 118 "./syntax.y"
+#line 116 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = NULL;yyerror("ExtDef"); }
-#line 1424 "./syntax.tab.c"
+#line 1424 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 12: /* ExtDecList: VarDec  */
-#line 120 "./syntax.y"
+#line 118 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"ExtDecList",(yyloc).first_line,1,(yyvsp[0].node)); }
-#line 1430 "./syntax.tab.c"
+#line 1430 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 13: /* ExtDecList: VarDec COMMA ExtDecList  */
-#line 121 "./syntax.y"
+#line 119 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"ExtDecList",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1436 "./syntax.tab.c"
+#line 1436 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 14: /* Specifier: TYPE  */
-#line 126 "./syntax.y"
+#line 124 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"Specifier",(yyloc).first_line,1,(yyvsp[0].node)); }
-#line 1442 "./syntax.tab.c"
+#line 1442 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 15: /* Specifier: StructSpecifier  */
-#line 127 "./syntax.y"
+#line 125 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"Specifier",(yyloc).first_line,1,(yyvsp[0].node)); }
-#line 1448 "./syntax.tab.c"
+#line 1448 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 16: /* StructSpecifier: STRUCT OptTag LC DefList RC  */
-#line 129 "./syntax.y"
+#line 127 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/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 "./syntax.tab.c"
+#line 1454 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 17: /* StructSpecifier: STRUCT Tag  */
-#line 130 "./syntax.y"
+#line 128 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"StructSpecifier",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1460 "./syntax.tab.c"
+#line 1460 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 18: /* OptTag: ID  */
-#line 132 "./syntax.y"
+#line 130 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"OptTag",(yyloc).first_line,1,(yyvsp[0].node)); }
-#line 1466 "./syntax.tab.c"
+#line 1466 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 19: /* OptTag: %empty  */
-#line 133 "./syntax.y"
+#line 131 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = NULL; }
-#line 1472 "./syntax.tab.c"
+#line 1472 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 20: /* Tag: ID  */
-#line 135 "./syntax.y"
+#line 133 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"Tag",(yyloc).first_line,1,(yyvsp[0].node)); }
-#line 1478 "./syntax.tab.c"
+#line 1478 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 21: /* VarDec: ID  */
-#line 139 "./syntax.y"
+#line 137 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"VarDec",(yyloc).first_line,1,(yyvsp[0].node)); }
-#line 1484 "./syntax.tab.c"
+#line 1484 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 22: /* VarDec: VarDec LB INT RB  */
-#line 140 "./syntax.y"
+#line 138 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/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 "./syntax.tab.c"
+#line 1490 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 23: /* VarDec: VarDec LB error RB  */
-#line 141 "./syntax.y"
+#line 139 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = NULL; yyerror("VarDec"); }
-#line 1496 "./syntax.tab.c"
+#line 1496 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 24: /* FunDec: ID LP VarList RP  */
-#line 143 "./syntax.y"
+#line 141 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/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 "./syntax.tab.c"
+#line 1502 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 25: /* FunDec: ID LP RP  */
-#line 144 "./syntax.y"
+#line 142 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"FunDec",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1508 "./syntax.tab.c"
+#line 1508 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 26: /* FunDec: ID LP error RP  */
-#line 145 "./syntax.y"
+#line 143 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = NULL; yyerror("FunDec"); }
-#line 1514 "./syntax.tab.c"
+#line 1514 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 27: /* FunDec: error LP VarList RP  */
-#line 146 "./syntax.y"
+#line 144 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = NULL; yyerror("FunDec"); }
-#line 1520 "./syntax.tab.c"
+#line 1520 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 28: /* VarList: ParamDec COMMA VarList  */
-#line 148 "./syntax.y"
+#line 146 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"VarList",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1526 "./syntax.tab.c"
+#line 1526 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 29: /* VarList: ParamDec  */
-#line 149 "./syntax.y"
+#line 147 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"VarList",(yyloc).first_line,1,(yyvsp[0].node)); }
-#line 1532 "./syntax.tab.c"
+#line 1532 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 30: /* ParamDec: Specifier VarDec  */
-#line 151 "./syntax.y"
+#line 149 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"ParamDec",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1538 "./syntax.tab.c"
+#line 1538 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 31: /* CompSt: LC DefList StmtList RC  */
-#line 156 "./syntax.y"
+#line 154 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/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 "./syntax.tab.c"
+#line 1544 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 32: /* CompSt: LC DefList error RC  */
-#line 157 "./syntax.y"
+#line 155 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = NULL; yyerror("CompSt"); }
-#line 1550 "./syntax.tab.c"
+#line 1550 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 33: /* StmtList: Stmt StmtList  */
-#line 159 "./syntax.y"
+#line 157 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"StmtList",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1556 "./syntax.tab.c"
+#line 1556 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 34: /* StmtList: %empty  */
-#line 160 "./syntax.y"
+#line 158 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = NULL; }
-#line 1562 "./syntax.tab.c"
+#line 1562 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 35: /* Stmt: Exp SEMI  */
-#line 162 "./syntax.y"
+#line 160 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"Stmt",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1568 "./syntax.tab.c"
+#line 1568 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 36: /* Stmt: CompSt  */
-#line 163 "./syntax.y"
+#line 161 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"Stmt",(yyloc).first_line,1,(yyvsp[0].node)); }
-#line 1574 "./syntax.tab.c"
+#line 1574 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 37: /* Stmt: RETURN Exp SEMI  */
-#line 164 "./syntax.y"
+#line 162 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"Stmt",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1580 "./syntax.tab.c"
+#line 1580 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 38: /* Stmt: IF LP Exp RP Stmt  */
-#line 165 "./syntax.y"
+#line 163 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/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 "./syntax.tab.c"
+#line 1586 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 39: /* Stmt: IF LP Exp RP Stmt ELSE Stmt  */
-#line 166 "./syntax.y"
+#line 164 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/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 "./syntax.tab.c"
+#line 1592 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 40: /* Stmt: WHILE LP Exp RP Stmt  */
-#line 167 "./syntax.y"
+#line 165 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/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 "./syntax.tab.c"
+#line 1598 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 41: /* Stmt: error SEMI  */
-#line 168 "./syntax.y"
+#line 166 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = NULL; yyerror("1Stmt"); }
-#line 1604 "./syntax.tab.c"
+#line 1604 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 42: /* Stmt: Exp error  */
-#line 169 "./syntax.y"
+#line 167 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = NULL; yyerror("2Stmt"); }
-#line 1610 "./syntax.tab.c"
+#line 1610 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 43: /* Stmt: IF LP Exp error RP Stmt  */
-#line 170 "./syntax.y"
+#line 168 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = NULL; yyerror("3Stmt"); }
-#line 1616 "./syntax.tab.c"
+#line 1616 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 44: /* Stmt: RETURN error SEMI  */
-#line 171 "./syntax.y"
+#line 169 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = NULL; yyerror("4Stmt"); }
-#line 1622 "./syntax.tab.c"
+#line 1622 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 45: /* Stmt: RETURN Exp error  */
-#line 172 "./syntax.y"
+#line 170 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = NULL; yyerror("5Stmt"); }
-#line 1628 "./syntax.tab.c"
+#line 1628 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 46: /* DefList: Def DefList  */
-#line 177 "./syntax.y"
+#line 175 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"DefList",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1634 "./syntax.tab.c"
+#line 1634 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 47: /* DefList: %empty  */
-#line 178 "./syntax.y"
+#line 176 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = NULL; }
-#line 1640 "./syntax.tab.c"
+#line 1640 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 48: /* Def: Specifier DecList SEMI  */
-#line 180 "./syntax.y"
+#line 178 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"Def",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1646 "./syntax.tab.c"
+#line 1646 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 49: /* Def: Specifier error SEMI  */
-#line 181 "./syntax.y"
+#line 179 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = NULL; yyerror("Def"); }
-#line 1652 "./syntax.tab.c"
+#line 1652 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 50: /* Def: Specifier DecList error SEMI  */
-#line 182 "./syntax.y"
+#line 180 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = NULL; yyerror("Def"); }
-#line 1658 "./syntax.tab.c"
+#line 1658 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 51: /* DecList: Dec  */
-#line 184 "./syntax.y"
+#line 182 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"DecList",(yyloc).first_line,1,(yyvsp[0].node)); }
-#line 1664 "./syntax.tab.c"
+#line 1664 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 52: /* DecList: Dec COMMA DecList  */
-#line 185 "./syntax.y"
+#line 183 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"DecList",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1670 "./syntax.tab.c"
+#line 1670 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 53: /* Dec: VarDec  */
-#line 187 "./syntax.y"
+#line 185 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"Dec",(yyloc).first_line,1,(yyvsp[0].node)); }
-#line 1676 "./syntax.tab.c"
+#line 1676 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 54: /* Dec: VarDec ASSIGNOP Exp  */
-#line 188 "./syntax.y"
+#line 186 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"Dec",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1682 "./syntax.tab.c"
+#line 1682 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 55: /* Exp: Exp ASSIGNOP Exp  */
-#line 193 "./syntax.y"
+#line 191 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1688 "./syntax.tab.c"
+#line 1688 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 56: /* Exp: Exp AND Exp  */
-#line 194 "./syntax.y"
+#line 192 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1694 "./syntax.tab.c"
+#line 1694 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 57: /* Exp: Exp OR Exp  */
-#line 195 "./syntax.y"
+#line 193 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1700 "./syntax.tab.c"
+#line 1700 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 58: /* Exp: Exp RELOP Exp  */
-#line 196 "./syntax.y"
+#line 194 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1706 "./syntax.tab.c"
+#line 1706 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 59: /* Exp: Exp PLUS Exp  */
-#line 197 "./syntax.y"
+#line 195 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1712 "./syntax.tab.c"
+#line 1712 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 60: /* Exp: Exp MINUS Exp  */
-#line 198 "./syntax.y"
+#line 196 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1718 "./syntax.tab.c"
+#line 1718 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 61: /* Exp: Exp STAR Exp  */
-#line 199 "./syntax.y"
+#line 197 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1724 "./syntax.tab.c"
+#line 1724 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 62: /* Exp: Exp DIV Exp  */
-#line 200 "./syntax.y"
+#line 198 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1730 "./syntax.tab.c"
+#line 1730 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 63: /* Exp: LP Exp RP  */
-#line 201 "./syntax.y"
+#line 199 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1736 "./syntax.tab.c"
+#line 1736 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 64: /* Exp: MINUS Exp  */
-#line 202 "./syntax.y"
+#line 200 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1742 "./syntax.tab.c"
+#line 1742 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 65: /* Exp: NOT Exp  */
-#line 203 "./syntax.y"
+#line 201 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1748 "./syntax.tab.c"
+#line 1748 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 66: /* Exp: ID LP Args RP  */
-#line 204 "./syntax.y"
+#line 202 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/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 "./syntax.tab.c"
+#line 1754 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 67: /* Exp: ID LP RP  */
-#line 205 "./syntax.y"
+#line 203 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1760 "./syntax.tab.c"
+#line 1760 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 68: /* Exp: Exp LB Exp RB  */
-#line 206 "./syntax.y"
+#line 204 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/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 "./syntax.tab.c"
+#line 1766 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 69: /* Exp: Exp DOT ID  */
-#line 207 "./syntax.y"
+#line 205 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1772 "./syntax.tab.c"
+#line 1772 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 70: /* Exp: ID  */
-#line 208 "./syntax.y"
+#line 206 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,1,(yyvsp[0].node)); }
-#line 1778 "./syntax.tab.c"
+#line 1778 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 71: /* Exp: INT  */
-#line 209 "./syntax.y"
+#line 207 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,1,(yyvsp[0].node)); }
-#line 1784 "./syntax.tab.c"
+#line 1784 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 72: /* Exp: FLOAT  */
-#line 210 "./syntax.y"
+#line 208 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,1,(yyvsp[0].node)); }
-#line 1790 "./syntax.tab.c"
+#line 1790 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 73: /* Args: Exp COMMA Args  */
-#line 212 "./syntax.y"
+#line 210 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"Args",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); }
-#line 1796 "./syntax.tab.c"
+#line 1796 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 74: /* Args: Exp  */
-#line 213 "./syntax.y"
+#line 211 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = Operator((yyval.node),"Args",(yyloc).first_line,1,(yyvsp[0].node)); }
-#line 1802 "./syntax.tab.c"
+#line 1802 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
   case 75: /* Args: error Args  */
-#line 214 "./syntax.y"
+#line 212 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
                                     { (yyval.node) = NULL; yyerror("Wrong Args"); }
-#line 1808 "./syntax.tab.c"
+#line 1808 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
     break;
 
 
-#line 1812 "./syntax.tab.c"
+#line 1812 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.c"
 
       default: break;
     }
@@ -2006,7 +2006,7 @@ yyreturnlab:
   return yyresult;
 }
 
-#line 217 "./syntax.y"
+#line 215 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
 
 
 
diff --git a/Code/syntax.tab.h b/Code/syntax.tab.h
index 6c3c38ec48ee56a82c3a94600b9986581bf4d903..618859ae5241cbc9f7aa8147b8acbbbd195c9cd7 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_SYNTAX_TAB_H_INCLUDED
-# define YY_YY_SYNTAX_TAB_H_INCLUDED
+#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
 /* 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 "./syntax.y"
+#line 29 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.y"
 
     struct Tree_node_t * node;
 
-#line 99 "./syntax.tab.h"
+#line 99 "/home/ppx/zhaochaoyi/Compiler/Lab2/Code/syntax.tab.h"
 
 };
 typedef union YYSTYPE YYSTYPE;
@@ -124,4 +124,4 @@ extern YYLTYPE yylloc;
 int yyparse (void);
 
 
-#endif /* !YY_YY_SYNTAX_TAB_H_INCLUDED  */
+#endif /* !YY_YY_HOME_PPX_ZHAOCHAOYI_COMPILER_LAB2_CODE_SYNTAX_TAB_H_INCLUDED  */
diff --git a/Code/syntax.y b/Code/syntax.y
index 5f3c0454427d5c0213f7b6e965e051267a3d234a..0312c6d8b24bbd2ac21db15bb44bd87bed230fae 100755
--- a/Code/syntax.y
+++ b/Code/syntax.y
@@ -1,5 +1,3 @@
-%locations
-
 %{
     int yycolumn = 1;
     char linetext[128];