%option c++ %option noyywrap %option yyclass="Scanner" %x STRING %{ #include "scanner.hpp" #include "indent_stack.hpp" %} %% ^[ \t]*\r?\n { /* Ignore lines containing whitespace only */ } ^[ \t]*#.*\n { /* Ignore comment-only lines */ } ^[ \t]+ { int col = indent_stack.calculateColumn(yytext, yyleng); auto action = indent_stack.updateIndentation(col); if (action == IndentAction::Indent) return yy::parser::token::TOK_INDENT; if (action == IndentAction::Dedent) return yy::parser::token::TOK_DEDENT; } \n { return yy::parser::token::TOK_NEWLINE; } def { return yy::parser::token::TOK_KW_DEF; } if { return yy::parser::token::TOK_KW_IF; } return { return yy::parser::token::TOK_KW_RETURN; } for { return yy::parser::token::TOK_KW_FOR; } in { return yy::parser::token::TOK_KW_IN; } \( { return yy::parser::token::TOK_L_PAREN; } \) { return yy::parser::token::TOK_R_PAREN; } \: { return yy::parser::token::TOK_COLON; } \= { return yy::parser::token::TOK_ASSIGN; } \+ { return yy::parser::token::TOK_PLUS; } \- { return yy::parser::token::TOK_MINUS; } \" { yymore(); BEGIN(STRING); } \" { BEGIN(INITIAL); yylval->as() = yytext; return yy::parser::token::TOK_STRING; } . { yymore(); } [0-9]+ { yylval->as() = yytext; return yy::parser::token::TOK_NUMBER; } [A-Za-z_][A-Za-z0-9_]* { yylval->as() = yytext; return yy::parser::token::TOK_IDENTIFIER; } <> { return yy::parser::token::TOK_EOF; } . { }