%option noyywrap %option reentrant %{ #include #include "ast.hpp" #include "definition.hpp" #include "parse_driver.hpp" #include "parser.hpp" yy::parser::location_type location; #define YY_EXTRA_TYPE parse_driver* #define YY_USER_ACTION location.step(); location.columns(yyleng); #define YY_INPUT(buf,result,max_size) \ { \ int c = yyextra->get(); \ result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \ } %} %% \n { location.lines(); } [ ]+ {} \\ { return yy::parser::make_BACKSLASH(location); } \+ { return yy::parser::make_PLUS(location); } \* { return yy::parser::make_TIMES(location); } - { return yy::parser::make_MINUS(location); } \/ { return yy::parser::make_DIVIDE(location); } [0-9]+ { return yy::parser::make_INT(atoi(yytext), location); } defn { return yy::parser::make_DEFN(location); } data { return yy::parser::make_DATA(location); } case { return yy::parser::make_CASE(location); } of { return yy::parser::make_OF(location); } let { return yy::parser::make_LET(location); } in { return yy::parser::make_IN(location); } \{ { return yy::parser::make_OCURLY(location); } \} { return yy::parser::make_CCURLY(location); } \( { return yy::parser::make_OPAREN(location); } \) { return yy::parser::make_CPAREN(location); } , { return yy::parser::make_COMMA(location); } -> { return yy::parser::make_ARROW(location); } = { return yy::parser::make_EQUAL(location); } [a-z][a-zA-Z]* { return yy::parser::make_LID(std::string(yytext), location); } [A-Z][a-zA-Z]* { return yy::parser::make_UID(std::string(yytext), location); } <> { return yy::parser::make_YYEOF(location); } %% void scanner_init(parse_driver* d, yyscan_t* scanner) { yylex_init_extra(d, scanner); } void scanner_destroy(yyscan_t* scanner) { yylex_destroy(*scanner); }