diff --git a/langkit/langkit_parser.cpp b/langkit/langkit_parser.cpp index b523e35..0cbfb11 100644 --- a/langkit/langkit_parser.cpp +++ b/langkit/langkit_parser.cpp @@ -121,7 +121,7 @@ std::pair And_Rule(Token_Iterator iter, Token_Iterator end } std::pair Kleene_Rule - (Token_Iterator iter, Token_Iterator end, TokenPtr parent, bool keep, int new_id, struct Rule rule) { + (Token_Iterator iter, Token_Iterator end, TokenPtr parent, bool keep, int new_id, Rule rule) { TokenPtr prev_parent = parent; std::pair result; @@ -149,7 +149,7 @@ std::pair Kleene_Rule } std::pair Plus_Rule - (Token_Iterator iter, Token_Iterator end, TokenPtr parent, bool keep, int new_id, struct Rule rule) { + (Token_Iterator iter, Token_Iterator end, TokenPtr parent, bool keep, int new_id, Rule rule) { unsigned int prev_size; TokenPtr prev_parent = parent; @@ -196,7 +196,7 @@ std::pair Plus_Rule } std::pair Optional_Rule - (Token_Iterator iter, Token_Iterator end, TokenPtr parent, bool keep, int new_id, struct Rule rule) { + (Token_Iterator iter, Token_Iterator end, TokenPtr parent, bool keep, int new_id, Rule rule) { TokenPtr prev_parent = parent; Token_Iterator new_iter = iter; @@ -224,6 +224,33 @@ std::pair Optional_Rule return std::pair(result.first, true); } +std::pair Nop_Rule + (Token_Iterator iter, Token_Iterator end, TokenPtr parent, bool keep, int new_id, Rule rule) { + + TokenPtr prev_parent = parent; + Token_Iterator new_iter = iter; + + if (new_id != -1) { + parent = TokenPtr(new Token("", new_id, parent->filename)); + } + + std::pair result; + result.second = true; + if ((new_iter != end) && (result.second == true)) { + result = rule(new_iter, end, parent); + new_iter = result.first; + } + + if (new_id != -1) { + parent->filename = (*iter)->filename; + parent->start = (*iter)->start; + parent->end = (*(result.first - 1))->end; + + prev_parent->children.push_back(parent); + } + + return std::pair(iter, true); +} Rule Str(const std::string &text, bool keep) { return Rule(boost::bind(String_Rule, _1, _2, _3, _4, _5, text), keep); @@ -246,3 +273,7 @@ Rule Ign(Rule rule) { return rule; } + +Rule Nop(Rule rule) { + return Rule(boost::bind(Nop_Rule, _1, _2, _3, _4, _5, rule)); +} diff --git a/langkit/langkit_parser.hpp b/langkit/langkit_parser.hpp index f600071..cf299c8 100644 --- a/langkit/langkit_parser.hpp +++ b/langkit/langkit_parser.hpp @@ -8,9 +8,11 @@ #include "langkit_lexer.hpp" +struct RuleImpl; + typedef std::vector::iterator Token_Iterator; typedef boost::function(Token_Iterator, Token_Iterator, TokenPtr, bool, int)> RuleFun; -typedef std::tr1::shared_ptr RuleImplPtr; +typedef std::tr1::shared_ptr RuleImplPtr; struct RuleImpl { RuleFun rule; @@ -45,6 +47,9 @@ std::pair Plus_Rule std::pair Optional_Rule (Token_Iterator iter, Token_Iterator end, TokenPtr parent, bool keep, int new_id, struct Rule rule); +std::pair Nop_Rule + (Token_Iterator iter, Token_Iterator end, TokenPtr parent, bool keep, int new_id, struct Rule rule); + struct Rule { RuleImplPtr impl; @@ -58,9 +63,9 @@ struct Rule { } Rule &operator=(const Rule &rule) { - //*impl = *(rule.impl); - impl->rule = rule.impl->rule; - impl->keep = rule.impl->keep; + int prev_id = impl->new_id; + *impl = *(rule.impl); + impl->new_id = prev_id; return *this; } @@ -100,5 +105,6 @@ Rule Str(const std::string &text); Rule Id(int id); Rule Ign(Rule rule); +Rule Nop(Rule rule); #endif /* LANGKIT_PARSER_HPP_ */ diff --git a/langkit/main.cpp b/langkit/main.cpp index 54c0d33..21a3636 100644 --- a/langkit/main.cpp +++ b/langkit/main.cpp @@ -66,7 +66,6 @@ void parse(std::vector &tokens) { //Example: "def add(x,y)" - Rule params; Rule block(TokenType::Scoped_Block); Rule rule(TokenType::Function_Def); @@ -78,12 +77,13 @@ void parse(std::vector &tokens) { block = Ign(Str("{")) << ~return_statement << Ign(Str("}")); return_statement = Ign(Str("return")) << Id(TokenType::Identifier) << Str("+") << Id(TokenType::Identifier); - /* - Rule rule, rule2; - rule = rule2; + Rule rule; + Rule rule2; + rule = Nop(rule2); rule2 = Str("Bob"); */ + /* Rule rule(3); rule = Ign(Str("Bob")) << Str("Fred");