Working up parser combinators
This commit is contained in:
@@ -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)
|
||||
|
61
langkit/langkit_parser.cpp
Normal file
61
langkit/langkit_parser.cpp
Normal 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;
|
||||
}
|
17
langkit/langkit_parser.hpp
Normal file
17
langkit/langkit_parser.hpp
Normal 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_ */
|
@@ -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);
|
||||
|
||||
|
1
langkit/tests/roundtrip.gt
Normal file
1
langkit/tests/roundtrip.gt
Normal file
@@ -0,0 +1 @@
|
||||
def add(x, y) { return x+y }
|
Reference in New Issue
Block a user