%{ #include #include #include #include #include "y.tab.h" static int line = 1; static int column = 1; int rule(int token); int node(int token); void yyerror(char* message); int debug_tokenizer = 0; %} %x COMM1 IDENT [_a-zA-Z][_a-zA-Z0-9]* INT [0-9]+ WHITE [ \t\v\f]* LIT '[^\']+' STR \"[^\"]+\" FLT1 [0-9]*"."[0-9]+([eE][-+]?[0-9]+)? FLT2 [0-9]+"."[0-9]*([eE][-+]?[0-9]+)? %% {WHITE} { column += yyleng; } \n { column = 1; line++; } "continue" { return rule(CONTINUE); } "typedef" { return rule(TYPEDEF); } "default" { return rule(DEFAULT); } "return" { return rule(RETURNX); } "switch" { return rule(SWITCH); } "printf" { return rule(PRINTF); } "break" { return rule(BREAK); } "while" { return rule(WHILE); } "scanf" { return rule(SCANF); } "const" { return rule(CONST); } "case" { return rule(CASE); } "else" { return rule(ELSE); } "for" { return rule(FOR); } "if" { return rule(IF); } "do" { return rule(DO); } {FLT1} { return node(FLOAT_LIT); } {FLT2} { return node(FLOAT_LIT); } {INT} { return node(INTEGER_LIT); } {IDENT} { return node(IDENTIFIER); } {LIT} { return node(CHAR_LIT); } "/*" { column += yyleng; BEGIN( COMM1 ); } [^*\n]+ { column += yyleng; } "*/" { column += yyleng; BEGIN( INITIAL ); } "*" { column++; } \n { column = 1; line++; } {STR} { return node(STRING); } "+=" { return rule(PEQ); } "-=" { return rule(SEQ); } "*=" { return rule(TEQ); } "/=" { return rule(DEQ); } "%=" { return rule(MEQ); } "&=" { return rule(AEQ); } "^=" { return rule(XEQ); } "|=" { return rule(OEQ); } "<=" { return rule(LTE); } ">=" { return rule(GTE); } "!=" { return rule(NE); } "==" { return rule(EQ); } "++" { return rule(INC); } "--" { return rule(DEC); } "&&" { return rule(LAND); } "||" { return rule(LOR); } "<" { return rule(yytext[0]); } ">" { return rule(yytext[0]); } "=" { return rule(yytext[0]); } ";" { return rule(yytext[0]); } "(" { return rule(yytext[0]); } ")" { return rule(yytext[0]); } "{" { return rule(yytext[0]); } "}" { return rule(yytext[0]); } "+" { return rule(yytext[0]); } "-" { return rule(yytext[0]); } "*" { return rule(yytext[0]); } "/" { return rule(yytext[0]); } "!" { return rule(yytext[0]); } "^" { return rule(yytext[0]); } "," { return rule(yytext[0]); } ":" { return rule(yytext[0]); } "?" { return rule(yytext[0]); } "&" { return rule(yytext[0]); } "%" { return rule(yytext[0]); } "|" { return rule(yytext[0]); } "[" { return rule(yytext[0]); } "]" { return rule(yytext[0]); } . { yyerror("unrecognized char"); printf("-->%s<--\n",yytext); column++; } %% int rule(int token) { if (debug_tokenizer) { printf("string:%s, token: %d, line: %d, column: %d\n", yytext,token,line,column); } yylval.info.line = line; yylval.info.column = column; column += yyleng; yylval.info.string = malloc(yyleng+1); assert(yylval.info.string); strcpy(yylval.info.string, yytext); yylval.info.makenode = 0; return token; } int node(int token) { int tok = rule(token); yylval.info.makenode = 1; return tok; } void yyerror(char* message) { printf("****** %s @line %d, column %d\n", message,line,column); }