99 lines
2.2 KiB
C++
99 lines
2.2 KiB
C++
#include "UserTestTraits.hpp"
|
|
#include "t051lexer.hpp"
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include <iostream>
|
|
#include <sstream>
|
|
#include <fstream>
|
|
|
|
using namespace Antlr3Test;
|
|
using namespace std;
|
|
|
|
static t051lexer* lxr;
|
|
|
|
static string slurp(string const& fileName);
|
|
static void parseFile(const char* fName);
|
|
|
|
int main (int argc, char *argv[])
|
|
{
|
|
if (argc < 2 || argv[1] == NULL)
|
|
{
|
|
parseFile("./t051.input"); // Note in VS2005 debug, working directory must be configured
|
|
}
|
|
else
|
|
{
|
|
for (int i = 1; i < argc; i++)
|
|
{
|
|
parseFile(argv[i]);
|
|
}
|
|
}
|
|
|
|
printf("finished parsing OK\n"); // Finnish parking is pretty good - I think it is all the snow
|
|
|
|
return 0;
|
|
}
|
|
|
|
void parseFile(const char* fName)
|
|
{
|
|
t051lexerTraits::InputStreamType* input;
|
|
t051lexerTraits::TokenStreamType* tstream;
|
|
|
|
string data = slurp(fName);
|
|
|
|
input = new t051lexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
|
|
ANTLR_ENC_8BIT,
|
|
data.length(), //strlen(data.c_str()),
|
|
(ANTLR_UINT8*)fName);
|
|
|
|
input->setUcaseLA(true);
|
|
|
|
// Our input stream is now open and all set to go, so we can create a new instance of our
|
|
// lexer and set the lexer input to our input stream:
|
|
// (file | memory | ?) --> inputstream -> lexer --> tokenstream --> parser ( --> treeparser )?
|
|
//
|
|
if (lxr == NULL)
|
|
{
|
|
lxr = new t051lexer(input); // javaLexerNew is generated by ANTLR
|
|
}
|
|
else
|
|
{
|
|
lxr->setCharStream(input);
|
|
}
|
|
|
|
tstream = new t051lexerTraits::TokenStreamType(ANTLR_SIZE_HINT, lxr->get_tokSource());
|
|
|
|
putc('L', stdout); fflush(stdout);
|
|
{
|
|
ANTLR_INT32 T = 0;
|
|
while (T != t051lexer::EOF_TOKEN)
|
|
{
|
|
T = tstream->_LA(1);
|
|
t051lexerTraits::CommonTokenType const* token = tstream->_LT(1);
|
|
|
|
printf("%d\t\"%s\"\n",
|
|
T,
|
|
tstream->_LT(1)->getText().c_str()
|
|
);
|
|
tstream->consume();
|
|
}
|
|
}
|
|
|
|
tstream->_LT(1); // Don't do this mormally, just causes lexer to run for timings here
|
|
|
|
delete tstream;
|
|
delete lxr; lxr = NULL;
|
|
delete input;
|
|
}
|
|
|
|
string slurp(string const& fileName)
|
|
{
|
|
ifstream ifs(fileName.c_str(), ios::in | ios::binary | ios::ate);
|
|
ifstream::pos_type fileSize = ifs.tellg();
|
|
ifs.seekg(0, ios::beg);
|
|
|
|
stringstream sstr;
|
|
sstr << ifs.rdbuf();
|
|
return sstr.str();
|
|
}
|