diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2015-07-10 07:31:55 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2015-07-10 07:31:55 -0700 |
commit | 5c4e844c2c9c25324c3c1cb6d47b2967f65c633d (patch) | |
tree | fa96ee3aedbc243b16c011268bd5d99df9759b2e /parser.y | |
parent | 4fa8bbcb93d76caa7e599c60952ee06c45f55bd2 (diff) | |
download | txr-5c4e844c2c9c25324c3c1cb6d47b2967f65c633d.tar.gz txr-5c4e844c2c9c25324c3c1cb6d47b2967f65c633d.tar.bz2 txr-5c4e844c2c9c25324c3c1cb6d47b2967f65c633d.zip |
Bugfix: lexer loses unmatched "hold char" between top-level forms.
Test case: file containing 4(prinl 3). Scanner consumes 4 and (.
The ( is lost when the scanner is reset for the next call to yyparse,
resulting in jut prinl being read and interpreted as a variable.
* parser.c (prime_parser): If present, append hold byte to priming
string. Takes parser_t * instead of parser, and returns void now.
* parser.l (reset_scanner): Now returns int value, the value
of the scanner's yy_hold_char variable which is nonzero when
the scanner is hanging on to an unmatched byte of input.
* parser.h (reset_scanner, prime_parser): Declarations updated.
* parser.y (parse): Pass hold byte returned by reset_scanner to
prime_parser.
Diffstat (limited to 'parser.y')
-rw-r--r-- | parser.y | 3 |
1 files changed, 1 insertions, 2 deletions
@@ -1463,8 +1463,7 @@ int parse(parser_t *parser) parser->errors = 0; parser->prepared_msg = nil; parser->syntax_tree = nil; - prime_parser(parser->parser); - reset_scanner(parser->scanner); + prime_parser(parser, reset_scanner(parser->scanner)); res = yyparse(parser->scanner, parser); |