From a7c2de1c32148112e0824abdfb5aeeb8dbed084c Mon Sep 17 00:00:00 2001 From: yhirose Date: Thu, 28 May 2015 21:35:58 -0400 Subject: [PATCH] Added 'else if' support. --- language/interpreter.cc | 17 ++++++++++++----- language/parser.cc | 2 +- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/language/interpreter.cc b/language/interpreter.cc index 8f4a94c..0f0f7aa 100644 --- a/language/interpreter.cc +++ b/language/interpreter.cc @@ -56,12 +56,19 @@ private: } static Value eval_if(const Ast& ast, Env& env) { - auto cond = eval(*ast.nodes[0], env); - if (cond.to_bool()) { - return eval(*ast.nodes[1], env); - } else if (ast.nodes.size() > 2) { - return eval(*ast.nodes[2], env); + const auto& nodes = ast.nodes; + + for (auto i = 0u; i < nodes.size(); i += 2) { + if (i + 1 == nodes.size()) { + return eval(*nodes[i], env); + } else { + auto cond = eval(*nodes[i], env); + if (cond.to_bool()) { + return eval(*nodes[i + 1], env); + } + } } + return Value(); } diff --git a/language/parser.cc b/language/parser.cc index 9f155f2..23f9068 100644 --- a/language/parser.cc +++ b/language/parser.cc @@ -11,7 +11,7 @@ static auto g_grammar = R"( EXPRESSION <- ASSIGNMENT / PRIMARY ASSIGNMENT <- IDENTIFIER '=' _ EXPRESSION WHILE <- 'while' _ EXPRESSION BLOCK - IF <- 'if' _ EXPRESSION BLOCK ('else' _ BLOCK)? + IF <- 'if' _ EXPRESSION BLOCK ('else' _ 'if' _ EXPRESSION BLOCK)* ('else' _ BLOCK)? FUNCTION <- 'fn' _ PARAMETERS BLOCK PARAMETERS <- '(' _ IDENTIFIER* ')' _ FUNCTION_CALL <- IDENTIFIER ARGUMENTS