/* A scanner for a toy language: ./lex_yacc/lex4.l */ %{ // Copied verbatim #include #include #define STRSTART 1 #define STREND 0 #include "y.tab.h" // tokens are defined int line_count = 0; yylType yylval; int strFlg = STRSTART; %} %option noyywrap %x CMNT INSTR DELIM ([ \t]) WHITESPACES ({DELIM}+) P_DIG ([1-9]) DIG (0|{P_DIG}) NZ_INT (0|{P_DIG}{DIG}*) LOWER ([a-z]) LETTER ({LOWER}|[:upper:]|_) IDENTIFIER ({LETTER}({LETTER}|{DIG})*) %% "/*" {BEGIN CMNT;} "\"" { if(strFlg == STRSTART){ strFlg = STREND; /* string starts */ BEGIN INSTR; } else { strFlg = STRSTART; BEGIN CMNT; /* string ends */ } } . {;} \n {++line_count;} "*/" {BEGIN INITIAL;} \n { ++line_count; return (int)'\n'; } "\"".*"\"" { yylval.string=(char *)malloc((yyleng+1)*(sizeof(char))); strncpy(yylval.string, yytext+1, yyleng); yylval.string[yyleng-2]='\0'; return STRNG; } {WHITESPACES} { ; } if {return IF;} else {return ELSE; } while { return WHILE; } for { return FOR; } int { return INT; } \( { return (int)'('; } \) { return (int)')'; } \{ { return (int)'{'; } \} { return (int)'}'; } ; { return (int)';'; } , { return (int)','; } = { return (int)'='; } "<" { return (int)'<'; } "+" { yylval.integer = (int)'+'; return BIN_OP; } "-" { yylval.integer = (int)'-'; return BIN_OP; } "*" { yylval.integer = (int)'*'; return BIN_OP; } "/" { yylval.integer = (int)'/'; return BIN_OP; } {IDENTIFIER} { yylval.string=(char *)malloc((yyleng+1)*(sizeof(char))); strncpy(yylval.string, yytext, yyleng + 1); return ID; } {NZ_INT} { yylval.integer = atoi(yytext); return NUM; } . { ; } %% /* The function yywrap() */ //int yywrap(){return 1;}