summaryrefslogtreecommitdiffstats
path: root/parser.l
diff options
context:
space:
mode:
Diffstat (limited to 'parser.l')
-rw-r--r--parser.l42
1 files changed, 27 insertions, 15 deletions
diff --git a/parser.l b/parser.l
index 1d1e0643..6514a39b 100644
--- a/parser.l
+++ b/parser.l
@@ -386,9 +386,9 @@ UONLY {U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U}
return '"';
}
-<SPECIAL,NESTED>\' {
+<SPECIAL,NESTED>#\\ {
yy_push_state(CHRLIT);
- return '\'';
+ return HASH_BACKSLASH;
}
<SPECIAL,NESTED>` {
@@ -550,29 +550,30 @@ UONLY {U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U}
return yytext[0];
}
-<CHRLIT>\' {
- yy_pop_state();
- return yytext[0];
- }
-
<QSILIT>` {
yy_pop_state();
return yytext[0];
}
-<STRLIT,CHRLIT,QSILIT>[\\][abtnvfre"`'\\] {
- yylval.chr = char_esc(yytext[1]);
- return LITCHAR;
- }
+<STRLIT,QSILIT>[\\][abtnvfre"`'\\] {
+ yylval.chr = char_esc(yytext[1]);
+ return LITCHAR;
+ }
<STRLIT,QSILIT>{WS}[\\]\n{WS} {
lineno++;
}
-<STRLIT,CHRLIT>[\\](x{HEX}+|{OCT}+) {
- yylval.chr = num_esc(yytext + 1);
- return LITCHAR;
- }
+<CHRLIT>(x{HEX}+|o{OCT}+) {
+ yylval.chr = num_esc(yytext);
+ return LITCHAR;
+ }
+
+<CHRLIT>{SYM} {
+ yylval.lexeme = utf8_dup_from(yytext);
+ return IDENT;
+ }
+
<STRLIT>\n {
yyerrprepf(lit("newline in string literal"), nao);
lineno++;
@@ -615,12 +616,23 @@ UONLY {U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U}
void end_of_regex(void)
{
+ if (YYSTATE != REGEX)
+ internal_error("end_of_regex called in wrong scanner state");
+
yy_pop_state();
if (yy_top_state() == INITIAL
|| yy_top_state() == QSILIT)
yy_pop_state();
}
+void end_of_char(void)
+{
+ if (YYSTATE != CHRLIT)
+ internal_error("end_of_char called in wrong scanner state");
+
+ yy_pop_state();
+}
+
val source_loc(val form)
{
return gethash(form_to_ln_hash, form);