]> granicus.if.org Git - jq/commitdiff
Fix #484, try/catch syntax has conflicts
authorNicolas Williams <nico@cryptonector.com>
Mon, 14 Jul 2014 20:38:58 +0000 (15:38 -0500)
committerNicolas Williams <nico@cryptonector.com>
Mon, 14 Jul 2014 21:41:48 +0000 (16:41 -0500)
parser.y

index 794837135ec92ea0e719c4ca44f1cf73c9650fb8..fcada1a5123fd851be014dcf1109d0711ad83df6 100644 (file)
--- a/parser.y
+++ b/parser.y
@@ -50,7 +50,6 @@ struct lexer_param;
 %token <literal> FIELD
 %token <literal> LITERAL
 %token <literal> FORMAT
-%token Q "?"
 %token REC ".."
 %token SETMOD "%="
 %token EQ "=="
@@ -84,6 +83,9 @@ struct lexer_param;
 %token QQSTRING_INTERP_END
 %token QQSTRING_END
 
+/* see Exp '?' rule */
+%expect 9
+
  /* revolting hack */
 %left ';'
 %right '|'
@@ -95,6 +97,9 @@ struct lexer_param;
 %nonassoc NEQ EQ '<' '>' LESSEQ GREATEREQ
 %left '+' '-'
 %left '*' '/' '%'
+%precedence '?'
+%precedence "try"
+%precedence "catch"
 
 
 %type <blk> Exp Term MkDict MkDictPair ExpD ElseBody QQString FuncDef FuncDefs String
@@ -269,11 +274,15 @@ Term "as" '$' IDENT '|' Exp {
   $$ = $2;
 } |
 
+// This rule conflicts with all the other rules using the '?' operator.
+// It doesn't matter which bison prefers: all of them result in the same
+// syntax and semantics, but the more specific rules optimize better
+// because they use opcodes specifically made for the purpose.  We
+// expect 9 such conflicts.
 Exp '?' {
   $$ = gen_try($1, gen_op_simple(BACKTRACK));
 } |
 
-
 Exp '=' Exp {
   $$ = gen_call("_assign", BLOCK(gen_lambda($1), gen_lambda($3)));
 } |