diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2021-06-09 20:51:09 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2021-06-09 20:51:09 -0700 |
commit | e57c4d0857fcf8b4e4369bde72c7453d2ae98125 (patch) | |
tree | 8f990b9ce493054da4d87a41daf3d127c7276a77 | |
parent | bb67d9260a1ae939f53af5c593314cf275480cd2 (diff) | |
download | txr-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.y | 21 |
1 files changed, 15 insertions, 6 deletions
@@ -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); |