/* * A scanner for a toy language lex.l */ %{ // Copied verbatim #include #include #include "y.tab.h" // tokens are defined int line_count = 1; yylType yylval; %} %option noyywrap %x CMNT INSTR DELIM ([ \t]) WHITESPACES ({DELIM}+) P_DIG ([1-9]) DIG (0|{P_DIG}) NN_INT (0|{P_DIG}{DIG}*) LOWER ([a-z]) LETTER ({LOWER}|[:upper:]) IDENTIFIER (({LETTER}({LETTER}|{DIG})*)|(_+({LETTER}|{DIG})+)) %% "/*" {BEGIN CMNT;} . {;} \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-2); 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)'<'; } "<=" { return LEQ; } "&" { 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); yylval.string[yyleng]='\0'; return ID; } {NN_INT} { yylval.integer = atoi(yytext); return NUM; } . { printf("Invalid symbol %s at line %d\n", yytext, line_count); } %% /* The function yywrap() */ //int yywrap(){return 1;}