diff --git a/src/lexer.l b/src/lexer.l index 41a34e6..0b52e2a 100644 --- a/src/lexer.l +++ b/src/lexer.l @@ -1,7 +1,7 @@ %option c++ %option noyywrap %option yyclass="Scanner" -%x STRING +%x STRING_DQ STRING_SQ STRING_TDQ STRING_TSQ %{ #include "scanner.hpp" @@ -21,7 +21,6 @@ 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; } @@ -53,10 +52,27 @@ in { return yy::parser::token::TOK_KW_IN; } \: { return yy::parser::token::TOK_COLON; } \; { return yy::parser::token::TOK_SEMICOLON; } -\" { yymore(); BEGIN(STRING); } -\" { BEGIN(INITIAL); yylval->as() = yytext; return yy::parser::token::TOK_STRING; } -. { yymore(); } +\"\"\" { yymore(); BEGIN(STRING_TDQ); } +\"\"\" { BEGIN(INITIAL); yylval->as() = yytext; return yy::parser::token::TOK_STRING; } +. { yymore(); } +\'\'\' { yymore(); BEGIN(STRING_TSQ); } +\'\'\' { BEGIN(INITIAL); yylval->as() = yytext; return yy::parser::token::TOK_STRING; } +. { yymore(); } + +\" { yymore(); BEGIN(STRING_DQ); } +\\\" { yymore(); } +\" { BEGIN(INITIAL); yylval->as() = yytext; return yy::parser::token::TOK_STRING; } +. { yymore(); } + +\' { yymore(); BEGIN(STRING_SQ); } +\\\' { yymore(); } +\' { BEGIN(INITIAL); yylval->as() = yytext; return yy::parser::token::TOK_STRING; } +. { yymore(); } + +[0-9]+\.[0-9]+ { yylval->as() = yytext; return yy::parser::token::TOK_NUMBER; } +0x[0-9a-fA-F]+ { yylval->as() = yytext; return yy::parser::token::TOK_NUMBER; } +0b[01]+ { yylval->as() = yytext; return yy::parser::token::TOK_NUMBER; } [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; } diff --git a/test/lexer/05.out b/test/lexer/05.out index 2bd6e3a..e1dcf04 100644 --- a/test/lexer/05.out +++ b/test/lexer/05.out @@ -10,4 +10,4 @@ NEWLINE STRING 'test' STRING "escaped\"quote" NEWLINE -EOF +EOF \ No newline at end of file