From 2ffbb9d6b7182c71d2a9f75d0e3bbbc029a980da Mon Sep 17 00:00:00 2001 From: Stephen Dolan Date: Wed, 5 Jun 2013 13:41:11 +0100 Subject: [PATCH] Lex and parse .foo better. '.as' is now valid, '. foo' is now invalid. See #141. --- lexer.l | 1 + parser.y | 9 +++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lexer.l b/lexer.l index 3000bafa..96c0efc4 100644 --- a/lexer.l +++ b/lexer.l @@ -108,6 +108,7 @@ struct lexer_param; [a-zA-Z_][a-zA-Z_0-9]* { yylval->literal = jv_string(yytext); return IDENT;} +\.[a-zA-Z_][a-zA-Z_0-9]* { yylval->literal = jv_string(yytext+1); return FIELD;} [ \n\t]+ {} diff --git a/parser.y b/parser.y index c9563a08..b7ac00b2 100644 --- a/parser.y +++ b/parser.y @@ -46,6 +46,7 @@ struct lexer_param; %token INVALID_CHARACTER %token IDENT +%token FIELD %token LITERAL %token FORMAT %token EQ "==" @@ -399,11 +400,11 @@ Term: '.' { $$ = gen_noop(); } | -Term '.' IDENT { - $$ = gen_index($1, gen_const($3)); +Term FIELD { + $$ = gen_index($1, gen_const($2)); } | -'.' IDENT { - $$ = gen_index(gen_noop(), gen_const($2)); +FIELD { + $$ = gen_index(gen_noop(), gen_const($1)); } | '.' error { FAIL(@$, "try .[\"field\"] instead of .field for unusually named fields");