%{ #include #define TK_IDENTIFIER 1 #define LIT_INTEGER 2 #define TK_OPERATOR_STAR 3 #define KW_INT 5 int LineNumber = 1; %} %x COMM CHAR [A-Za-z_] DIGIT [0-9] %% int { return KW_INT; } {CHAR}({CHAR}|{DIGIT})* { return TK_IDENTIFIER; } {DIGIT}+ { return LIT_INTEGER; } "*" { return TK_OPERATOR_STAR; } "/*" BEGIN(COMM); \n { ++LineNumber; } [ \t] { } . "*/" BEGIN(INITIAL); . %% int running = 1; int main (int argc, char **argv) { int token = 0; if (argc < 2) { fprintf(stderr,"Please, call: ./a.out filename\n"); exit(1); } yyin = fopen(argv[1],"r"); if (yyin ==0) { fprintf(stderr,"Cannot open file \"%s\"\n",argv[1]); exit (2); } while(running) { token = yylex(); if (! running) break; switch (token) { case TK_IDENTIFIER: fprintf(stderr,"ident %s at line %d\n",yytext,LineNumber); break; case LIT_INTEGER: fprintf(stderr,"inteiro valor %d at line %d\n",atoi(yytext),LineNumber); break; case TK_OPERATOR_STAR: fprintf(stderr,"asterisco at line %d\n",LineNumber); break; case KW_INT : fprintf(stderr,"INT at line %d\n",LineNumber); break; default: fprintf(stderr,"Nao sei... %d \n",token); } } } int yywrap () { running = 0; return 1; }