diff --git a/Code/Makefile b/Code/Makefile index bd8d8316d22072258084ae2fea5dd939471df6ed..ff0ad6c13d218ff0b35cc2243199a78b9fccc9a5 100755 --- a/Code/Makefile +++ b/Code/Makefile @@ -40,10 +40,13 @@ syntax-c: $(YFILE) -include $(patsubst %.o, %.d, $(OBJS)) + +TESTFILE = $(shell find ../ -name "*.cmm") + # 瀹氫箟鐨勪竴浜涗吉鐩爣 .PHONY: clean test test: parser - ./parser ../Test/test1.cmm ../Test/test2.cmm > a.txt + ./parser $(TESTFILE) > a.txt @rm *.o clean: @rm -f parser lex.yy.c syntax.tab.c syntax.tab.h syntax.output diff --git a/Code/a.txt b/Code/a.txt index 9fe96d246132b48f822bdd41249b3b6344b69b8b..fd963f490bcbe741f1b4a27eec18b514909225ec 100644 --- a/Code/a.txt +++ b/Code/a.txt @@ -1,39 +1,4 @@ -Program (1) - ExtDefList (1) - ExtDef (1) - Specifier (1) - TYPE: int - FunDec (1) - ID: inc - LP - RP - CompSt (2) - LC - DefList (3) - Def (3) - Specifier (3) - TYPE: int - DecList (3) - Dec (3) - VarDec (3) - ID: i - ASSIGNOP - Exp (3) - INT: 0123 - SEMI - DefList (4) - Def (4) - Specifier (4) - TYPE: int - DecList (4) - Dec (4) - VarDec (4) - ID: j - ASSIGNOP - Exp (4) - INT: 0x3F - SEMI - RC +Syntax error:1 @@ -94,9 +59,6 @@ Program (1) ID: image ASSIGNOP Exp (8) - FLOAT: 3.5 + FLOAT: 3.500000 SEMI RC - - - diff --git a/Code/data.c b/Code/data.c index 118515f7fbe6cd9c3e3900b4ea1a5c02fc5aa7c3..e9caf1637cfd2b910e35fd0a2b546a2e37e2eb82 100644 --- a/Code/data.c +++ b/Code/data.c @@ -1,9 +1,10 @@ -#include "data.h" #include <malloc.h> #include <assert.h> #include <string.h> -#include "debug.h" #include <stdarg.h> +#include <stdlib.h> +#include "data.h" +#include "debug.h" static MultiwayTree_t * __MultiwayTree_init(MultiwayTree_t * t) { t->root = tree->Node_alloc("begin",0); @@ -65,12 +66,13 @@ static void __MultiwayTree_Traverse(Node_t * cur,int deep) { } if(cur->lchild == NULL) { printf("%s",cur->content); + char ** s; if(strcmp(cur->content,"ID") == 0) { printf(": %s",cur->text); } else if(strcmp(cur->content,"INT") == 0) { - printf(": %s",cur->text); + printf(": %d",strtol(cur->text,s,0)); } else if(strcmp(cur->content,"FLOAT") == 0) { - printf(": %s",cur->text); + printf(": %f",(float)atof(cur->text)); } else if(strcmp(cur->content,"TYPE") == 0) { printf(": %s",cur->text); } @@ -107,7 +109,6 @@ MultiwayTree_t * tree = &__Multiwaytree; Node_t * Operator(Node_t * cur,char * content,int line,int argc,...) { cur = tree->Node_alloc(content,line); - // Log("%s %d %d",content,line,argc); // printf("%d: parent:%p %s:%s--- child:",argc,cur,cur->content,cur->text); va_list ap; va_start(ap,argc); @@ -115,7 +116,6 @@ Node_t * Operator(Node_t * cur,char * content,int line,int argc,...) { Node_t * temp = (Node_t*)va_arg(ap,Node_t*); if(temp == NULL) continue; // printf("%p %s:%s--- ",temp,temp->content,temp->text); - // Log("%s",temp->content); tree->rminsert(cur,temp); } va_end(ap); @@ -124,7 +124,3 @@ Node_t * Operator(Node_t * cur,char * content,int line,int argc,...) { } -static char * num_transform(char * s) { - -} - diff --git a/Code/debug.h b/Code/debug.h index 98f1551a78f714478a30f04f4d83b48b044a8e01..77344d78b23d93a9281d6726e4e188b36779a1ca 100644 --- a/Code/debug.h +++ b/Code/debug.h @@ -1,21 +1,27 @@ // #define DEBUG // #define SCANNER_DEBUG +// #define FINAL + #ifndef DEBUG_H #define DEBUG_H - #ifdef SCANNER_DEBUG #define ELEMENT(_S_) {printf("TYPE =( %s ),content=( %s )\n",_S_,yytext);yylval.node = add_node_text(_S_,yytext,yyleng);} #else - #define ELEMENT(_S_) { yylval.node = add_node_text(_S_,yytext,yyleng);} + #define ELEMENT(_S_) { yylval.node = add_node_text(_S_,yytext,yyleng);strcat(linetext,yytext);} #endif - -#define _Log(...) fprintf(stderr,__VA_ARGS__); -#define SyntaxError(format, ...) _Log("\33[1;31m row=%d col=%d, " format "\33[0m\n",yylloc.first_line,yycolumn, ## __VA_ARGS__) -#define LexicalError(format, ...) _Log("\33[1;32m row=%d col=%d, " format "\33[0m\n",yylloc.first_line,yycolumn, ## __VA_ARGS__) +#ifdef FINAL + #define _Log(...) fprintf(stderr,__VA_ARGS__); + #define SyntaxError(format, ...) _Log("Error type B at Line %d: Syntax error. \'%s\'\n", yylineno, yytext) + #define LexicalError(format, ...) _Log("Error type A at Line %d: Mysterious characters \'%s\'\n", yylineno, yytext) +#else + #define _Log(...) fprintf(stderr,__VA_ARGS__); + #define SyntaxError(format, ...) _Log("\33[1;31m row=%d col=%d, " format "\33[0m\n",yylloc.first_line,yycolumn, ## __VA_ARGS__) + #define LexicalError(format, ...) _Log("\33[1;32m row=%d col=%d, " format "\33[0m\n",yylloc.first_line,yycolumn, ## __VA_ARGS__) +#endif #define Log(format, ...) \ _Log("\33[1;34m[%s,%d,%s] " format "\33[0m\n", \ @@ -23,4 +29,8 @@ #define PRINT_TREE(A) tree->traverse(A,0); +#ifdef FINAL + +#endif + #endif \ No newline at end of file diff --git a/Code/lex.yy.c b/Code/lex.yy.c index eb12b4a5bae757df03d89a1af9bb39cd786ebc50..caf81a3f5a643412dd0dc8dc39796f8e8bdbce6b 100644 --- a/Code/lex.yy.c +++ b/Code/lex.yy.c @@ -943,23 +943,23 @@ YY_RULE_SETUP case 27: YY_RULE_SETUP #line 66 "./lexical.l" -{ ;} +{ strcat(linetext," ");} YY_BREAK case 28: YY_RULE_SETUP #line 67 "./lexical.l" -{ yycolumn += 3; } +{ yycolumn += 3; strcat(linetext,"\t");} YY_BREAK case 29: /* rule 29 can match eol */ YY_RULE_SETUP #line 68 "./lexical.l" -{ yycolumn = 1; yylineno += 1; } +{ yycolumn = 1; yylineno += 1; linetext[0] = '\0'; } YY_BREAK case 30: YY_RULE_SETUP #line 69 "./lexical.l" -{ LexicalError("Lexical Error: %s",yytext); /*printf("Error type A at Line %d: Mysterious characters \'%s\'\n", yylineno, yytext);*/ } +{ LexicalError("Lexical Error: %s",yytext); } YY_BREAK case 31: YY_RULE_SETUP @@ -1978,7 +1978,7 @@ extern int syntax; void yyerror(char* msg) { syntax++; - SyntaxError("%s : \n\t%s\n\t^", msg,yytext); + SyntaxError("%s : %s\n\t%s\n", msg,yytext,linetext); } static Node_t* add_node_text(char * content,char *text,int len) { diff --git a/Code/lexical.l b/Code/lexical.l index 097089f5ed60e80f06d4928463d4014dbe4ade48..b0f1fafb1800866d0ca20e95dbd721f4f28d04d5 100755 --- a/Code/lexical.l +++ b/Code/lexical.l @@ -63,10 +63,10 @@ WHILE while {RB} { ELEMENT("RB"); return RB;} {LC} { ELEMENT("LC"); return LC;} {RC} { ELEMENT("RC"); return RC;} -[ ] { ;} -[\t] { yycolumn += 3; } -[\n] { yycolumn = 1; yylineno += 1; } -. { LexicalError("Lexical Error: %s",yytext); /*printf("Error type A at Line %d: Mysterious characters \'%s\'\n", yylineno, yytext);*/ } +[ ] { strcat(linetext," ");} +[\t] { yycolumn += 3; strcat(linetext,"\t");} +[\n] { yycolumn = 1; yylineno += 1; linetext[0] = '\0'; } +. { LexicalError("Lexical Error: %s",yytext); } %% @@ -74,7 +74,7 @@ extern int syntax; void yyerror(char* msg) { syntax++; - SyntaxError("%s : \n\t%s\n\t^", msg,yytext); + SyntaxError("%s : %s\n\t%s\n", msg,yytext,linetext); } static Node_t* add_node_text(char * content,char *text,int len) { diff --git a/Code/main.c b/Code/main.c index 7d8e708c000583b51e6e14bb2507e37618ca7979..5c493f2bd851c2e462bbe4d1b556b47693a67727 100755 --- a/Code/main.c +++ b/Code/main.c @@ -25,13 +25,15 @@ int main(int argc,char *argv[]) { } yyrestart(f); yyparse(); - fclose(f); - if(syntax == 0) { - tree->traverse(tree->root,0); + fclose(f); + if (syntax == 1) { + #ifndef FINAL + printf("Syntax error:%d\n",syntax); + printf("\n\n\n"); + #endif } else { - printf("Syntax error:%d\n",syntax); + tree->traverse(tree->root,0); } - printf("\n\n\n"); } return 0; } diff --git a/Code/parser b/Code/parser index 4b6e04050b707a9cdfdca404373a3d2976cde240..744cd3321bbe9debcc238ecefb365dafe3c93c1b 100755 Binary files a/Code/parser and b/Code/parser differ diff --git a/Code/syntax.output b/Code/syntax.output index 9b3f7b8e09a2eff06e517f385e50d93d96e962f4..dbcb518c2babb9f6b1dd98473db01cda8c48feef 100644 --- a/Code/syntax.output +++ b/Code/syntax.output @@ -79,24 +79,25 @@ 56 | ID 57 | INT 58 | FLOAT + 59 | Exp PLUS error - 59 Args: Exp COMMA Args - 60 | Exp - 61 | error Args + 60 Args: Exp COMMA Args + 61 | Exp + 62 | error Args 缁堢粨璇瘝锛岄檮鏈夊畠浠嚭鐜板鐨勮鍒� $end (0) 0 - error <node> (256) 24 33 61 + error <node> (256) 24 33 59 62 INT <node> (258) 17 57 FLOAT <node> (259) 58 ID <node> (260) 13 15 16 18 19 52 53 55 56 SEMI <node> (261) 4 5 27 29 33 36 - COMMA <node> (262) 8 20 38 59 + COMMA <node> (262) 8 20 38 60 ASSIGNOP <node> (263) 40 41 RELOP <node> (264) 44 - PLUS <node> (265) 45 + PLUS <node> (265) 45 59 MINUS <node> (266) 46 50 STAR <node> (267) 47 DIV <node> (268) 48 @@ -181,11 +182,11 @@ on left: 39 40 on right: 37 38 Exp <node> (51) - on left: 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 - on right: 27 29 30 31 32 40 41 42 43 44 45 46 47 48 49 50 51 54 55 59 60 + on left: 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 + on right: 27 29 30 31 32 40 41 42 43 44 45 46 47 48 49 50 51 54 55 59 60 61 Args <node> (52) - on left: 59 60 61 - on right: 52 59 61 + on left: 60 61 62 + on right: 52 60 62 鐘舵€� 0 @@ -795,6 +796,7 @@ 48 | Exp 鈥� DIV Exp 54 | Exp 鈥� LB Exp RB 55 | Exp 鈥� DOT ID + 59 | Exp 鈥� PLUS error SEMI 鍋忕Щ锛屽苟杩涘叆鐘舵€� 75 ASSIGNOP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 76 @@ -886,6 +888,7 @@ 50 | MINUS Exp 鈥� 54 | Exp 鈥� LB Exp RB 55 | Exp 鈥� DOT ID + 59 | Exp 鈥� PLUS error MINUS 鍋忕Щ锛屽苟杩涘叆鐘舵€� 79 DOT 鍋忕Щ锛屽苟杩涘叆鐘舵€� 84 @@ -907,6 +910,7 @@ 51 | NOT Exp 鈥� 54 | Exp 鈥� LB Exp RB 55 | Exp 鈥� DOT ID + 59 | Exp 鈥� PLUS error MINUS 鍋忕Щ锛屽苟杩涘叆鐘舵€� 79 DOT 鍋忕Щ锛屽苟杩涘叆鐘舵€� 84 @@ -928,6 +932,7 @@ 49 | LP Exp 鈥� RP 54 | Exp 鈥� LB Exp RB 55 | Exp 鈥� DOT ID + 59 | Exp 鈥� PLUS error ASSIGNOP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 76 RELOP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 77 @@ -955,6 +960,7 @@ 48 | Exp 鈥� DIV Exp 54 | Exp 鈥� LB Exp RB 55 | Exp 鈥� DOT ID + 59 | Exp 鈥� PLUS error SEMI 鍋忕Щ锛屽苟杩涘叆鐘舵€� 93 ASSIGNOP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 76 @@ -1050,7 +1056,9 @@ 鐘舵€� 78 45 Exp: Exp PLUS 鈥� Exp + 59 | Exp PLUS 鈥� error + error 鍋忕Щ锛屽苟杩涘叆鐘舵€� 98 INT 鍋忕Щ锛屽苟杩涘叆鐘舵€� 48 FLOAT 鍋忕Щ锛屽苟杩涘叆鐘舵€� 49 ID 鍋忕Щ锛屽苟杩涘叆鐘舵€� 50 @@ -1058,7 +1066,7 @@ NOT 鍋忕Щ锛屽苟杩涘叆鐘舵€� 52 LP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 53 - Exp 杞埌鐘舵€� 98 + Exp 杞埌鐘舵€� 99 鐘舵€� 79 @@ -1072,7 +1080,7 @@ NOT 鍋忕Щ锛屽苟杩涘叆鐘舵€� 52 LP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 53 - Exp 杞埌鐘舵€� 99 + Exp 杞埌鐘舵€� 100 鐘舵€� 80 @@ -1086,7 +1094,7 @@ NOT 鍋忕Щ锛屽苟杩涘叆鐘舵€� 52 LP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 53 - Exp 杞埌鐘舵€� 100 + Exp 杞埌鐘舵€� 101 鐘舵€� 81 @@ -1100,7 +1108,7 @@ NOT 鍋忕Щ锛屽苟杩涘叆鐘舵€� 52 LP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 53 - Exp 杞埌鐘舵€� 101 + Exp 杞埌鐘舵€� 102 鐘舵€� 82 @@ -1114,7 +1122,7 @@ NOT 鍋忕Щ锛屽苟杩涘叆鐘舵€� 52 LP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 53 - Exp 杞埌鐘舵€� 102 + Exp 杞埌鐘舵€� 103 鐘舵€� 83 @@ -1128,14 +1136,14 @@ NOT 鍋忕Щ锛屽苟杩涘叆鐘舵€� 52 LP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 53 - Exp 杞埌鐘舵€� 103 + Exp 杞埌鐘舵€� 104 鐘舵€� 84 55 Exp: Exp DOT 鈥� ID - ID 鍋忕Щ锛屽苟杩涘叆鐘舵€� 104 + ID 鍋忕Щ锛屽苟杩涘叆鐘舵€� 105 鐘舵€� 85 @@ -1149,7 +1157,7 @@ NOT 鍋忕Щ锛屽苟杩涘叆鐘舵€� 52 LP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 53 - Exp 杞埌鐘舵€� 105 + Exp 杞埌鐘舵€� 106 鐘舵€� 86 @@ -1165,6 +1173,7 @@ 48 | Exp 鈥� DIV Exp 54 | Exp 鈥� LB Exp RB 55 | Exp 鈥� DOT ID + 59 | Exp 鈥� PLUS error ASSIGNOP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 76 RELOP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 77 @@ -1189,7 +1198,7 @@ 鐘舵€� 88 - 61 Args: error 鈥� Args + 62 Args: error 鈥� Args error 鍋忕Щ锛屽苟杩涘叆鐘舵€� 88 INT 鍋忕Щ锛屽苟杩涘叆鐘舵€� 48 @@ -1200,7 +1209,7 @@ LP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 53 Exp 杞埌鐘舵€� 90 - Args 杞埌鐘舵€� 106 + Args 杞埌鐘舵€� 107 鐘舵€� 89 @@ -1222,10 +1231,11 @@ 48 | Exp 鈥� DIV Exp 54 | Exp 鈥� LB Exp RB 55 | Exp 鈥� DOT ID - 59 Args: Exp 鈥� COMMA Args - 60 | Exp 鈥� + 59 | Exp 鈥� PLUS error + 60 Args: Exp 鈥� COMMA Args + 61 | Exp 鈥� - COMMA 鍋忕Щ锛屽苟杩涘叆鐘舵€� 107 + COMMA 鍋忕Щ锛屽苟杩涘叆鐘舵€� 108 ASSIGNOP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 76 RELOP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 77 PLUS 鍋忕Щ锛屽苟杩涘叆鐘舵€� 78 @@ -1237,14 +1247,14 @@ DOT 鍋忕Щ锛屽苟杩涘叆鐘舵€� 84 LB 鍋忕Щ锛屽苟杩涘叆鐘舵€� 85 - $default 浣跨敤瑙勫垯 60 浠ュ綊绾� (Args) + $default 浣跨敤瑙勫垯 61 浠ュ綊绾� (Args) 鐘舵€� 91 52 Exp: ID LP Args 鈥� RP - RP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 108 + RP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 109 鐘舵€� 92 @@ -1275,6 +1285,7 @@ 48 | Exp 鈥� DIV Exp 54 | Exp 鈥� LB Exp RB 55 | Exp 鈥� DOT ID + 59 | Exp 鈥� PLUS error ASSIGNOP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 76 RELOP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 77 @@ -1285,7 +1296,7 @@ AND 鍋忕Щ锛屽苟杩涘叆鐘舵€� 82 OR 鍋忕Щ锛屽苟杩涘叆鐘舵€� 83 DOT 鍋忕Щ锛屽苟杩涘叆鐘舵€� 84 - RP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 109 + RP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 110 LB 鍋忕Щ锛屽苟杩涘叆鐘舵€� 85 @@ -1302,6 +1313,7 @@ 48 | Exp 鈥� DIV Exp 54 | Exp 鈥� LB Exp RB 55 | Exp 鈥� DOT ID + 59 | Exp 鈥� PLUS error ASSIGNOP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 76 RELOP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 77 @@ -1312,7 +1324,7 @@ AND 鍋忕Щ锛屽苟杩涘叆鐘舵€� 82 OR 鍋忕Щ锛屽苟杩涘叆鐘舵€� 83 DOT 鍋忕Щ锛屽苟杩涘叆鐘舵€� 84 - RP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 110 + RP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 111 LB 鍋忕Щ锛屽苟杩涘叆鐘舵€� 85 @@ -1329,6 +1341,7 @@ 48 | Exp 鈥� DIV Exp 54 | Exp 鈥� LB Exp RB 55 | Exp 鈥� DOT ID + 59 | Exp 鈥� PLUS error ASSIGNOP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 76 RELOP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 77 @@ -1357,6 +1370,7 @@ 48 | Exp 鈥� DIV Exp 54 | Exp 鈥� LB Exp RB 55 | Exp 鈥� DOT ID + 59 | Exp 鈥� PLUS error PLUS 鍋忕Щ锛屽苟杩涘叆鐘舵€� 78 MINUS 鍋忕Щ锛屽苟杩涘叆鐘舵€� 79 @@ -1370,6 +1384,13 @@ 鐘舵€� 98 + 59 Exp: Exp PLUS error 鈥� + + $default 浣跨敤瑙勫垯 59 浠ュ綊绾� (Exp) + + +鐘舵€� 99 + 41 Exp: Exp 鈥� ASSIGNOP Exp 42 | Exp 鈥� AND Exp 43 | Exp 鈥� OR Exp @@ -1381,6 +1402,7 @@ 48 | Exp 鈥� DIV Exp 54 | Exp 鈥� LB Exp RB 55 | Exp 鈥� DOT ID + 59 | Exp 鈥� PLUS error MINUS 鍋忕Щ锛屽苟杩涘叆鐘舵€� 79 STAR 鍋忕Щ锛屽苟杩涘叆鐘舵€� 80 @@ -1391,7 +1413,7 @@ $default 浣跨敤瑙勫垯 45 浠ュ綊绾� (Exp) -鐘舵€� 99 +鐘舵€� 100 41 Exp: Exp 鈥� ASSIGNOP Exp 42 | Exp 鈥� AND Exp @@ -1404,6 +1426,7 @@ 48 | Exp 鈥� DIV Exp 54 | Exp 鈥� LB Exp RB 55 | Exp 鈥� DOT ID + 59 | Exp 鈥� PLUS error MINUS 鍋忕Щ锛屽苟杩涘叆鐘舵€� 79 DOT 鍋忕Щ锛屽苟杩涘叆鐘舵€� 84 @@ -1412,7 +1435,7 @@ $default 浣跨敤瑙勫垯 46 浠ュ綊绾� (Exp) -鐘舵€� 100 +鐘舵€� 101 41 Exp: Exp 鈥� ASSIGNOP Exp 42 | Exp 鈥� AND Exp @@ -1425,6 +1448,7 @@ 48 | Exp 鈥� DIV Exp 54 | Exp 鈥� LB Exp RB 55 | Exp 鈥� DOT ID + 59 | Exp 鈥� PLUS error MINUS 鍋忕Щ锛屽苟杩涘叆鐘舵€� 79 DIV 鍋忕Щ锛屽苟杩涘叆鐘舵€� 81 @@ -1434,7 +1458,7 @@ $default 浣跨敤瑙勫垯 47 浠ュ綊绾� (Exp) -鐘舵€� 101 +鐘舵€� 102 41 Exp: Exp 鈥� ASSIGNOP Exp 42 | Exp 鈥� AND Exp @@ -1447,6 +1471,7 @@ 48 | Exp DIV Exp 鈥� 54 | Exp 鈥� LB Exp RB 55 | Exp 鈥� DOT ID + 59 | Exp 鈥� PLUS error MINUS 鍋忕Щ锛屽苟杩涘叆鐘舵€� 79 DOT 鍋忕Щ锛屽苟杩涘叆鐘舵€� 84 @@ -1455,7 +1480,7 @@ $default 浣跨敤瑙勫垯 48 浠ュ綊绾� (Exp) -鐘舵€� 102 +鐘舵€� 103 41 Exp: Exp 鈥� ASSIGNOP Exp 42 | Exp 鈥� AND Exp @@ -1468,6 +1493,7 @@ 48 | Exp 鈥� DIV Exp 54 | Exp 鈥� LB Exp RB 55 | Exp 鈥� DOT ID + 59 | Exp 鈥� PLUS error RELOP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 77 PLUS 鍋忕Щ锛屽苟杩涘叆鐘舵€� 78 @@ -1480,7 +1506,7 @@ $default 浣跨敤瑙勫垯 42 浠ュ綊绾� (Exp) -鐘舵€� 103 +鐘舵€� 104 41 Exp: Exp 鈥� ASSIGNOP Exp 42 | Exp 鈥� AND Exp @@ -1493,6 +1519,7 @@ 48 | Exp 鈥� DIV Exp 54 | Exp 鈥� LB Exp RB 55 | Exp 鈥� DOT ID + 59 | Exp 鈥� PLUS error RELOP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 77 PLUS 鍋忕Щ锛屽苟杩涘叆鐘舵€� 78 @@ -1506,14 +1533,14 @@ $default 浣跨敤瑙勫垯 43 浠ュ綊绾� (Exp) -鐘舵€� 104 +鐘舵€� 105 55 Exp: Exp DOT ID 鈥� $default 浣跨敤瑙勫垯 55 浠ュ綊绾� (Exp) -鐘舵€� 105 +鐘舵€� 106 41 Exp: Exp 鈥� ASSIGNOP Exp 42 | Exp 鈥� AND Exp @@ -1526,6 +1553,7 @@ 54 | Exp 鈥� LB Exp RB 54 | Exp LB Exp 鈥� RB 55 | Exp 鈥� DOT ID + 59 | Exp 鈥� PLUS error ASSIGNOP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 76 RELOP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 77 @@ -1537,19 +1565,19 @@ OR 鍋忕Щ锛屽苟杩涘叆鐘舵€� 83 DOT 鍋忕Щ锛屽苟杩涘叆鐘舵€� 84 LB 鍋忕Щ锛屽苟杩涘叆鐘舵€� 85 - RB 鍋忕Щ锛屽苟杩涘叆鐘舵€� 111 + RB 鍋忕Щ锛屽苟杩涘叆鐘舵€� 112 -鐘舵€� 106 +鐘舵€� 107 - 61 Args: error Args 鈥� + 62 Args: error Args 鈥� - $default 浣跨敤瑙勫垯 61 浠ュ綊绾� (Args) + $default 浣跨敤瑙勫垯 62 浠ュ綊绾� (Args) -鐘舵€� 107 +鐘舵€� 108 - 59 Args: Exp COMMA 鈥� Args + 60 Args: Exp COMMA 鈥� Args error 鍋忕Щ锛屽苟杩涘叆鐘舵€� 88 INT 鍋忕Щ锛屽苟杩涘叆鐘舵€� 48 @@ -1560,17 +1588,17 @@ LP 鍋忕Щ锛屽苟杩涘叆鐘舵€� 53 Exp 杞埌鐘舵€� 90 - Args 杞埌鐘舵€� 112 + Args 杞埌鐘舵€� 113 -鐘舵€� 108 +鐘舵€� 109 52 Exp: ID LP Args RP 鈥� $default 浣跨敤瑙勫垯 52 浠ュ綊绾� (Exp) -鐘舵€� 109 +鐘舵€� 110 30 Stmt: IF LP Exp RP 鈥� Stmt 31 | IF LP Exp RP 鈥� Stmt ELSE Stmt @@ -1588,11 +1616,11 @@ WHILE 鍋忕Щ锛屽苟杩涘叆鐘舵€� 56 CompSt 杞埌鐘舵€� 57 - Stmt 杞埌鐘舵€� 113 + Stmt 杞埌鐘舵€� 114 Exp 杞埌鐘舵€� 60 -鐘舵€� 110 +鐘舵€� 111 32 Stmt: WHILE LP Exp RP 鈥� Stmt @@ -1609,42 +1637,42 @@ WHILE 鍋忕Щ锛屽苟杩涘叆鐘舵€� 56 CompSt 杞埌鐘舵€� 57 - Stmt 杞埌鐘舵€� 114 + Stmt 杞埌鐘舵€� 115 Exp 杞埌鐘舵€� 60 -鐘舵€� 111 +鐘舵€� 112 54 Exp: Exp LB Exp RB 鈥� $default 浣跨敤瑙勫垯 54 浠ュ綊绾� (Exp) -鐘舵€� 112 +鐘舵€� 113 - 59 Args: Exp COMMA Args 鈥� + 60 Args: Exp COMMA Args 鈥� - $default 浣跨敤瑙勫垯 59 浠ュ綊绾� (Args) + $default 浣跨敤瑙勫垯 60 浠ュ綊绾� (Args) -鐘舵€� 113 +鐘舵€� 114 30 Stmt: IF LP Exp RP Stmt 鈥� 31 | IF LP Exp RP Stmt 鈥� ELSE Stmt - ELSE 鍋忕Щ锛屽苟杩涘叆鐘舵€� 115 + ELSE 鍋忕Щ锛屽苟杩涘叆鐘舵€� 116 $default 浣跨敤瑙勫垯 30 浠ュ綊绾� (Stmt) -鐘舵€� 114 +鐘舵€� 115 32 Stmt: WHILE LP Exp RP Stmt 鈥� $default 浣跨敤瑙勫垯 32 浠ュ綊绾� (Stmt) -鐘舵€� 115 +鐘舵€� 116 31 Stmt: IF LP Exp RP Stmt ELSE 鈥� Stmt @@ -1661,11 +1689,11 @@ WHILE 鍋忕Щ锛屽苟杩涘叆鐘舵€� 56 CompSt 杞埌鐘舵€� 57 - Stmt 杞埌鐘舵€� 116 + Stmt 杞埌鐘舵€� 117 Exp 杞埌鐘舵€� 60 -鐘舵€� 116 +鐘舵€� 117 31 Stmt: IF LP Exp RP Stmt ELSE Stmt 鈥� diff --git a/Code/syntax.tab.c b/Code/syntax.tab.c index 0af65659399ff14fdfaeb2818494b5e2048cc792..da6e58f4893fd4ea2c3ce8feecd8db7430e16f15 100644 --- a/Code/syntax.tab.c +++ b/Code/syntax.tab.c @@ -70,12 +70,13 @@ #line 3 "./syntax.y" int yycolumn = 1; + char linetext[128]; #define YY_USER_ACTION \ yylloc.first_line = yylloc.last_line = yylineno; \ yylloc.first_column = yycolumn; \ yylloc.last_column = yycolumn + yyleng - 1; \ yycolumn += yyleng; -#line 12 "./syntax.y" +#line 13 "./syntax.y" #include <stdio.h> #include "lex.yy.c" @@ -90,7 +91,7 @@ extern int syntax; -#line 94 "./syntax.tab.c" +#line 95 "./syntax.tab.c" # ifndef YY_CAST # ifdef __cplusplus @@ -501,16 +502,16 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 11 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 264 +#define YYLAST 270 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 31 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 22 /* YYNRULES -- Number of rules. */ -#define YYNRULES 62 +#define YYNRULES 63 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 117 +#define YYNSTATES 118 /* YYMAXUTOK -- Last valid token kind. */ #define YYMAXUTOK 285 @@ -562,13 +563,13 @@ 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, 116, 117, - 122, 123, 125, 126, 128, 129, 131, 135, 136, 138, - 139, 141, 142, 144, 149, 150, 152, 153, 155, 156, - 157, 158, 159, 160, 161, 166, 167, 169, 171, 172, - 174, 175, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 199, 200, 201 + 0, 108, 108, 110, 111, 113, 114, 115, 117, 118, + 123, 124, 126, 127, 129, 130, 132, 136, 137, 139, + 140, 142, 143, 145, 150, 151, 153, 154, 156, 157, + 158, 159, 160, 161, 162, 167, 168, 170, 172, 173, + 175, 176, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 201, 202, 203 }; #endif @@ -601,7 +602,7 @@ yysymbol_name (yysymbol_kind_t yysymbol) } #endif -#define YYPACT_NINF (-84) +#define YYPACT_NINF (-67) #define yypact_value_is_default(Yyn) \ ((Yyn) == YYPACT_NINF) @@ -615,18 +616,18 @@ yysymbol_name (yysymbol_kind_t yysymbol) STATE-NUM. */ static const yytype_int16 yypact[] = { - 51, -84, 9, 17, -84, 51, 93, -84, -5, 34, - -84, -84, -84, 55, -84, 74, 1, 12, 51, 57, - -84, 78, 98, 80, 51, -84, 78, 81, 51, -84, - 78, 82, 100, -84, -84, 99, -84, 35, -2, 116, - 128, -84, -84, 102, -84, 51, -84, 27, -84, -84, - 117, 92, 92, 92, 92, 119, 131, -84, 113, 35, - 104, 92, -84, 78, -84, -84, 67, 39, 39, 162, - 118, 92, 92, -84, -84, -84, 92, 92, 92, 92, - 92, 92, 92, 92, 146, 92, 204, -84, 89, -84, - 133, 132, -84, -84, 176, 190, 204, 237, 243, 39, - 32, 39, 230, 217, -84, 147, -84, 89, -84, 62, - 62, -84, -84, 125, -84, 62, -84 + 51, -67, 9, 18, -67, 51, 11, -67, 10, 60, + -67, -67, -67, 22, -67, 49, -2, 12, 51, 57, + -67, 69, 77, 72, 51, -67, 69, 80, 51, -67, + 69, 87, 103, -67, -67, 90, -67, 35, 39, 108, + 120, -67, -67, 107, -67, 51, -67, 0, -67, -67, + 122, 98, 98, 98, 98, 123, 125, -67, 105, 35, + 110, 98, -67, 69, -67, -67, 67, 247, 247, 168, + 124, 98, 98, -67, -67, -67, 98, 98, 89, 98, + 98, 98, 98, 98, 138, 98, 210, -67, 94, -67, + 139, 136, -67, -67, 182, 196, 210, 243, -67, 249, + 247, 32, 247, 236, 223, -67, 153, -67, 94, -67, + 62, 62, -67, -67, 129, -67, 62, -67 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -643,17 +644,17 @@ static const yytype_int8 yydefact[] = 0, 0, 37, 0, 21, 34, 0, 51, 52, 0, 0, 0, 0, 24, 26, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 39, 0, 54, - 61, 0, 50, 30, 0, 0, 42, 45, 46, 47, - 48, 49, 43, 44, 56, 0, 62, 0, 53, 0, - 0, 55, 60, 31, 33, 0, 32 + 62, 0, 50, 30, 0, 0, 42, 45, 60, 46, + 47, 48, 49, 43, 44, 56, 0, 63, 0, 53, + 0, 0, 55, 61, 31, 33, 0, 32 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -84, -84, 159, -84, 144, 4, -84, -84, -84, -19, - -84, 121, -84, 150, 120, -68, -12, -84, 130, -84, - -51, -83 + -67, -67, 154, -67, 137, 4, -67, -67, -67, -19, + -67, 126, -67, 155, 111, -60, -16, -67, 150, -67, + -51, -66 }; /* YYDEFGOTO[NTERM-NUM]. */ @@ -669,64 +670,66 @@ static const yytype_int8 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int8 yytable[] = { - 67, 68, 69, 70, 6, 106, 61, 38, 21, 6, - 86, 43, 37, 23, 8, 90, 42, 11, -14, 22, - 94, 95, 22, 30, 112, 96, 97, 98, 99, 100, - 101, 102, 103, 65, 105, 24, 47, 90, 48, 49, - 50, 113, 114, 79, 38, 81, 51, 116, 84, 30, - 79, 36, 52, 85, 53, 84, 90, 18, 24, -27, - 85, 54, 55, 47, 56, 48, 49, 50, 88, 1, - 48, 49, 50, 51, 19, 1, 2, 29, 51, 52, - 20, 53, 2, 33, 52, 24, 53, 89, 54, 55, - 88, 56, 48, 49, 50, 48, 49, 50, 13, 14, - 51, 35, 44, 51, 36, 41, 52, 45, 53, 52, - 75, 53, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 46, 62, 22, 93, 85, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 63, 66, 73, 71, 85, - 107, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 72, 104, 108, 115, 85, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 12, 34, 64, 25, 85, 111, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 74, - 0, 0, 92, 85, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 87, 0, 0, 109, 85, 76, 77, + 67, 68, 69, 70, 6, 21, 65, 38, 37, 6, + 86, 43, 42, 23, 8, 90, 13, 14, 11, 22, + 94, 95, 107, 30, 36, 96, 97, 99, 100, 101, + 102, 103, 104, -14, 106, 24, 47, 90, 48, 49, + 50, 19, 113, 79, 38, 81, 51, 61, 84, 30, + 114, 115, 52, 85, 53, 20, 117, 90, 24, -27, + 22, 54, 55, 47, 56, 48, 49, 50, 88, 1, + 48, 49, 50, 51, 33, 1, 2, 29, 51, 52, + 35, 53, 2, 18, 52, 24, 53, 89, 54, 55, + 98, 56, 48, 49, 50, 88, 36, 48, 49, 50, + 51, 48, 49, 50, 41, 51, 52, 44, 53, 51, + 45, 52, 46, 53, 62, 52, 75, 53, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 63, 22, 73, + 93, 85, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 66, 71, 105, 72, 85, 108, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 109, 116, 34, 12, + 85, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 74, 64, 25, 0, 85, 112, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 0, 0, 0, 92, 85, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 0, + 0, 0, 110, 85, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 87, 0, 0, 111, 85, 76, 77, 78, 79, 80, 81, 82, 83, 84, 0, 0, 0, - 110, 85, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 0, 0, 0, 0, 85, 77, 78, 79, 80, - 81, 82, 0, 84, 0, 0, 0, 0, 85, 77, - 78, 79, 80, 81, 0, 0, 84, 78, 79, 80, - 81, 85, 0, 84, 79, 80, 81, 0, 85, 84, - 0, 0, 0, 0, 85 + 0, 85, 77, 78, 79, 80, 81, 82, 0, 84, + 0, 0, 0, 0, 85, 77, 78, 79, 80, 81, + 0, 0, 84, 78, 79, 80, 81, 85, 79, 84, + 79, 80, 81, 84, 85, 84, 0, 0, 85, 0, + 85 }; static const yytype_int8 yycheck[] = { - 51, 52, 53, 54, 0, 88, 8, 26, 7, 5, - 61, 30, 24, 1, 5, 66, 28, 0, 23, 21, - 71, 72, 21, 19, 107, 76, 77, 78, 79, 80, - 81, 82, 83, 6, 85, 23, 1, 88, 3, 4, - 5, 109, 110, 11, 63, 13, 11, 115, 16, 45, - 11, 24, 17, 21, 19, 16, 107, 23, 23, 24, + 51, 52, 53, 54, 0, 7, 6, 26, 24, 5, + 61, 30, 28, 1, 5, 66, 5, 6, 0, 21, + 71, 72, 88, 19, 24, 76, 77, 78, 79, 80, + 81, 82, 83, 23, 85, 23, 1, 88, 3, 4, + 5, 19, 108, 11, 63, 13, 11, 8, 16, 45, + 110, 111, 17, 21, 19, 6, 116, 108, 23, 24, 21, 26, 27, 1, 29, 3, 4, 5, 1, 18, - 3, 4, 5, 11, 19, 18, 25, 20, 11, 17, - 6, 19, 25, 5, 17, 23, 19, 20, 26, 27, - 1, 29, 3, 4, 5, 3, 4, 5, 5, 6, - 11, 3, 20, 11, 24, 24, 17, 7, 19, 17, - 6, 19, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 22, 6, 21, 6, 21, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 7, 19, 24, 19, 21, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 19, 5, 20, 28, 21, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 5, 21, 45, 17, 21, 22, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 59, + 3, 4, 5, 11, 5, 18, 25, 20, 11, 17, + 3, 19, 25, 23, 17, 23, 19, 20, 26, 27, + 1, 29, 3, 4, 5, 1, 24, 3, 4, 5, + 11, 3, 4, 5, 24, 11, 17, 20, 19, 11, + 7, 17, 22, 19, 6, 17, 6, 19, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 7, 21, 24, + 6, 21, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 19, 19, 5, 19, 21, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 20, 28, 21, 5, + 21, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 59, 45, 17, -1, 21, 22, 8, 9, 10, 11, + 12, 13, 14, 15, 16, -1, -1, -1, 20, 21, + 8, 9, 10, 11, 12, 13, 14, 15, 16, -1, -1, -1, 20, 21, 8, 9, 10, 11, 12, 13, 14, 15, 16, 63, -1, -1, 20, 21, 8, 9, 10, 11, 12, 13, 14, 15, 16, -1, -1, -1, - 20, 21, 8, 9, 10, 11, 12, 13, 14, 15, - 16, -1, -1, -1, -1, 21, 9, 10, 11, 12, - 13, 14, -1, 16, -1, -1, -1, -1, 21, 9, - 10, 11, 12, 13, -1, -1, 16, 10, 11, 12, - 13, 21, -1, 16, 11, 12, 13, -1, 21, 16, - -1, -1, -1, -1, 21 + -1, 21, 9, 10, 11, 12, 13, 14, -1, 16, + -1, -1, -1, -1, 21, 9, 10, 11, 12, 13, + -1, -1, 16, 10, 11, 12, 13, 21, 11, 16, + 11, 12, 13, 16, 21, 16, -1, -1, 21, -1, + 21 }; /* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of @@ -742,9 +745,9 @@ static const yytype_int8 yystos[] = 51, 8, 6, 7, 42, 6, 19, 51, 51, 51, 51, 19, 19, 24, 45, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 21, 51, 49, 1, 20, - 51, 52, 20, 6, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 5, 51, 52, 7, 20, 20, - 20, 22, 52, 46, 46, 28, 46 + 51, 52, 20, 6, 51, 51, 51, 51, 1, 51, + 51, 51, 51, 51, 51, 5, 51, 52, 7, 20, + 20, 20, 22, 52, 46, 46, 28, 46 }; /* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ @@ -756,7 +759,7 @@ static const yytype_int8 yyr1[] = 46, 46, 46, 46, 46, 47, 47, 48, 49, 49, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 52, 52, 52 + 51, 52, 52, 52 }; /* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ @@ -768,7 +771,7 @@ static const yytype_int8 yyr2[] = 3, 5, 7, 5, 2, 2, 0, 3, 1, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 4, 3, 4, 3, 1, 1, 1, - 3, 1, 2 + 3, 3, 1, 2 }; @@ -1345,373 +1348,379 @@ yyreduce: switch (yyn) { case 2: /* Program: ExtDefList */ -#line 107 "./syntax.y" +#line 108 "./syntax.y" { tree->root = (yyval.node) = Operator((yyval.node),"Program",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1351 "./syntax.tab.c" +#line 1354 "./syntax.tab.c" break; case 3: /* ExtDefList: ExtDef ExtDefList */ -#line 109 "./syntax.y" +#line 110 "./syntax.y" { (yyval.node) = Operator((yyval.node),"ExtDefList",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1357 "./syntax.tab.c" +#line 1360 "./syntax.tab.c" break; case 4: /* ExtDefList: %empty */ -#line 110 "./syntax.y" +#line 111 "./syntax.y" { (yyval.node) = NULL; } -#line 1363 "./syntax.tab.c" +#line 1366 "./syntax.tab.c" break; case 5: /* ExtDef: Specifier ExtDecList SEMI */ -#line 112 "./syntax.y" +#line 113 "./syntax.y" { (yyval.node) = Operator((yyval.node),"ExtDef",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1369 "./syntax.tab.c" +#line 1372 "./syntax.tab.c" break; case 6: /* ExtDef: Specifier SEMI */ -#line 113 "./syntax.y" +#line 114 "./syntax.y" { (yyval.node) = Operator((yyval.node),"ExtDef",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1375 "./syntax.tab.c" +#line 1378 "./syntax.tab.c" break; case 7: /* ExtDef: Specifier FunDec CompSt */ -#line 114 "./syntax.y" +#line 115 "./syntax.y" { (yyval.node) = Operator((yyval.node),"ExtDef",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1381 "./syntax.tab.c" +#line 1384 "./syntax.tab.c" break; case 8: /* ExtDecList: VarDec */ -#line 116 "./syntax.y" +#line 117 "./syntax.y" { (yyval.node) = Operator((yyval.node),"ExtDecList",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1387 "./syntax.tab.c" +#line 1390 "./syntax.tab.c" break; case 9: /* ExtDecList: VarDec COMMA ExtDecList */ -#line 117 "./syntax.y" +#line 118 "./syntax.y" { (yyval.node) = Operator((yyval.node),"ExtDecList",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1393 "./syntax.tab.c" +#line 1396 "./syntax.tab.c" break; case 10: /* Specifier: TYPE */ -#line 122 "./syntax.y" +#line 123 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Specifier",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1399 "./syntax.tab.c" +#line 1402 "./syntax.tab.c" break; case 11: /* Specifier: StructSpecifier */ -#line 123 "./syntax.y" +#line 124 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Specifier",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1405 "./syntax.tab.c" +#line 1408 "./syntax.tab.c" break; case 12: /* StructSpecifier: STRUCT OptTag LC DefList RC */ -#line 125 "./syntax.y" +#line 126 "./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 1411 "./syntax.tab.c" +#line 1414 "./syntax.tab.c" break; case 13: /* StructSpecifier: STRUCT Tag */ -#line 126 "./syntax.y" +#line 127 "./syntax.y" { (yyval.node) = Operator((yyval.node),"StructSpecifier",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1417 "./syntax.tab.c" +#line 1420 "./syntax.tab.c" break; case 14: /* OptTag: ID */ -#line 128 "./syntax.y" +#line 129 "./syntax.y" { (yyval.node) = Operator((yyval.node),"OptTag",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1423 "./syntax.tab.c" +#line 1426 "./syntax.tab.c" break; case 15: /* OptTag: %empty */ -#line 129 "./syntax.y" +#line 130 "./syntax.y" { (yyval.node) = NULL; } -#line 1429 "./syntax.tab.c" +#line 1432 "./syntax.tab.c" break; case 16: /* Tag: ID */ -#line 131 "./syntax.y" +#line 132 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Tag",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1435 "./syntax.tab.c" +#line 1438 "./syntax.tab.c" break; case 17: /* VarDec: ID */ -#line 135 "./syntax.y" +#line 136 "./syntax.y" { (yyval.node) = Operator((yyval.node),"VarDec",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1441 "./syntax.tab.c" +#line 1444 "./syntax.tab.c" break; case 18: /* VarDec: VarDec LB INT RB */ -#line 136 "./syntax.y" +#line 137 "./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 1447 "./syntax.tab.c" +#line 1450 "./syntax.tab.c" break; case 19: /* FunDec: ID LP VarList RP */ -#line 138 "./syntax.y" +#line 139 "./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 1453 "./syntax.tab.c" +#line 1456 "./syntax.tab.c" break; case 20: /* FunDec: ID LP RP */ -#line 139 "./syntax.y" +#line 140 "./syntax.y" { (yyval.node) = Operator((yyval.node),"FunDec",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1459 "./syntax.tab.c" +#line 1462 "./syntax.tab.c" break; case 21: /* VarList: ParamDec COMMA VarList */ -#line 141 "./syntax.y" +#line 142 "./syntax.y" { (yyval.node) = Operator((yyval.node),"VarList",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1465 "./syntax.tab.c" +#line 1468 "./syntax.tab.c" break; case 22: /* VarList: ParamDec */ -#line 142 "./syntax.y" +#line 143 "./syntax.y" { (yyval.node) = Operator((yyval.node),"ParamDec",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1471 "./syntax.tab.c" +#line 1474 "./syntax.tab.c" break; case 23: /* ParamDec: Specifier VarDec */ -#line 144 "./syntax.y" +#line 145 "./syntax.y" { (yyval.node) = Operator((yyval.node),"ParamDec",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1477 "./syntax.tab.c" +#line 1480 "./syntax.tab.c" break; case 24: /* CompSt: LC DefList StmtList RC */ -#line 149 "./syntax.y" +#line 150 "./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 1483 "./syntax.tab.c" +#line 1486 "./syntax.tab.c" break; case 25: /* CompSt: error RC */ -#line 150 "./syntax.y" +#line 151 "./syntax.y" { (yyval.node) = Operator((yyval.node),"CompSt",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node));/* error */ } -#line 1489 "./syntax.tab.c" +#line 1492 "./syntax.tab.c" break; case 26: /* StmtList: Stmt StmtList */ -#line 152 "./syntax.y" +#line 153 "./syntax.y" { (yyval.node) = Operator((yyval.node),"StmtList",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1495 "./syntax.tab.c" +#line 1498 "./syntax.tab.c" break; case 27: /* StmtList: %empty */ -#line 153 "./syntax.y" +#line 154 "./syntax.y" { (yyval.node) = NULL; } -#line 1501 "./syntax.tab.c" +#line 1504 "./syntax.tab.c" break; case 28: /* Stmt: Exp SEMI */ -#line 155 "./syntax.y" +#line 156 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Stmt",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1507 "./syntax.tab.c" +#line 1510 "./syntax.tab.c" break; case 29: /* Stmt: CompSt */ -#line 156 "./syntax.y" +#line 157 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Stmt",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1513 "./syntax.tab.c" +#line 1516 "./syntax.tab.c" break; case 30: /* Stmt: RETURN Exp SEMI */ -#line 157 "./syntax.y" +#line 158 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Stmt",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1519 "./syntax.tab.c" +#line 1522 "./syntax.tab.c" break; case 31: /* Stmt: IF LP Exp RP Stmt */ -#line 158 "./syntax.y" +#line 159 "./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 1525 "./syntax.tab.c" +#line 1528 "./syntax.tab.c" break; case 32: /* Stmt: IF LP Exp RP Stmt ELSE Stmt */ -#line 159 "./syntax.y" +#line 160 "./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 1531 "./syntax.tab.c" +#line 1534 "./syntax.tab.c" break; case 33: /* Stmt: WHILE LP Exp RP Stmt */ -#line 160 "./syntax.y" +#line 161 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Stmt",(yyloc).first_line,5,(yyvsp[-4].node),(yyvsp[-3].node),(yyvsp[-2].node),(yyvsp[-2].node),(yyvsp[-1].node)); } -#line 1537 "./syntax.tab.c" +#line 1540 "./syntax.tab.c" break; case 34: /* Stmt: error SEMI */ -#line 161 "./syntax.y" +#line 162 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Stmt",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node));/* error */ } -#line 1543 "./syntax.tab.c" +#line 1546 "./syntax.tab.c" break; case 35: /* DefList: Def DefList */ -#line 166 "./syntax.y" +#line 167 "./syntax.y" { (yyval.node) = Operator((yyval.node),"DefList",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1549 "./syntax.tab.c" +#line 1552 "./syntax.tab.c" break; case 36: /* DefList: %empty */ -#line 167 "./syntax.y" +#line 168 "./syntax.y" { (yyval.node) = NULL; } -#line 1555 "./syntax.tab.c" +#line 1558 "./syntax.tab.c" break; case 37: /* Def: Specifier DecList SEMI */ -#line 169 "./syntax.y" +#line 170 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Def",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1561 "./syntax.tab.c" +#line 1564 "./syntax.tab.c" break; case 38: /* DecList: Dec */ -#line 171 "./syntax.y" +#line 172 "./syntax.y" { (yyval.node) = Operator((yyval.node),"DecList",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1567 "./syntax.tab.c" +#line 1570 "./syntax.tab.c" break; case 39: /* DecList: Dec COMMA DecList */ -#line 172 "./syntax.y" +#line 173 "./syntax.y" { (yyval.node) = Operator((yyval.node),"DecList",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1573 "./syntax.tab.c" +#line 1576 "./syntax.tab.c" break; case 40: /* Dec: VarDec */ -#line 174 "./syntax.y" +#line 175 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Dec",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1579 "./syntax.tab.c" +#line 1582 "./syntax.tab.c" break; case 41: /* Dec: VarDec ASSIGNOP Exp */ -#line 175 "./syntax.y" +#line 176 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Dec",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1585 "./syntax.tab.c" +#line 1588 "./syntax.tab.c" break; case 42: /* Exp: Exp ASSIGNOP Exp */ -#line 180 "./syntax.y" +#line 181 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1591 "./syntax.tab.c" +#line 1594 "./syntax.tab.c" break; case 43: /* Exp: Exp AND Exp */ -#line 181 "./syntax.y" +#line 182 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1597 "./syntax.tab.c" +#line 1600 "./syntax.tab.c" break; case 44: /* Exp: Exp OR Exp */ -#line 182 "./syntax.y" +#line 183 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1603 "./syntax.tab.c" +#line 1606 "./syntax.tab.c" break; case 45: /* Exp: Exp RELOP Exp */ -#line 183 "./syntax.y" +#line 184 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1609 "./syntax.tab.c" +#line 1612 "./syntax.tab.c" break; case 46: /* Exp: Exp PLUS Exp */ -#line 184 "./syntax.y" +#line 185 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1615 "./syntax.tab.c" +#line 1618 "./syntax.tab.c" break; case 47: /* Exp: Exp MINUS Exp */ -#line 185 "./syntax.y" +#line 186 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1621 "./syntax.tab.c" +#line 1624 "./syntax.tab.c" break; case 48: /* Exp: Exp STAR Exp */ -#line 186 "./syntax.y" +#line 187 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1627 "./syntax.tab.c" +#line 1630 "./syntax.tab.c" break; case 49: /* Exp: Exp DIV Exp */ -#line 187 "./syntax.y" +#line 188 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1633 "./syntax.tab.c" +#line 1636 "./syntax.tab.c" break; case 50: /* Exp: LP Exp RP */ -#line 188 "./syntax.y" +#line 189 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1639 "./syntax.tab.c" +#line 1642 "./syntax.tab.c" break; case 51: /* Exp: MINUS Exp */ -#line 189 "./syntax.y" +#line 190 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1645 "./syntax.tab.c" +#line 1648 "./syntax.tab.c" break; case 52: /* Exp: NOT Exp */ -#line 190 "./syntax.y" +#line 191 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1651 "./syntax.tab.c" +#line 1654 "./syntax.tab.c" break; case 53: /* Exp: ID LP Args RP */ -#line 191 "./syntax.y" +#line 192 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,4,(yyvsp[-3].node),(yyvsp[-3].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1657 "./syntax.tab.c" +#line 1660 "./syntax.tab.c" break; case 54: /* Exp: ID LP RP */ -#line 192 "./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 1663 "./syntax.tab.c" +#line 1666 "./syntax.tab.c" break; case 55: /* Exp: Exp LB Exp RB */ -#line 193 "./syntax.y" +#line 194 "./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 1669 "./syntax.tab.c" +#line 1672 "./syntax.tab.c" break; case 56: /* Exp: Exp DOT ID */ -#line 194 "./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 1675 "./syntax.tab.c" +#line 1678 "./syntax.tab.c" break; case 57: /* Exp: ID */ -#line 195 "./syntax.y" +#line 196 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1681 "./syntax.tab.c" +#line 1684 "./syntax.tab.c" break; case 58: /* Exp: INT */ -#line 196 "./syntax.y" +#line 197 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1687 "./syntax.tab.c" +#line 1690 "./syntax.tab.c" break; case 59: /* Exp: FLOAT */ -#line 197 "./syntax.y" +#line 198 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Exp",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1693 "./syntax.tab.c" +#line 1696 "./syntax.tab.c" break; - case 60: /* Args: Exp COMMA Args */ + case 60: /* Exp: Exp PLUS error */ #line 199 "./syntax.y" + { (yyval.node) = NULL; } +#line 1702 "./syntax.tab.c" + break; + + case 61: /* Args: Exp COMMA Args */ +#line 201 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Args",(yyloc).first_line,3,(yyvsp[-2].node),(yyvsp[-1].node),(yyvsp[0].node)); } -#line 1699 "./syntax.tab.c" +#line 1708 "./syntax.tab.c" break; - case 61: /* Args: Exp */ -#line 200 "./syntax.y" + case 62: /* Args: Exp */ +#line 202 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Args",(yyloc).first_line,1,(yyvsp[0].node)); } -#line 1705 "./syntax.tab.c" +#line 1714 "./syntax.tab.c" break; - case 62: /* Args: error Args */ -#line 201 "./syntax.y" + case 63: /* Args: error Args */ +#line 203 "./syntax.y" { (yyval.node) = Operator((yyval.node),"Args",(yyloc).first_line,2,(yyvsp[-1].node),(yyvsp[0].node));/* error */ } -#line 1711 "./syntax.tab.c" +#line 1720 "./syntax.tab.c" break; -#line 1715 "./syntax.tab.c" +#line 1724 "./syntax.tab.c" default: break; } @@ -1909,6 +1918,6 @@ yyreturnlab: return yyresult; } -#line 204 "./syntax.y" +#line 206 "./syntax.y" diff --git a/Code/syntax.tab.h b/Code/syntax.tab.h index a6f5959fb9f4c49dd7ba3a4ceda8f0a88b2ccdde..b5aacb8c507371b3dc8a8ce2d0a3b2b63984ad05 100644 --- a/Code/syntax.tab.h +++ b/Code/syntax.tab.h @@ -90,7 +90,7 @@ extern int yydebug; #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED union YYSTYPE { -#line 28 "./syntax.y" +#line 29 "./syntax.y" struct __Tree_node_t * node; diff --git a/Code/syntax.y b/Code/syntax.y index 14bafc8c99790f93326007228c9440b34cbf8ea9..325c18e6cf45d4c017bfd273bc89903c8e4297c3 100755 --- a/Code/syntax.y +++ b/Code/syntax.y @@ -2,6 +2,7 @@ %{ int yycolumn = 1; + char linetext[128]; #define YY_USER_ACTION \ yylloc.first_line = yylloc.last_line = yylineno; \ yylloc.first_column = yycolumn; \ @@ -195,6 +196,7 @@ Exp : Exp ASSIGNOP Exp { $$ = Operator($$,"Exp",@$.first_line,3,$1, | ID { $$ = Operator($$,"Exp",@$.first_line,1,$1); } | INT { $$ = Operator($$,"Exp",@$.first_line,1,$1); } | FLOAT { $$ = Operator($$,"Exp",@$.first_line,1,$1); } + | Exp PLUS error { $$ = NULL; } ; Args : Exp COMMA Args { $$ = Operator($$,"Args",@$.first_line,3,$1,$2,$3); } | Exp { $$ = Operator($$,"Args",@$.first_line,1,$1); } diff --git a/Test/test1.cmm b/Test/test1.cmm index 02fa459ce2a681612c87a125a6fb3770e626636b..aee0c73dcd8037da16773d66a1b4c304184fa3c3 100644 --- a/Test/test1.cmm +++ b/Test/test1.cmm @@ -1,5 +1,5 @@ int inc() { int i = 0123; - int j = 0x3F; + int j = 0x3F -=; } diff --git a/task.md b/task.md index 7cc4f07b6434ae6f1a771d00a1373fc7f167e9f8..613a37d10393325dcfc2b6d590485e72c2f4a379 100644 --- a/task.md +++ b/task.md @@ -9,3 +9,7 @@ CompSt -> error RC Exp -> error RP | error RB | error OPs(+-*/ && || RELOP) Args -> error COMMA + +杩橀渶瑕佸仛锛� + +閿欒鎭㈠锛屾敞閲