diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2015-06-26 18:55:22 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2015-06-26 18:55:22 -0700 |
commit | 9bf17146994d7586c62f7f52be525ee6f6b08329 (patch) | |
tree | 73c7499b2865f71639c9733b97ad4024fd57e8f0 /parser.l | |
parent | 526ff444979c6829ec52cc619136747354e57630 (diff) | |
download | txr-9bf17146994d7586c62f7f52be525ee6f6b08329.tar.gz txr-9bf17146994d7586c62f7f52be525ee6f6b08329.tar.bz2 txr-9bf17146994d7586c62f7f52be525ee6f6b08329.zip |
First round of quasiliteral-related fixes.
* parser.l: Do not try to recognize floating-point literals
in QSPECIAL state; that is not possible because @134.3
in a quasiliteral parses as a METANUM followed by ".3".
On the other hand, recognize METANUM literals in QSPECIAL state,
so that @@123 scans. Recognize @ as a token in QSPECIAL state,
so @@abc will scan. When transitioning from QSILIT and QWLIT
states to QSPECIAL upon scanning @, return a @ token, which
is now parsed in the grammar.
* parser.y (quasi_meta_helper): New static function.
(q_var): Do not handle SYMTOK any more, only the braced
variable syntax. SYMTOK is handled as a n_expr.
Braced vars are handled with explicit '@' token, which
is now produced by the scanner when it shifts from QSILIT
to QSPECIAL.
(quasi_item): No longer necessary to recognize various
forms here such as quotes and splices. Just recognize a n_expr,
preceded by '@'.
Diffstat (limited to 'parser.l')
-rw-r--r-- | parser.l | 15 |
1 files changed, 8 insertions, 7 deletions
@@ -269,7 +269,7 @@ UONLY {U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U} return NUMBER; } -<SPECIAL,QSPECIAL,NESTED,BRACED>{FLO} { +<SPECIAL,NESTED,BRACED>{FLO} { val str = string_own(utf8_dup_from(yytext)); if (yy_top_state(yyscanner) == INITIAL @@ -293,7 +293,7 @@ UONLY {U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U} return NUMBER; } -<SPECIAL,QSPECIAL>({FLO}|{FLODOT}){TOK} | +<SPECIAL>({FLO}|{FLODOT}){TOK} | <BRACED>({FLO}|{FLODOT}){BTOK} | <NESTED>({FLO}|{FLODOT}){NTOK} { val str = string_utf8(yytext); @@ -309,7 +309,7 @@ UONLY {U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U} return NUMBER; } -<NESTED,QSILIT,QWLIT>@{NUM} { +<NESTED,QSILIT,QWLIT,QSPECIAL>@{NUM} { val str = string_own(utf8_dup_from(yytext + 1)); if (yy_top_state(yyscanner) == INITIAL @@ -320,7 +320,7 @@ UONLY {U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U} return METANUM; } -<NESTED,QSILIT,QWLIT>@{XNUM} { +<NESTED,QSILIT,QWLIT,QSPECIAL>@{XNUM} { val str = string_own(utf8_dup_from(yytext + 3)); if (yy_top_state(yyscanner) == INITIAL @@ -331,7 +331,7 @@ UONLY {U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U} return METANUM; } -<NESTED,QSILIT,QWLIT>@{ONUM} { +<NESTED,QSILIT,QWLIT,QSPECIAL>@{ONUM} { val str = string_own(utf8_dup_from(yytext + 3)); if (yy_top_state(yyscanner) == INITIAL @@ -342,7 +342,7 @@ UONLY {U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U} return METANUM; } -<NESTED,QSILIT,QWLIT>@{BNUM} { +<NESTED,QSILIT,QWLIT,QSPECIAL>@{BNUM} { val str = string_own(utf8_dup_from(yytext + 3)); if (yy_top_state(yyscanner) == INITIAL @@ -558,7 +558,7 @@ UONLY {U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U} return yytext[0]; } -<NESTED,BRACED>@ { +<NESTED,BRACED,QSPECIAL>@ { yylval->lineno = yyextra->lineno; return yytext[0]; } @@ -897,6 +897,7 @@ UONLY {U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U} <QSILIT,QWLIT>@ { yy_push_state(QSPECIAL, yyscanner); + return yytext[0]; } <WLIT,QWLIT>{WS} { |