%{ #include #include "decaf.tab.hh" // Prototypes to lexer functions extern void yyerror (const char *error); %} %option noyywrap %option yylineno letter [A-Za-z] digit [0-9] exponent ((E|e)("+"|"-")?({digit}+)) %% "/*"(([^*]|(("*"+)[^*/]))*)("*"+)"/" { ; /* skip C-style comments */ } "//"((.)*)\n { ; /* skip single line (C++ style) comments */ } "boolean" { return(TOK_BOOLEAN); } "break" { return(TOK_BREAK); } "class" { return(TOK_CLASS); } "continue" { return(TOK_CONTINUE); } "do" { return(TOK_DO); } "else" { return(TOK_ELSE); } "extends" { return(TOK_EXTENDS); } "false" { return(TOK_FALSE); } "float" { return(TOK_FLOAT); } "for" { return(TOK_FOR); } "if" { return(TOK_IF); } "int" { return(TOK_INT); } "new" { return(TOK_NEW); } "null" { return(TOK_NULL); } "private" { return(TOK_PRIVATE); } "public" { return(TOK_PUBLIC); } "return" { return(TOK_RETURN); } "static" { return(TOK_STATIC); } "super" { return(TOK_SUPER); } "this" { return(TOK_THIS); } "true" { return(TOK_TRUE); } "void" { return(TOK_VOID); } "while" { return(TOK_WHILE); } "," { return(TOK_COMMA); } "." { return(TOK_DOT); } ";" { return(TOK_SEMICOLON); } "[" { return(TOK_OPEN_SQ_BRACKET); } "]" { return(TOK_CLOSE_SQ_BRACKET); } "(" { return(TOK_OPEN_PAREN); } ")" { return(TOK_CLOSE_PAREN); } "{" { return(TOK_OPEN_BRACE); } "}" { return(TOK_CLOSE_BRACE); } "+" { return(TOK_PLUS); } "-" { return(TOK_MINUS); } "*" { return(TOK_MULTIPLY); } "/" { return(TOK_DIVIDE); } "=" { return(TOK_EQUAL); } "&&" { return(TOK_AND); } "||" { return(TOK_OR); } "!" { return(TOK_NOT); } "<" { return(TOK_LESSER); } ">" { return(TOK_GREATER); } "==" { return(TOK_EQUAL_EQUAL); } "!=" { return(TOK_NOT_EQUAL); } "<=" { return(TOK_LESSER_OR_EQUAL); } ">=" { return(TOK_GREATER_OR_EQUAL); } "++" { return(TOK_PLUS_PLUS); } "--" { return(TOK_MINUS_MINUS); } {digit}+ { yylval.int_val = atoi(yytext); return(TOK_INT_CONST); } {digit}+"."{digit}+{exponent}? | {digit}+{exponent} { sscanf(yytext, "%g", &(yylval.float_val)); return(TOK_FLOAT_CONST); } \"((\\.)|[^\n\\"])*\" { /* Strings */ yylval.string_val = (char *)malloc(yyleng+1); strncpy(yylval.string_val, yytext+1, yyleng-2); yylval.string_val[yyleng-2] = '\0'; // strip away the begin and end quotes return(TOK_STRING_CONST); } \"((\\.)|[^\n\\"])*\n {//" /* Runaway string */ yyerror("runaway string"); } {letter}({letter}|{digit}|"_")* { yylval.string_val = (char *)malloc(yyleng+1); strncpy(yylval.string_val, yytext, yyleng+1); return(TOK_ID); } [ \t\r\n]+ { ; /* Ignore white spaces */ } . { yyerror("unrecognized character"); } %%