Working up parser combinators
This commit is contained in:
@@ -10,7 +10,7 @@ find_package( Boost 1.36.0 COMPONENTS regex)
|
|||||||
if(Boost_FOUND)
|
if(Boost_FOUND)
|
||||||
include_directories(${Boost_INCLUDE_DIRS})
|
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})
|
target_link_libraries(langkit_test ${Boost_LIBRARIES})
|
||||||
|
|
||||||
add_executable(typelesscpp_test typelesscpp/test.cpp)
|
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();
|
std::streampos size = infile.tellg();
|
||||||
infile.seekg(0, std::ios::beg);
|
infile.seekg(0, std::ios::beg);
|
||||||
|
|
||||||
std::cout << "Allocating: " << size << " bytes" << std::endl;
|
|
||||||
|
|
||||||
std::vector<char> v(size);
|
std::vector<char> v(size);
|
||||||
infile.read(&v[0], 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