summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2021-06-09 20:51:09 -0700
committerKaz Kylheku <kaz@kylheku.com>2021-06-09 20:51:09 -0700
commite57c4d0857fcf8b4e4369bde72c7453d2ae98125 (patch)
tree8f990b9ce493054da4d87a41daf3d127c7276a77
parentbb67d9260a1ae939f53af5c593314cf275480cd2 (diff)
downloadtxr-e57c4d0857fcf8b4e4369bde72c7453d2ae98125.tar.gz
txr-e57c4d0857fcf8b4e4369bde72c7453d2ae98125.tar.bz2
txr-e57c4d0857fcf8b4e4369bde72c7453d2ae98125.zip
parser: bug #; and #S don't play.
When #; is used to comment out syntax containing #S, an attempt is made to instantiate a structure using nil as the type, and an exception occurs. * parser.y (hash, struct, tree): Check for parser->ignore and produce nil instead of making any of these objects.
-rw-r--r--parser.y21
1 files changed, 15 insertions, 6 deletions
diff --git a/parser.y b/parser.y
index d7c31c8b..c8abd205 100644
--- a/parser.y
+++ b/parser.y
@@ -893,7 +893,10 @@ vector : '#' list { if (parser->quasi_level > 0 && unquotes_occur(
yybadtok(yychar, lit("unassigned/reserved # notation")); }
;
-hash : HASH_H list { if (parser->quasi_level > 0 && unquotes_occur($2, 0))
+hash : HASH_H list { if (parser->ignore)
+ $$ = nil;
+ else if (parser->quasi_level > 0 &&
+ unquotes_occur($2, 0))
$$ = rl(cons(hash_lit_s, $2), num($1));
else
$$ = rl(hash_construct(first($2),
@@ -903,9 +906,12 @@ hash : HASH_H list { if (parser->quasi_level > 0 && unquotes_occur(
yybadtok(yychar, lit("hash literal")); }
;
-struct : HASH_S list { if ((parser->quasi_level > 0 && unquotes_occur($2, 0)) ||
- (parser->read_unknown_structs &&
- !find_struct_type(first($2))))
+struct : HASH_S list { if (parser->ignore)
+ { $$ = nil; }
+ else if ((parser->quasi_level > 0 &&
+ unquotes_occur($2, 0)) ||
+ (parser->read_unknown_structs &&
+ !find_struct_type(first($2))))
{ $$ = rl(cons(struct_lit_s, $2), num($1)); }
else
{ val strct = make_struct_lit(first($2),
@@ -932,8 +938,11 @@ tnode : HASH_N list { if (gt(length($2), three))
yybadtok(yychar, lit("tree node literal")); }
;
-tree : HASH_T list { if (parser->quasi_level > 0 && unquotes_occur($2, 0))
- $$ = rl(cons(tree_lit_s, $2), num($1));
+tree : HASH_T list { if (parser->ignore)
+ { $$ = nil; }
+ else if (parser->quasi_level > 0 &&
+ unquotes_occur($2, 0))
+ { $$ = rl(cons(tree_lit_s, $2), num($1)); }
else
{ val opts = first($2);
val key_fn_name = pop(&opts);