diff --git a/chaiscript/chaiscript_eval.hpp b/chaiscript/chaiscript_eval.hpp index 8179d3b..e68e165 100644 --- a/chaiscript/chaiscript_eval.hpp +++ b/chaiscript/chaiscript_eval.hpp @@ -356,8 +356,7 @@ namespace chaiscript retval = dispatchkit::Boxed_Value(); } break; - /* - case(TokenType::For_Block) : { + case(Token_Type::For) : { dispatchkit::Boxed_Value condition; bool cond; @@ -399,7 +398,6 @@ namespace chaiscript retval = dispatchkit::Boxed_Value(); } break; - */ case (Token_Type::Def) : { std::vector param_names; @@ -463,22 +461,6 @@ namespace chaiscript throw BreakLoop(node); } break; - /* - case (TokenType::Statement) : - case (TokenType::Carriage_Return) : - case (TokenType::Semicolon) : - case (TokenType::Comment) : - case (TokenType::Operator) : - case (TokenType::Whitespace) : - case (TokenType::Parens_Open) : - case (TokenType::Parens_Close) : - case (TokenType::Square_Open) : - case (TokenType::Square_Close) : - case (TokenType::Curly_Open) : - case (TokenType::Curly_Close) : - case (TokenType::Comma) : - break; - */ } return retval; diff --git a/chaiscript/chaiscript_parser.hpp b/chaiscript/chaiscript_parser.hpp index 24811af..ea913d5 100644 --- a/chaiscript/chaiscript_parser.hpp +++ b/chaiscript/chaiscript_parser.hpp @@ -701,17 +701,17 @@ namespace chaiscript retval = true; if (!Char('(')) { - throw Parse_Error("Incomplete if expression", File_Position(line, col), filename); + throw Parse_Error("Incomplete 'if' expression", File_Position(line, col), filename); } if (!(Expression() && Char(')'))) { - throw Parse_Error("Incomplete if expression", File_Position(line, col), filename); + throw Parse_Error("Incomplete 'if' expression", File_Position(line, col), filename); } while (Eol()); if (!Block()) { - throw Parse_Error("Incomplete if block", File_Position(line, col), filename); + throw Parse_Error("Incomplete 'if' block", File_Position(line, col), filename); } build_match(Token_Type::If, prev_stack_top); @@ -729,17 +729,17 @@ namespace chaiscript retval = true; if (!Char('(')) { - throw Parse_Error("Incomplete while expression", File_Position(line, col), filename); + throw Parse_Error("Incomplete 'while' expression", File_Position(line, col), filename); } if (!(Expression() && Char(')'))) { - throw Parse_Error("Incomplete while expression", File_Position(line, col), filename); + throw Parse_Error("Incomplete 'while' expression", File_Position(line, col), filename); } while (Eol()); if (!Block()) { - throw Parse_Error("Incomplete while block", File_Position(line, col), filename); + throw Parse_Error("Incomplete 'while' block", File_Position(line, col), filename); } build_match(Token_Type::While, prev_stack_top); @@ -748,6 +748,44 @@ namespace chaiscript return retval; } + bool For_Guards() { + Equation(); + + if (Char(';') && Expression() && Char(';') && Expression()) { + return true; + } + else { + throw Parse_Error("Incomplete conditions in 'for' loop", File_Position(line, col), filename); + } + } + bool For() { + bool retval = false; + + int prev_stack_top = match_stack.size(); + + if (Keyword("for")) { + retval = true; + + if (!Char('(')) { + throw Parse_Error("Incomplete 'for' expression", File_Position(line, col), filename); + } + + if (!(For_Guards() && Char(')'))) { + throw Parse_Error("Incomplete 'for' expression", File_Position(line, col), filename); + } + + while (Eol()); + + if (!Block()) { + throw Parse_Error("Incomplete 'for' block", File_Position(line, col), filename); + } + + build_match(Token_Type::For, prev_stack_top); + } + + return retval; + } + bool Block() { bool retval = false; @@ -1196,6 +1234,14 @@ namespace chaiscript retval = true; saw_eol = false; } + else if (For()) { + if (!saw_eol) { + throw Parse_Error("Two function definitions missing line separator", match_stack.back()); + } + has_more = true; + retval = true; + saw_eol = false; + } else if (Statement()) { if (!saw_eol) { throw Parse_Error("Two expressions missing line separator", match_stack.back());