change the lexer

master
jakeallen 1 year ago
parent e39d30671b
commit c3fae88b83

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

Loading…
Cancel
Save