Add <@ elsif expression @>
authorteodor <teodor>
Tue, 7 Oct 2008 13:22:45 +0000 (13:22 +0000)
committerteodor <teodor>
Tue, 7 Oct 2008 13:22:45 +0000 (13:22 +0000)
data/template.tmpl
expected/tmpl
template.h
tmpl_gram.y
tmpl_scan.l

index 7b65074..d954d08 100644 (file)
@@ -75,3 +75,11 @@ str ? "yes" : -1 = <% str ? "yes" : -1 %>
        <@ LOOP oneloop@><@if __FIRST @><ol><@endif@><li><% __COUNTER %> oneloop:<% NODE %>#<% CNT %> ID:<% ^id %><@if __LAST @></ol><@endif@><@ ENDLOOP @>
        <@if __LAST @></ul><@endif@>
 <@ ENDLOOP @>
+
+<@ IF id == 17 @>
+       17
+<@ else if id ==23 @>
+       23
+<@ else @>
+       unknown;
+<@endif@>
index 7bf4401..9c6cca7 100644 (file)
@@ -79,6 +79,10 @@ str ? "yes" : -1 = yes
 
 
 
+
+
+       17
+
 ================================================
 id: 23 - <i>simple</i>
 idhex: 0x00000017 - <b>HEX
@@ -209,3 +213,7 @@ str ? "yes" : -1 = -1
        
        </ul>
 
+
+
+       23
+
index cd80d75..1109dac 100644 (file)
@@ -38,6 +38,7 @@
  *      for all other. Currently, bool values have only "true"/"false"
  *      string values
  * <@IF EXPRESSION @>
+ * [<@ ELSE IF EXPRESSION | ELSIF EXPRESSION @>]
  * [ <@ELSE@> ] 
  * <@ENDIF@>
  *
index b3a56ed..82267c3 100644 (file)
@@ -33,11 +33,13 @@ static GList *makeList2(void *a, void *b);
 }
 
 %type <node>                   node
+%type <node>                   ifnode elsenode elsifnode
 %type <node>                   listnodes
 %type <node>                   template
 %type <node>                   expression
 %type <list>                   list_expression
 %type <str>                            varname
+%type <str>                            elsif
 
 %type <flags>                  opt_escape
 %type <str>                            opt_format
@@ -49,7 +51,7 @@ static GList *makeList2(void *a, void *b);
 %token <str>                   LEXEME
 %token <str>                   VAR_OPEN VAR_CLOSE EXPR_OPEN EXPR_CLOSE 
                                                INCLUDE_OPEN INCLUDE_CLOSE
-%token <str>                   HTMLESCAPE URLESCAPE IF_P ELSE_P LOOP_P ENDIF_P ENDLOOP_P SELF_P 
+%token <str>                   HTMLESCAPE URLESCAPE IF_P ELSIF_P ELSE_P LOOP_P ENDIF_P ENDLOOP_P SELF_P 
 %token         <str>                   CMP_P
 
 %token <intval>                        INTEGER
@@ -206,6 +208,64 @@ expression:
        | '(' expression ')'                    { $$=$2; }
        ;
 
