|  |  |  | @ -9,9 +9,11 @@ | 
			
		
	
		
			
				
					|  |  |  |  | #include "ast.h" | 
			
		
	
		
			
				
					|  |  |  |  | #include "parser.h" | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #define TESTINFO(type,value) printf("LexToken(%s,%s,%d))\n",type,value,yylineno) | 
			
		
	
		
			
				
					|  |  |  |  | int line_cnt = 1; | 
			
		
	
		
			
				
					|  |  |  |  | %} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | MultilineComment	    "/*"([^\*]|(\*)*[^\*/])*(\*)*"*/" | 
			
		
	
		
			
				
					|  |  |  |  | SingleLineComment	    "//"[^\n]+ | 
			
		
	
		
			
				
					|  |  |  |  | Lex_err [1-9][0-9]*[a-zA-Z]+[0-9]*|0[0-7]*[8-9a-zA-Z_]+[0-9a-zA-Z_]*  | 
			
		
	
	
		
			
				
					|  |  |  | @ -26,39 +28,39 @@ Lex_err [1-9][0-9]*[a-zA-Z]+[0-9]*|0[0-7]*[8-9a-zA-Z_]+[0-9a-zA-Z_]* | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | "\n" { line_cnt++; } | 
			
		
	
		
			
				
					|  |  |  |  | [ \t] { } | 
			
		
	
		
			
				
					|  |  |  |  | "int" { return INT; } | 
			
		
	
		
			
				
					|  |  |  |  | "float" { return FLOAT; } | 
			
		
	
		
			
				
					|  |  |  |  | "void" { return VOID; } | 
			
		
	
		
			
				
					|  |  |  |  | "const" { return CONST; } | 
			
		
	
		
			
				
					|  |  |  |  | "return" { return RETURN; } | 
			
		
	
		
			
				
					|  |  |  |  | "if" { return IF; } | 
			
		
	
		
			
				
					|  |  |  |  | "else" { return ELSE; } | 
			
		
	
		
			
				
					|  |  |  |  | "while" { return WHILE; } | 
			
		
	
		
			
				
					|  |  |  |  | "break" { return BREAK; } | 
			
		
	
		
			
				
					|  |  |  |  | "continue" { return CONTINUE; } | 
			
		
	
		
			
				
					|  |  |  |  | "(" { return LP; } | 
			
		
	
		
			
				
					|  |  |  |  | ")" { return RP; } | 
			
		
	
		
			
				
					|  |  |  |  | "[" { return LB; } | 
			
		
	
		
			
				
					|  |  |  |  | "]" { return RB; } | 
			
		
	
		
			
				
					|  |  |  |  | "{" { return LC; } | 
			
		
	
		
			
				
					|  |  |  |  | "}" { return RC; } | 
			
		
	
		
			
				
					|  |  |  |  | "," { return COMMA; } | 
			
		
	
		
			
				
					|  |  |  |  | ";" { return SEMICOLON; } | 
			
		
	
		
			
				
					|  |  |  |  | "+" { return PLUS; } | 
			
		
	
		
			
				
					|  |  |  |  | "-" { return MINUS; } | 
			
		
	
		
			
				
					|  |  |  |  | "!" { return NOT; } | 
			
		
	
		
			
				
					|  |  |  |  | "=" { return ASSIGN; } | 
			
		
	
		
			
				
					|  |  |  |  | "*" { return MUL; } | 
			
		
	
		
			
				
					|  |  |  |  | "/" { return DIV; } | 
			
		
	
		
			
				
					|  |  |  |  | "%" { return MOD; } | 
			
		
	
		
			
				
					|  |  |  |  | "&&" { return AND; } | 
			
		
	
		
			
				
					|  |  |  |  | "||" { return OR; } | 
			
		
	
		
			
				
					|  |  |  |  | "==" { return EQ; } | 
			
		
	
		
			
				
					|  |  |  |  | "!=" { return NE; } | 
			
		
	
		
			
				
					|  |  |  |  | "<" { return LT; } | 
			
		
	
		
			
				
					|  |  |  |  | "<=" { return LE; } | 
			
		
	
		
			
				
					|  |  |  |  | ">" { return GT; } | 
			
		
	
		
			
				
					|  |  |  |  | ">=" { return GE; } | 
			
		
	
		
			
				
					|  |  |  |  | "int" { TESTINFO("INT"); return INT; } | 
			
		
	
		
			
				
					|  |  |  |  | "float" { TESTINFO("FLOAT"); return FLOAT; } | 
			
		
	
		
			
				
					|  |  |  |  | "void" { TESTINFO("VOID");return VOID; } | 
			
		
	
		
			
				
					|  |  |  |  | "const" { TESTINFO("CONST"); return CONST; } | 
			
		
	
		
			
				
					|  |  |  |  | "return" { TESTINFO("RETURN"); return RETURN; } | 
			
		
	
		
			
				
					|  |  |  |  | "if" { TESTINFO("IF"); return IF; } | 
			
		
	
		
			
				
					|  |  |  |  | "else" { TESTINFO("ELSE") return ELSE; } | 
			
		
	
		
			
				
					|  |  |  |  | "while" { TESTINFO("WHILE");return WHILE; } | 
			
		
	
		
			
				
					|  |  |  |  | "break" { TESTINFO("BREAK");return BREAK; } | 
			
		
	
		
			
				
					|  |  |  |  | "continue" { TESTINFO("CONTINUE"); return CONTINUE; } | 
			
		
	
		
			
				
					|  |  |  |  | "(" { TESTINFO("LP");return LP; } | 
			
		
	
		
			
				
					|  |  |  |  | ")" { TESTINFO("RP");return RP; } | 
			
		
	
		
			
				
					|  |  |  |  | "[" { TESTINFO("LB");return LB; } | 
			
		
	
		
			
				
					|  |  |  |  | "]" { TESTINFO("RB");return RB; } | 
			
		
	
		
			
				
					|  |  |  |  | "{" { TESTINFO("LC");return LC; } | 
			
		
	
		
			
				
					|  |  |  |  | "}" { TESTINFO("RC");return RC; } | 
			
		
	
		
			
				
					|  |  |  |  | "," { TESTINFO("COMMA");return COMMA; } | 
			
		
	
		
			
				
					|  |  |  |  | ";" { TESTINFO("SEMI");return SEMICOLON; } | 
			
		
	
		
			
				
					|  |  |  |  | "+" { TESTINFO("PLUS");return PLUS; } | 
			
		
	
		
			
				
					|  |  |  |  | "-" { TESTINFO(MINUS);return MINUS; } | 
			
		
	
		
			
				
					|  |  |  |  | "!" { TESTINFO("NOT");return NOT; } | 
			
		
	
		
			
				
					|  |  |  |  | "=" { TESTINFO("ASSIGN");return ASSIGN; } | 
			
		
	
		
			
				
					|  |  |  |  | "*" { TESTINFO("MUL");return MUL; } | 
			
		
	
		
			
				
					|  |  |  |  | "/" { TESTINFO("DIV");return DIV; } | 
			
		
	
		
			
				
					|  |  |  |  | "%" { TESTINFO("MOD");return MOD; } | 
			
		
	
		
			
				
					|  |  |  |  | "&&" { TESTINFO("AND");return AND; } | 
			
		
	
		
			
				
					|  |  |  |  | "||" { TESTINFO("OR");return OR; } | 
			
		
	
		
			
				
					|  |  |  |  | "==" { TESTINFO("EQ");return EQ; } | 
			
		
	
		
			
				
					|  |  |  |  | "!=" { TESTINFO("NE");return NE; } | 
			
		
	
		
			
				
					|  |  |  |  | "<" { TESTINFO("LT");return LT; } | 
			
		
	
		
			
				
					|  |  |  |  | "<=" { TESTINFO("LE");return LE; } | 
			
		
	
		
			
				
					|  |  |  |  | ">" { TESTINFO("GT");return GT; } | 
			
		
	
		
			
				
					|  |  |  |  | ">=" { TESTINFO("GE");return GE; } | 
			
		
	
		
			
				
					|  |  |  |  | 0[xX][0-9a-fA-F]* { | 
			
		
	
		
			
				
					|  |  |  |  |     int val = 0; | 
			
		
	
		
			
				
					|  |  |  |  |     int len = strlen(yytext); | 
			
		
	
	
		
			
				
					|  |  |  | @ -70,6 +72,7 @@ Lex_err [1-9][0-9]*[a-zA-Z]+[0-9]*|0[0-7]*[8-9a-zA-Z_]+[0-9a-zA-Z_]* | 
			
		
	
		
			
				
					|  |  |  |  |             val += yytext[i] - 'a' + 10; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     yylval.int_val = val; | 
			
		
	
		
			
				
					|  |  |  |  |     TESTINFO("INT_LIT"); | 
			
		
	
		
			
				
					|  |  |  |  |     return INT_LIT; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -77,9 +80,13 @@ Lex_err [1-9][0-9]*[a-zA-Z]+[0-9]*|0[0-7]*[8-9a-zA-Z_]+[0-9a-zA-Z_]* | 
			
		
	
		
			
				
					|  |  |  |  |     yylval.str_val = (char *)malloc(strlen(yytext) + 1); | 
			
		
	
		
			
				
					|  |  |  |  |     strcpy(yylval.str_val, yytext); | 
			
		
	
		
			
				
					|  |  |  |  |     yylval.str_val[strlen(yytext)] = '\0'; | 
			
		
	
		
			
				
					|  |  |  |  |     TESTINFO("ID"); | 
			
		
	
		
			
				
					|  |  |  |  |     return ID; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | [0-9]*\.[0-9]+f?|[0-9]+e-?[0-9]+f? { yylval.float_val = atof(yytext); return FLOAT_LIT; } | 
			
		
	
		
			
				
					|  |  |  |  | [0-9]*\.[0-9]+f?|[0-9]+e-?[0-9]+f? {  | 
			
		
	
		
			
				
					|  |  |  |  |     yylval.float_val = atof(yytext);  | 
			
		
	
		
			
				
					|  |  |  |  |     TESTINFO("FLOAT_LIT"); | 
			
		
	
		
			
				
					|  |  |  |  |     return FLOAT_LIT; } | 
			
		
	
		
			
				
					|  |  |  |  | {Lex_err} { return LEX_ERR; } | 
			
		
	
		
			
				
					|  |  |  |  | [1-9][0-9]*|0 { yylval.int_val = atoi(yytext); return INT_LIT; } | 
			
		
	
		
			
				
					|  |  |  |  | 0[0-7]+ { | 
			
		
	
	
		
			
				
					|  |  |  | @ -88,6 +95,7 @@ Lex_err [1-9][0-9]*[a-zA-Z]+[0-9]*|0[0-7]*[8-9a-zA-Z_]+[0-9a-zA-Z_]* | 
			
		
	
		
			
				
					|  |  |  |  |     for (int i = 1; i < len; i++) | 
			
		
	
		
			
				
					|  |  |  |  |         val = (val << 3) + yytext[i] - '0'; | 
			
		
	
		
			
				
					|  |  |  |  |     yylval.int_val = val; | 
			
		
	
		
			
				
					|  |  |  |  |     TESTINFO("INT_LIT"); | 
			
		
	
		
			
				
					|  |  |  |  |     return INT_LIT; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | . { } | 
			
		
	
	
		
			
				
					|  |  |  | 
 |