From 7f628d9130d74d84cacc3efcf5a0fb5ccc1ab944 Mon Sep 17 00:00:00 2001 From: Jonathan Turner Date: Tue, 26 May 2009 20:17:42 +0000 Subject: [PATCH] Working up parser combinators --- CMakeLists.txt | 2 +- langkit/langkit_parser.cpp | 61 ++++++++++++++++++++++++++++++++++++++ langkit/langkit_parser.hpp | 17 +++++++++++ langkit/main.cpp | 2 -- langkit/tests/roundtrip.gt | 1 + 5 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 langkit/langkit_parser.cpp create mode 100644 langkit/langkit_parser.hpp create mode 100644 langkit/tests/roundtrip.gt diff --git a/CMakeLists.txt b/CMakeLists.txt index f8d6425..cc5a6ba 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ find_package( Boost 1.36.0 COMPONENTS regex) if(Boost_FOUND) include_directories(${Boost_INCLUDE_DIRS}) - add_executable(langkit_test langkit/main.cpp langkit/langkit_lexer.cpp) + add_executable(langkit_test langkit/main.cpp langkit/langkit_lexer.cpp langkit/langkit_parser.cpp) target_link_libraries(langkit_test ${Boost_LIBRARIES}) add_executable(typelesscpp_test typelesscpp/test.cpp) diff --git a/langkit/langkit_parser.cpp b/langkit/langkit_parser.cpp new file mode 100644 index 0000000..b36a563 --- /dev/null +++ b/langkit/langkit_parser.cpp @@ -0,0 +1,61 @@ +// This file is distributed under the BSD License. +// See LICENSE.TXT for details. + +#include "langkit_lexer.hpp" +#include "langkit_parser.hpp" + +Token_Iterator String_Rule(Token_Iterator iter, Token_Iterator end, const std::string &val) { + if (iter != end) { + if (iter->text == val) { + return ++iter; + } + } + + return iter; +} + +Token_Iterator Type_Rule(Token_Iterator iter, Token_Iterator end, const int val) { + if (iter != end) { + if (iter->identifier == val) { + return ++iter; + } + } + + return iter; +} + +Token_Iterator Or_Rule(Token_Iterator iter, Token_Iterator end, const Rule &lhs, const Rule &rhs) { + Token_Iterator new_iter; + + if (iter != end) { + new_iter = lhs.rule(iter, end); + + if (new_iter != iter) { + return new_iter; + } + else { + new_iter = rhs.rule(iter, end); + if (new_iter != iter) { + return new_iter; + } + } + } + return iter; +} + +Token_Iterator And_Rule(Token_Iterator iter, Token_Iterator end, const Rule &lhs, const Rule &rhs) { + Token_Iterator lhs_iter, rhs_iter; + + if (iter != end) { + lhs_iter = lhs.rule(iter, end); + + if (lhs_iter != iter) { + rhs_iter = rhs.rule(iter, end); + if (rhs_iter != iter) { + return rhs_iter; + } + } + } + + return iter; +} diff --git a/langkit/langkit_parser.hpp b/langkit/langkit_parser.hpp new file mode 100644 index 0000000..acf8059 --- /dev/null +++ b/langkit/langkit_parser.hpp @@ -0,0 +1,17 @@ +// This file is distributed under the BSD License. +// See LICENSE.TXT for details. + +#ifndef LANGKIT_PARSER_HPP_ +#define LANGKIT_PARSER_HPP_ + +#include + +#include "langkit_lexer.hpp" + +typedef std::vector::iterator Token_Iterator; + +struct Rule { + boost::function rule; +}; + +#endif /* LANGKIT_PARSER_HPP_ */ diff --git a/langkit/main.cpp b/langkit/main.cpp index 4af9c65..341675b 100644 --- a/langkit/main.cpp +++ b/langkit/main.cpp @@ -31,8 +31,6 @@ std::string load_file(const char *filename) { std::streampos size = infile.tellg(); infile.seekg(0, std::ios::beg); - std::cout << "Allocating: " << size << " bytes" << std::endl; - std::vector v(size); infile.read(&v[0], size); diff --git a/langkit/tests/roundtrip.gt b/langkit/tests/roundtrip.gt new file mode 100644 index 0000000..3115e20 --- /dev/null +++ b/langkit/tests/roundtrip.gt @@ -0,0 +1 @@ +def add(x, y) { return x+y }