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");