summaryrefslogtreecommitdiffstats
path: root/parser.l
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2012-02-25 15:51:43 -0800
committerKaz Kylheku <kaz@kylheku.com>2012-02-25 15:51:43 -0800
commitcb0c0a6144346521d6cf3b02703ba15f67b9b4f3 (patch)
treee023920384a808a8b412f7e524bb5767e42e9724 /parser.l
parentd3069e9fabe241d6f6c3bc659902e4191bfd5e08 (diff)
downloadtxr-cb0c0a6144346521d6cf3b02703ba15f67b9b4f3.tar.gz
txr-cb0c0a6144346521d6cf3b02703ba15f67b9b4f3.tar.bz2
txr-cb0c0a6144346521d6cf3b02703ba15f67b9b4f3.zip
* parser.l (num_esc): Skip octal indicator 'o' if present.
This is needed for character constants. (CHRLIT): Fix broken hex constants, being treated as octal. * txr.1: Document octal character constants.
Diffstat (limited to 'parser.l')
-rw-r--r--parser.l4
1 files changed, 3 insertions, 1 deletions
diff --git a/parser.l b/parser.l
index 3c09aabc..a53f8514 100644
--- a/parser.l
+++ b/parser.l
@@ -134,6 +134,8 @@ static wchar_t num_esc(char *num)
yyerror("too many digits in hex character escape");
return strtol(num + 1, 0, 16);
} else {
+ if (num[0] == 'o')
+ num++;
if (strlen(num) > 8)
yyerror("too many digits in octal character escape");
return strtol(num, 0, 8);
@@ -609,7 +611,7 @@ UONLY {U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U}
}
<CHRLIT>(x{HEX}+|o{OCT}+) {
- yylval.chr = num_esc(yytext+1);
+ yylval.chr = num_esc(yytext);
return LITCHAR;
}