--- /dev/null
+#include "imarker.h"
+
+void IMarker::advance(void)
+{
+ cur_location++;
+}
+
+unsigned int IMarker::location(void)
+{
+ return cur_location;
+}
+
+void IMarker::location(unsigned int index)
+{
+ cur_location = index;
+}
+
+unsigned int IMarker::mark(void)
+{
+ unsigned int index = location();
+ markers.push_back( index );
+ return index;
+}
+
+void IMarker::release(void)
+{
+ unsigned int marker = markers.back();
+ markers.pop_back();
+ seek(marker);
+}
+
+void IMarker::seek(unsigned int index)
+{
+ location( index );
+}
+
+bool IMarker::isMarked(void)
+{
+ return (markers.size() > 0);
+}
+
--- /dev/null
+#ifndef ISTREAM_H
+#define ISTREAM_H
+
+#include <vector>
+
+class IMarker
+{
+ protected:
+ unsigned int cur_location;
+ std::vector<unsigned int> markers;
+ public:
+ void advance(void);
+ unsigned int location(void);
+ void location(unsigned int index);
+ unsigned int mark(void);
+ void release(void);
+ void seek(unsigned int index);
+ bool isMarked(void);
+};
+
+#endif
using namespace std;
-BTParser::BTParser() : current(0)
+BTParser::BTParser()
{
}
void BTParser::consume(void)
{
- current++;
- if((current == lookahead.size()) && !isSpeculating())
+ advance();
+ if((location() == lookahead.size()) && !isMarked())
{
- current = 0;
+ seek(0);
lookahead.clear();
}
sync(1);
void BTParser::sync(unsigned int i)
{
- unsigned int next_index = current + i - 1;
+ unsigned int next_index = location() + i - 1;
unsigned int max_index = (lookahead.size() - 1);
if( lookahead.size() == 0 )
Token& BTParser::lookaheadToken(unsigned int i)
{
sync(i);
- return lookahead.at( current + i - 1 );
+ return lookahead.at( location() + i - 1 );
}
TokenType_T BTParser::lookaheadType(unsigned int i)
return lookaheadToken(i).type();
}
-unsigned int BTParser::mark(void)
-{
- markers.push_back(current);
- return current;
-}
-
-void BTParser::release(void)
-{
- unsigned int marker = markers.back();
- markers.pop_back();
- seek(marker);
-}
-
-void BTParser::seek(unsigned int index)
-{
- current = index;
-}
-
-bool BTParser::isSpeculating(void)
-{
- return (markers.size() > 0);
-}
-
#include <exception>
#include <vector>
+#include "imarker.h"
#include "iparser.h"
-class BTParser : public IParser
+class BTParser : public IMarker, public IParser
{
protected:
- unsigned int current;
- std::vector<unsigned int> markers;
std::vector<Token> lookahead;
public:
BTParser();
- ~BTParser();
+ virtual ~BTParser();
void consume(void);
void sync(unsigned int i);
void match(TokenType_T type);
Token& lookaheadToken(unsigned int i);
TokenType_T lookaheadType(unsigned int i);
- unsigned int mark(void);
- void release(void);
- void seek(unsigned int index);
- bool isSpeculating(void);
};
#endif