From d8ac8c15c2e2b56f01244a4aac8801ceba2927e2 Mon Sep 17 00:00:00 2001 From: Keith Winstein Date: Sun, 9 Jan 2011 04:39:51 -0500 Subject: [PATCH] Implemented parser --- Makefile | 7 +++++-- parse.cpp | 8 ++++++++ parser.cpp | 21 +++++++++++++++++++++ parser.hpp | 7 +++++-- parserstate.hpp | 7 +++---- 5 files changed, 42 insertions(+), 8 deletions(-) create mode 100644 parser.cpp diff --git a/Makefile b/Makefile index 29709ea..6f18d16 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ -source = parse.cpp parserstate.cpp -objects = parserstate.o +source = parse.cpp parserstate.cpp parser.cpp templates.cpp +objects = parserstate.o parser.o templates.o executables = parse CPP = g++ @@ -11,6 +11,9 @@ all: $(executables) parse: parse.o $(objects) $(CPP) $(CPPFLAGS) -o $@ $+ $(LIBS) +templates.o: templates.cpp + $(CPP) $(CPPFLAGS) -frepo -c -o $@ $< + %.o: %.cpp $(CPP) $(CPPFLAGS) -c -o $@ $< diff --git a/parse.cpp b/parse.cpp index 3326f68..9470395 100644 --- a/parse.cpp +++ b/parse.cpp @@ -1,8 +1,16 @@ +#include + #include "parser.hpp" int main( void ) { Parser::Parser parser; + std::vector a, b, c; + + a = parser.input( 'x' ); + b = parser.input( 'y' ); + c = parser.input( 'z' ); + return 0; } diff --git a/parser.cpp b/parser.cpp new file mode 100644 index 0000000..f1d6426 --- /dev/null +++ b/parser.cpp @@ -0,0 +1,21 @@ +#include "parser.hpp" + +std::vector Parser::Parser::input( wchar_t ch ) +{ + std::vector ret; + + Transition tx = state->input( ch ); + + if ( tx.next_state != NULL ) { + ret.push_back( state->exit() ); + } + + ret.push_back( tx.action ); + + if ( tx.next_state != NULL ) { + ret.push_back( tx.next_state->enter() ); + state = tx.next_state; + } + + return ret; +} diff --git a/parser.hpp b/parser.hpp index 14a20a8..e46fe6d 100644 --- a/parser.hpp +++ b/parser.hpp @@ -2,6 +2,7 @@ #define PARSE_HPP #include +#include #include "parsertransition.hpp" #include "parseraction.hpp" @@ -15,11 +16,13 @@ namespace Parser { State *state; public: - Parser() : family(), state( NULL ) {} + Parser() : family(), state( &family.s_Ground ) {} + Parser( const Parser & ); bool operator=( const Parser & ); - void input( wchar_t c ); /* should return list of actions */ ~Parser() {} + + std::vector input( wchar_t c ); }; } diff --git a/parserstate.hpp b/parserstate.hpp index 448a769..6991648 100644 --- a/parserstate.hpp +++ b/parserstate.hpp @@ -13,14 +13,13 @@ namespace Parser { StateFamily *family; private: - virtual Action enter( void ) { return Ignore(); }; - virtual Action exit( void ) { return Ignore(); }; - - Transition input( wchar_t ch ); Transition anywhere_rule( wchar_t ch ); public: void setfamily( StateFamily *s_family ) { family = s_family; } + Transition input( wchar_t ch ); + virtual Action enter( void ) { return Ignore(); }; + virtual Action exit( void ) { return Ignore(); }; State() : family( NULL ) {}; virtual ~State() {};