%option noyywrap %option reentrant %option header-file="scanner.hpp" %{ #include #include "ast.hpp" #include "definition.hpp" #include "parse_driver.hpp" #include "parser.hpp" #define YY_USER_ACTION \ drv.get_file_manager().write(yytext, yyleng); \ LOC.step(); LOC.columns(yyleng); #define LOC drv.get_current_location() %} %% \n { drv.get_current_location().lines(); drv.get_file_manager().mark_line(); } [ ]+ {} \\ { return yy::parser::make_BACKSLASH(LOC); } \+ { return yy::parser::make_PLUS(LOC); } \* { return yy::parser::make_TIMES(LOC); } - { return yy::parser::make_MINUS(LOC); } \/ { return yy::parser::make_DIVIDE(LOC); } [0-9]+ { return yy::parser::make_INT(atoi(yytext), LOC); } defn { return yy::parser::make_DEFN(LOC); } data { return yy::parser::make_DATA(LOC); } case { return yy::parser::make_CASE(LOC); } of { return yy::parser::make_OF(LOC); } let { return yy::parser::make_LET(LOC); } in { return yy::parser::make_IN(LOC); } \{ { return yy::parser::make_OCURLY(LOC); } \} { return yy::parser::make_CCURLY(LOC); } \( { return yy::parser::make_OPAREN(LOC); } \) { return yy::parser::make_CPAREN(LOC); } , { return yy::parser::make_COMMA(LOC); } -> { return yy::parser::make_ARROW(LOC); } = { return yy::parser::make_EQUAL(LOC); } [a-z][a-zA-Z]* { return yy::parser::make_LID(std::string(yytext), LOC); } [A-Z][a-zA-Z]* { return yy::parser::make_UID(std::string(yytext), LOC); } <> { return yy::parser::make_YYEOF(LOC); } %%