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 }