Working up parser combinators

This commit is contained in:
Jonathan Turner
2009-05-26 20:17:42 +00:00
parent 8138b19390
commit 7f628d9130
5 changed files with 80 additions and 3 deletions

View File

@@ -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)

View File

@@ -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;
}

View File

@@ -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 <boost/function.hpp>
#include "langkit_lexer.hpp"
typedef std::vector<Token>::iterator Token_Iterator;
struct Rule {
boost::function<Token_Iterator(Token_Iterator iter, Token_Iterator end)> rule;
};
#endif /* LANGKIT_PARSER_HPP_ */

View File

@@ -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<char> v(size);
infile.read(&v[0], size);

View File

@@ -0,0 +1 @@
def add(x, y) { return x+y }