From 14be974fb024710f06bf24c9ec1e45d496d70a8d Mon Sep 17 00:00:00 2001 From: Jonathan Turner Date: Fri, 29 May 2009 02:58:05 +0000 Subject: [PATCH] Fix a few crashers with And_Rule, Kleene_Rule, Plus_Rule, and Optional_Rule --- langkit/langkit_parser.cpp | 9 ++++----- langkit/main.cpp | 6 ++++++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/langkit/langkit_parser.cpp b/langkit/langkit_parser.cpp index a96dc5b..b523e35 100644 --- a/langkit/langkit_parser.cpp +++ b/langkit/langkit_parser.cpp @@ -95,7 +95,7 @@ std::pair And_Rule(Token_Iterator iter, Token_Iterator end if (iter != end) { std::pair result = lhs(iter, end, parent); - if (result.second) { + if ((result.second) && (result.first != end)) { result = rhs(result.first, end, parent); if (result.second) { if (new_id != -1) { @@ -133,7 +133,7 @@ std::pair Kleene_Rule result.second = true; while ((new_iter != end) && (result.second == true)) { - result = rule(iter, end, parent); + result = rule(new_iter, end, parent); new_iter = result.first; } @@ -143,7 +143,6 @@ std::pair Kleene_Rule parent->start = (*iter)->start; parent->end = (*(result.first - 1))->end; - prev_parent->children.push_back(parent); } return std::pair(result.first, true); @@ -169,7 +168,7 @@ std::pair Plus_Rule if (result.second == true) { loop_iter = result.first; result.second = true; - while ((iter != end) && (result.second == true)) { + while ((loop_iter != end) && (result.second == true)) { result = rule(loop_iter, end, parent); loop_iter = result.first; } @@ -209,7 +208,7 @@ std::pair Optional_Rule std::pair result; result.second = true; if ((new_iter != end) && (result.second == true)) { - result = rule(iter, end, parent); + result = rule(new_iter, end, parent); new_iter = result.first; } diff --git a/langkit/main.cpp b/langkit/main.cpp index 8fce1b7..54c0d33 100644 --- a/langkit/main.cpp +++ b/langkit/main.cpp @@ -66,6 +66,7 @@ void parse(std::vector &tokens) { //Example: "def add(x,y)" + Rule params; Rule block(TokenType::Scoped_Block); Rule rule(TokenType::Function_Def); @@ -78,6 +79,11 @@ void parse(std::vector &tokens) { return_statement = Ign(Str("return")) << Id(TokenType::Identifier) << Str("+") << Id(TokenType::Identifier); + /* + Rule rule, rule2; + rule = rule2; + rule2 = Str("Bob"); + */ /* Rule rule(3); rule = Ign(Str("Bob")) << Str("Fred");