From 421a61692421ef4bafad6ef41cd1413a79e0557e Mon Sep 17 00:00:00 2001 From: Jonathan Turner Date: Wed, 27 May 2009 17:42:54 +0000 Subject: [PATCH] Inch by inch, getting closer to working out what the parser needs --- boxedcpp/proxy_constructors.hpp | 4 +-- boxedcpp/test.cpp | 5 ++-- langkit/langkit_parser.cpp | 52 ++++++++++++++++++--------------- langkit/langkit_parser.hpp | 19 ++++++++---- langkit/main.cpp | 20 ++++++++----- 5 files changed, 59 insertions(+), 41 deletions(-) diff --git a/boxedcpp/proxy_constructors.hpp b/boxedcpp/proxy_constructors.hpp index b86c5ff..cbb2b3e 100644 --- a/boxedcpp/proxy_constructors.hpp +++ b/boxedcpp/proxy_constructors.hpp @@ -27,14 +27,14 @@ boost::function ()> build_constructor() # endif #else # define n BOOST_PP_ITERATION() - + template boost::shared_ptr constructor( BOOST_PP_ENUM_BINARY_PARAMS(n, Param, p) ) { return boost::shared_ptr(new Class( BOOST_PP_ENUM_PARAMS(n, p) )); } - + template boost::function (BOOST_PP_ENUM_PARAMS(n, Param))> build_constructor() { diff --git a/boxedcpp/test.cpp b/boxedcpp/test.cpp index ebf3c98..050adb8 100644 --- a/boxedcpp/test.cpp +++ b/boxedcpp/test.cpp @@ -40,7 +40,7 @@ struct Test double md; }; -void print_out(const std::string &s) +void print(const std::string &s) { std::cout << "Printed: " << s << std::endl; } @@ -68,8 +68,7 @@ int main() //Register a new function, this one with typing for us, so we don't have to ubox anything //right here - //JDT: Was giving me compiler errors (not sure why) - ss.register_function(boost::function(&print_out), "print"); + ss.register_function(boost::function(&print), "print"); //Now we have a print method, let's try to print out the earlier example: //so, we dispatch the to_string and pass its result as a param to "print" diff --git a/langkit/langkit_parser.cpp b/langkit/langkit_parser.cpp index bfd3ced..16bd635 100644 --- a/langkit/langkit_parser.cpp +++ b/langkit/langkit_parser.cpp @@ -6,62 +6,68 @@ #include "langkit_lexer.hpp" #include "langkit_parser.hpp" -std::pair String_Rule(Token_Iterator iter, Token_Iterator end, const std::string &val) { - if (iter != end) { +std::pair String_Rule(Token_Iterator iter, Token_Iterator end, TokenPtr parent, const std::string &val, bool keep) { + if (*iter != *end) { if ((*iter)->text == val) { - return std::pair(++iter, *iter); + if (keep) { + parent->children.push_back(*iter); + } + return std::pair(++iter, true); } } - return std::pair(iter, *iter); + return std::pair(iter, false); } -std::pair Type_Rule(Token_Iterator iter, Token_Iterator end, const int val) { - if (iter != end) { +std::pair Type_Rule(Token_Iterator iter, Token_Iterator end, TokenPtr parent, const int val, bool keep) { + if (*iter != *end) { if ((*iter)->identifier == val) { - return std::pair(++iter, *iter); + if (keep) { + parent->children.push_back(*iter); + } + return std::pair(++iter, true); } } - return std::pair(iter, *iter); + return std::pair(iter, false); } -std::pair Or_Rule(Token_Iterator iter, Token_Iterator end, const Rule &lhs, const Rule &rhs) { +std::pair Or_Rule(Token_Iterator iter, Token_Iterator end, TokenPtr parent, const Rule &lhs, const Rule &rhs, bool keep, int new_id) { Token_Iterator new_iter; - if (iter != end) { - new_iter = lhs.rule(iter, end).first; + if (*iter != *end) { + new_iter = lhs.rule(iter, end, parent).first; if (new_iter != iter) { - return std::pair(new_iter, *iter); + return std::pair(new_iter, true); } else { - new_iter = rhs.rule(iter, end).first; + new_iter = rhs.rule(iter, end, parent).first; if (new_iter != iter) { - return std::pair(new_iter, *iter); + return std::pair(new_iter, true); } } } - return std::pair(iter, *iter); + return std::pair(iter, false); } -std::pair And_Rule(Token_Iterator iter, Token_Iterator end, const Rule &lhs, const Rule &rhs) { +std::pair And_Rule(Token_Iterator iter, Token_Iterator end, TokenPtr parent, const Rule &lhs, const Rule &rhs, bool keep, int new_id) { Token_Iterator lhs_iter, rhs_iter; - if (iter != end) { - lhs_iter = lhs.rule(iter, end).first; + if (*iter != *end) { + lhs_iter = lhs.rule(iter, end, parent).first; if (lhs_iter != iter) { - rhs_iter = rhs.rule(iter, end).first; + rhs_iter = rhs.rule(iter, end, parent).first; if (rhs_iter != iter) { - return std::pair(rhs_iter, *iter); + return std::pair(rhs_iter, true); } } } - return std::pair(iter, *iter); + return std::pair(iter, false); } -std::pair Rule::operator()(Token_Iterator iter, Token_Iterator end) { - return this->rule(iter, end); +std::pair Rule::operator()(Token_Iterator iter, Token_Iterator end, TokenPtr parent) { + return this->rule(iter, end, parent); } diff --git a/langkit/langkit_parser.hpp b/langkit/langkit_parser.hpp index 640f37e..03f4bb4 100644 --- a/langkit/langkit_parser.hpp +++ b/langkit/langkit_parser.hpp @@ -12,17 +12,24 @@ typedef std::vector::iterator Token_Iterator; struct Rule { int identifier; - boost::function(Token_Iterator iter, Token_Iterator end)> rule; - std::pair operator()(Token_Iterator iter, Token_Iterator end); + boost::function(Token_Iterator iter, Token_Iterator end, TokenPtr parent)> rule; + std::pair operator()(Token_Iterator iter, Token_Iterator end, TokenPtr parent); Rule() : identifier(-1) {} Rule(int id) : identifier(id) {} }; -std::pair String_Rule(Token_Iterator iter, Token_Iterator end, const std::string &val); -std::pair Type_Rule(Token_Iterator iter, Token_Iterator end, const int val); -std::pair Or_Rule(Token_Iterator iter, Token_Iterator end, const Rule &lhs, const Rule &rhs); -std::pair And_Rule(Token_Iterator iter, Token_Iterator end, const Rule &lhs, const Rule &rhs); +std::pair String_Rule + (Token_Iterator iter, Token_Iterator end, TokenPtr parent, const std::string &val, bool keep); + +std::pair Type_Rule + (Token_Iterator iter, Token_Iterator end, TokenPtr parent, const int val, bool keep); + +std::pair Or_Rule + (Token_Iterator iter, Token_Iterator end, TokenPtr parent, const Rule &lhs, const Rule &rhs, bool keep, int new_id); + +std::pair And_Rule + (Token_Iterator iter, Token_Iterator end, TokenPtr parent, const Rule &lhs, const Rule &rhs, bool keep, int new_id); #endif /* LANGKIT_PARSER_HPP_ */ diff --git a/langkit/main.cpp b/langkit/main.cpp index e12dd62..ffa5ca1 100644 --- a/langkit/main.cpp +++ b/langkit/main.cpp @@ -13,13 +13,18 @@ class TokenType { public: enum Type { Whitespace, Identifier, Number, Operator, Parens_Open, Parens_Close, Square_Open, Square_Close, Curly_Open, Curly_Close, Comma, Quoted_String, Single_Quoted_String, Carriage_Return, Semicolon }; }; -void debug_print(TokenPtr token) { - std::cout << "Token: " << token->text << "(" << token->identifier << ") @ " << token->filename << ": (" << token->start.column +void debug_print(TokenPtr token, std::string prepend) { + std::cout << prepend << "Token: " << token->text << "(" << token->identifier << ") @ " << token->filename << ": (" << token->start.column << ", " << token->start.line << ") to (" << token->end.column << ", " << token->end.line << ") " << std::endl; + + for (unsigned int i = 0; i < token->children.size(); ++i) { + debug_print(token->children[i], prepend + " "); + } } + void debug_print(std::vector &tokens) { for (unsigned int i = 0; i < tokens.size(); ++i) { - debug_print(tokens[i]); + debug_print(tokens[i], ""); } } @@ -44,15 +49,16 @@ std::string load_file(const char *filename) { void parse(std::vector &tokens) { Rule rule; - rule.rule = boost::bind(String_Rule, _1, _2, "def"); + rule.rule = boost::bind(String_Rule, _1, _2, _3, "def", true); Token_Iterator iter = tokens.begin(), end = tokens.end(); + TokenPtr parent(new Token("Root", 0, "test")); - std::pair results = rule(iter, end); + std::pair results = rule(iter, end, parent); - if (results.first != iter) { + if (results.second) { std::cout << "Parse successful: " << std::endl; - debug_print(results.second); + debug_print(parent, ""); } }