diff --git a/parser/nodes.cc b/parser/nodes.cc index 4854770..2584bb9 100644 --- a/parser/nodes.cc +++ b/parser/nodes.cc @@ -157,8 +157,15 @@ NodeRef IfNode::evaluate() } else if ( ! m_elses.isNull() ) { - eval->addChild(m_elses->evaluate()); + return m_elses->evaluate(); } return eval; } + +NodeRef ElseNode::evaluate() +{ + NodeRef eval = new EvaluatePropagateNode(); + evaluateChildren(eval); + return eval; +} diff --git a/parser/nodes.h b/parser/nodes.h index 53e0181..e0c865d 100644 --- a/parser/nodes.h +++ b/parser/nodes.h @@ -744,6 +744,12 @@ class IfNode : public Node NodeRef m_test_expr, m_elses; }; +class ElseNode : public Node +{ + public: + virtual NodeRef evaluate(); +}; + /* this class is only used to hold a set of items coming out of a class's * evaluate() from above. the evaluateChildren() top-level method will * propagate children of this class up to the level of their parent */ diff --git a/parser/parser.yy b/parser/parser.yy index a1f8eec..6385174 100644 --- a/parser/parser.yy +++ b/parser/parser.yy @@ -431,8 +431,12 @@ if: IF LPAREN bool_expression RPAREN LCURLY general_items RCURLY if_more { if_more: /* empty */ | ELSIF LPAREN bool_expression RPAREN LCURLY general_items RCURLY if_more { + $$ = new IfNode($3, $8); + $$->addChildren($6); } | ELSE LCURLY general_items RCURLY { + $$ = new ElseNode(); + $$->addChildren($3); } ; %%