From b90ae078b897adaca0be4cca7a5d6d2fbd99d1e0 Mon Sep 17 00:00:00 2001 From: Stephen Dolan Date: Mon, 3 Jun 2013 23:07:13 +0100 Subject: [PATCH] Let the parser rather than the lexer handle invalid characters. --- parser.y | 31 ++++++++++++------------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/parser.y b/parser.y index bc703e92..461b9c98 100644 --- a/parser.y +++ b/parser.y @@ -5,12 +5,11 @@ #include "jv_alloc.h" #define YYMALLOC jv_mem_alloc #define YYFREE jv_mem_free - -struct lexer_param; - %} %code requires { #include "locfile.h" +struct lexer_param; + #define YYLTYPE location #define YYLLOC_DEFAULT(Loc, Rhs, N) \ do { \ @@ -112,25 +111,19 @@ void yyerror(YYLTYPE* loc, block* answer, int* errors, int yylex(YYSTYPE* yylval, YYLTYPE* yylloc, block* answer, int* errors, struct locfile* locations, struct lexer_param* lexer_param_ptr) { yyscan_t lexer = lexer_param_ptr->lexer; - while (1) { - int tok = jq_yylex(yylval, yylloc, lexer); - if (tok == INVALID_CHARACTER) { - FAIL(*yylloc, "Invalid character"); + int tok = jq_yylex(yylval, yylloc, lexer); + if ((tok == LITERAL || tok == QQSTRING_TEXT) && !jv_is_valid(yylval->literal)) { + jv msg = jv_invalid_get_msg(jv_copy(yylval->literal)); + if (jv_get_kind(msg) == JV_KIND_STRING) { + FAIL(*yylloc, jv_string_value(msg)); } else { - if ((tok == LITERAL || tok == QQSTRING_TEXT) && !jv_is_valid(yylval->literal)) { - jv msg = jv_invalid_get_msg(jv_copy(yylval->literal)); - if (jv_get_kind(msg) == JV_KIND_STRING) { - FAIL(*yylloc, jv_string_value(msg)); - } else { - FAIL(*yylloc, "Invalid literal"); - } - jv_free(msg); - jv_free(yylval->literal); - yylval->literal = jv_null(); - } - return tok; + FAIL(*yylloc, "Invalid literal"); } + jv_free(msg); + jv_free(yylval->literal); + yylval->literal = jv_null(); } + return tok; } static block gen_dictpair(block k, block v) {