+elsif:
+       ELSIF_P
+       | ELSE_P IF_P
+       ;
+
+elsenode: 
+       EXPR_OPEN ELSE_P EXPR_CLOSE listnodes EXPR_OPEN ENDIF_P EXPR_CLOSE {
+                               $$ = $4;
+               }
+       ;
+
+elsifnode:
+       EXPR_OPEN elsif expression EXPR_CLOSE listnodes EXPR_OPEN ENDIF_P EXPR_CLOSE {
+                               $$ = mc0alloc( curTmpl->templateContext, sizeof(TemplateNodeData) );
+                               $$->type = ConditionNode;
+                               $$->nodeData.condition.expressionNode = $3;
+                               $$->nodeData.condition.ifNode = $5;
+               }
+       | EXPR_OPEN elsif expression EXPR_CLOSE listnodes elsenode { 
+                               $$ = mc0alloc( curTmpl->templateContext, sizeof(TemplateNodeData) );
+                               $$->type = ConditionNode;
+                               $$->nodeData.condition.expressionNode = $3;
+                               $$->nodeData.condition.ifNode = $5;
+                               $$->nodeData.condition.elseNode = $6;
+               }
+       | EXPR_OPEN elsif expression EXPR_CLOSE listnodes elsifnode {
+                               $$ = mc0alloc( curTmpl->templateContext, sizeof(TemplateNodeData) );
+                               $$->type = ConditionNode;
+                               $$->nodeData.condition.expressionNode = $3;
+                               $$->nodeData.condition.ifNode = $5;
+                               $$->nodeData.condition.elseNode = $6;
+               }
+       ;
+
+ifnode:
+       EXPR_OPEN IF_P expression EXPR_CLOSE listnodes EXPR_OPEN ENDIF_P EXPR_CLOSE {
+                               $$ = mc0alloc( curTmpl->templateContext, sizeof(TemplateNodeData) );
+                               $$->type = ConditionNode;
+                               $$->nodeData.condition.expressionNode = $3;
+                               $$->nodeData.condition.ifNode = $5;
+               }
+       | EXPR_OPEN IF_P expression EXPR_CLOSE listnodes elsenode {
+                               $$ = mc0alloc( curTmpl->templateContext, sizeof(TemplateNodeData) );
+                               $$->type = ConditionNode;
+                               $$->nodeData.condition.expressionNode = $3;
+                               $$->nodeData.condition.ifNode = $5;
+                               $$->nodeData.condition.elseNode = $6;
+               }
+       | EXPR_OPEN IF_P expression EXPR_CLOSE listnodes elsifnode {
+                               $$ = mc0alloc( curTmpl->templateContext, sizeof(TemplateNodeData) );
+                               $$->type = ConditionNode;
+                               $$->nodeData.condition.expressionNode = $3;
+                               $$->nodeData.condition.ifNode = $5;
+                               $$->nodeData.condition.elseNode = $6;
+               }
+       ;
+       
+
 node:  
        TEXT_P  {
                                $$ = mc0alloc( curTmpl->templateContext, sizeof(TemplateNodeData) );
@@ -237,19 +297,7 @@ node:
                                $$->nodeData.loop.varNameLength = strlen($3);
                                $$->nodeData.loop.bodyNode = $5;
                }
-       | EXPR_OPEN IF_P expression EXPR_CLOSE listnodes EXPR_OPEN ENDIF_P EXPR_CLOSE {
-                               $$ = mc0alloc( curTmpl->templateContext, sizeof(TemplateNodeData) );
-                               $$->type = ConditionNode;
-                               $$->nodeData.condition.expressionNode = $3;
-                               $$->nodeData.condition.ifNode = $5;
-               }
-       | EXPR_OPEN IF_P expression EXPR_CLOSE listnodes EXPR_OPEN ELSE_P EXPR_CLOSE listnodes EXPR_OPEN ENDIF_P EXPR_CLOSE {
-                               $$ = mc0alloc( curTmpl->templateContext, sizeof(TemplateNodeData) );
-                               $$->type = ConditionNode;
-                               $$->nodeData.condition.expressionNode = $3;
-                               $$->nodeData.condition.ifNode = $5;
-                               $$->nodeData.condition.elseNode = $9;
-               }
+       |       ifnode  {$$=$1;}
        ;
 
 %%
index 5024589..81be52f 100644 (file)
@@ -206,6 +206,7 @@ static KeyWord keywords[] = {
        { "ELSE",               0,      ELSE_P          },
        { "LOOP",               0,      LOOP_P          },
        { "SELF",               0,      SELF_P          },
+       { "ELSIF",              0,      ELSIF_P         },
        { "ENDIF",              0,      ENDIF_P         },
        { "ENDLOOP",    0,      ENDLOOP_P       } 
 };