]> granicus.if.org Git - jq/commitdiff
Add "elif" to if-then-else constructs.
authorStephen Dolan <mu@netsoc.tcd.ie>
Tue, 4 Sep 2012 15:05:24 +0000 (16:05 +0100)
committerStephen Dolan <mu@netsoc.tcd.ie>
Tue, 4 Sep 2012 15:05:24 +0000 (16:05 +0100)
c/lexer.l
c/parser.y
c/testdata

index e3c140b6925447e1177edd5a8f50c46ff5112b3f..98365f1f78ead0f675c138428baebe16ccbadb13 100644 (file)
--- a/c/lexer.l
+++ b/c/lexer.l
@@ -16,6 +16,7 @@
 "if" { return IF; }
 "then" { return THEN; }
 "else" { return ELSE; }
+"elif" { return ELSE_IF; }
 "end" { return END; }
 "//" { return DEFINEDOR; }
 "."|"="|";"|"["|"]"|","|":"|"("|")"|"{"|"}"|"|"|"+"|"\$" { return yytext[0];}
index d4e8d8f43195e35556f268b0024c842840d60853..165cdb428e745323483c8ae5ef9c1718ed046277 100644 (file)
@@ -32,6 +32,7 @@
 %token IF "if"
 %token THEN "then"
 %token ELSE "else"
+%token ELSE_IF "elif"
 %token END "end"
 %right "//"
 %nonassoc '=' SETPIPE
@@ -39,7 +40,7 @@
 %left '+'
 
 
-%type <blk> Exp Term MkDict MkDictPair ExpD
+%type <blk> Exp Term MkDict MkDictPair ExpD ElseBody
 
 %{
 #include "lexer.yy.h"
@@ -85,8 +86,8 @@ Term "as" '$' IDENT '|' Exp {
   jv_free($4);
 } |
 
-"if" Exp "then" Exp "else" Exp "end" {
-  $$ = gen_cond($2, $4, $6);
+"if" Exp "then" Exp ElseBody {
+  $$ = gen_cond($2, $4, $5);
 } |
 
 Exp '=' Exp {
@@ -128,6 +129,14 @@ Term {
   $$ = $1; 
 }
 
+ElseBody:
+"elif" Exp "then" Exp ElseBody {
+  $$ = gen_cond($2, $4, $5);
+} |
+"else" Exp "end" {
+  $$ = $2;
+}
+
 
 ExpD:
 ExpD '|' ExpD { 
index 888d8b74d2e3944042414feeb00797f27a15c4d2..3fe231f58fc614188d3e7d929b0626da93b0d9f8 100644 (file)
@@ -243,6 +243,11 @@ def inc(x): x |= .+1; inc(.[].a)
 [{"foo":0},{"foo":1},{"foo":[]},{"foo":true},{"foo":false},{"foo":null},{"foo":"foo"},{}]
 ["yep","yep","yep","yep","nope","nope","yep","nope"]
 
+[.[] | if .baz then "strange" elif .foo then "yep" else "nope" end]
+[{"foo":0},{"foo":1},{"foo":[]},{"foo":true},{"foo":false},{"foo":null},{"foo":"foo"},{}]
+["yep","yep","yep","yep","nope","nope","yep","nope"]
+
+
 # FIXME: define/test behaviour of 'if (.foo,.bar) then A else B end'
 
 [.[] | [.foo[] // .bar]]