From: Stephen Dolan Date: Tue, 4 Sep 2012 15:05:24 +0000 (+0100) Subject: Add "elif" to if-then-else constructs. X-Git-Tag: jq-1.1~77 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=328c4a13f1d63b02cbc7afe8e46a16ef4f896f07;p=jq Add "elif" to if-then-else constructs. --- diff --git a/c/lexer.l b/c/lexer.l index e3c140b..98365f1 100644 --- 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];} diff --git a/c/parser.y b/c/parser.y index d4e8d8f..165cdb4 100644 --- a/c/parser.y +++ b/c/parser.y @@ -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 Exp Term MkDict MkDictPair ExpD +%type 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 { diff --git a/c/testdata b/c/testdata index 888d8b7..3fe231f 100644 --- a/c/testdata +++ b/c/testdata @@ -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]]