lexer working with pcre, not building any objects for handling tokens yet

This commit is contained in:
Josh Holtrop committed 2010-05-15 00:43:55 -04:00
1 parent 25888fe55a
commit 96010ea9ae
5 files changed
+37 -5

No files matched your search

+1
View File
@@ -6,3 +6,4 @@ tags
tmpl.*
tests/*/itest.cc
tests/*/itest.h
tests/*/test
+1 -1
View File
@@ -6,7 +6,7 @@ LDFLAGS := -lpcre
all: $(TARGET)
$(TARGET):
$(TARGET): $(shell which imbecile)
imbecile $(I_SOURCE).I
$(CXX) -o $@ *.cc $(LDFLAGS)
+8 -3
View File
@@ -1,9 +1,14 @@
[tokens]
ASSIGN :=
DASSIGN :==
IDENTIFIER [a-zA-Z_][a-zA-Z_0-9]*
AND and
OR or
NOT not
LPAREN \(
RPAREN \)
WS \s+
EQUALS =
IDENTIFIER [a-zA-Z_][a-zA-Z_0-9]*
[rules]
+16
View File
@@ -0,0 +1,16 @@
#include <sstream>
#include <string>
#include "itest.h"
using namespace std;
int main(int argc, char * argv[])
{
Parser p;
stringstream t(string(
"hi there (one and two and three and four) or (two = nine)"
));
p.parse(t);
}
+11 -1
View File
@@ -88,7 +88,7 @@ bool I_CLASSNAME::parse(istream & i)
while (buff_pos < buff_size)
{
int longest_match_length = 0;
int longest_match_index;
int longest_match_index = -1;
int longest_match_ovector[ovector_size];
for (int i = 0; i < sizeof(tokens)/sizeof(tokens[0]); i++)
{
@@ -108,6 +108,16 @@ bool I_CLASSNAME::parse(istream & i)
}
}
}
if (longest_match_index >= 0)
{
cout << "Matched a " << tokens[longest_match_index].name << endl;
buff_pos += longest_match_length;
}
else
{
/* no pattern matched the input at the current position */
return false;
}
}
}