1*16467b97STreehugger Robot #include "UserTestTraits.hpp"
2*16467b97STreehugger Robot #include "t051lexer.hpp"
3*16467b97STreehugger Robot
4*16467b97STreehugger Robot #include <sys/types.h>
5*16467b97STreehugger Robot
6*16467b97STreehugger Robot #include <iostream>
7*16467b97STreehugger Robot #include <sstream>
8*16467b97STreehugger Robot #include <fstream>
9*16467b97STreehugger Robot
10*16467b97STreehugger Robot using namespace Antlr3Test;
11*16467b97STreehugger Robot using namespace std;
12*16467b97STreehugger Robot
13*16467b97STreehugger Robot static t051lexer* lxr;
14*16467b97STreehugger Robot
15*16467b97STreehugger Robot static string slurp(string const& fileName);
16*16467b97STreehugger Robot static void parseFile(const char* fName);
17*16467b97STreehugger Robot
main(int argc,char * argv[])18*16467b97STreehugger Robot int main (int argc, char *argv[])
19*16467b97STreehugger Robot {
20*16467b97STreehugger Robot if (argc < 2 || argv[1] == NULL)
21*16467b97STreehugger Robot {
22*16467b97STreehugger Robot parseFile("./t051.input"); // Note in VS2005 debug, working directory must be configured
23*16467b97STreehugger Robot }
24*16467b97STreehugger Robot else
25*16467b97STreehugger Robot {
26*16467b97STreehugger Robot for (int i = 1; i < argc; i++)
27*16467b97STreehugger Robot {
28*16467b97STreehugger Robot parseFile(argv[i]);
29*16467b97STreehugger Robot }
30*16467b97STreehugger Robot }
31*16467b97STreehugger Robot
32*16467b97STreehugger Robot printf("finished parsing OK\n"); // Finnish parking is pretty good - I think it is all the snow
33*16467b97STreehugger Robot
34*16467b97STreehugger Robot return 0;
35*16467b97STreehugger Robot }
36*16467b97STreehugger Robot
parseFile(const char * fName)37*16467b97STreehugger Robot void parseFile(const char* fName)
38*16467b97STreehugger Robot {
39*16467b97STreehugger Robot t051lexerTraits::InputStreamType* input;
40*16467b97STreehugger Robot t051lexerTraits::TokenStreamType* tstream;
41*16467b97STreehugger Robot
42*16467b97STreehugger Robot string data = slurp(fName);
43*16467b97STreehugger Robot
44*16467b97STreehugger Robot input = new t051lexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
45*16467b97STreehugger Robot ANTLR_ENC_8BIT,
46*16467b97STreehugger Robot data.length(), //strlen(data.c_str()),
47*16467b97STreehugger Robot (ANTLR_UINT8*)fName);
48*16467b97STreehugger Robot
49*16467b97STreehugger Robot input->setUcaseLA(true);
50*16467b97STreehugger Robot
51*16467b97STreehugger Robot // Our input stream is now open and all set to go, so we can create a new instance of our
52*16467b97STreehugger Robot // lexer and set the lexer input to our input stream:
53*16467b97STreehugger Robot // (file | memory | ?) --> inputstream -> lexer --> tokenstream --> parser ( --> treeparser )?
54*16467b97STreehugger Robot //
55*16467b97STreehugger Robot if (lxr == NULL)
56*16467b97STreehugger Robot {
57*16467b97STreehugger Robot lxr = new t051lexer(input); // javaLexerNew is generated by ANTLR
58*16467b97STreehugger Robot }
59*16467b97STreehugger Robot else
60*16467b97STreehugger Robot {
61*16467b97STreehugger Robot lxr->setCharStream(input);
62*16467b97STreehugger Robot }
63*16467b97STreehugger Robot
64*16467b97STreehugger Robot tstream = new t051lexerTraits::TokenStreamType(ANTLR_SIZE_HINT, lxr->get_tokSource());
65*16467b97STreehugger Robot
66*16467b97STreehugger Robot putc('L', stdout); fflush(stdout);
67*16467b97STreehugger Robot {
68*16467b97STreehugger Robot ANTLR_INT32 T = 0;
69*16467b97STreehugger Robot while (T != t051lexer::EOF_TOKEN)
70*16467b97STreehugger Robot {
71*16467b97STreehugger Robot T = tstream->_LA(1);
72*16467b97STreehugger Robot t051lexerTraits::CommonTokenType const* token = tstream->_LT(1);
73*16467b97STreehugger Robot
74*16467b97STreehugger Robot printf("%d\t\"%s\"\n",
75*16467b97STreehugger Robot T,
76*16467b97STreehugger Robot tstream->_LT(1)->getText().c_str()
77*16467b97STreehugger Robot );
78*16467b97STreehugger Robot tstream->consume();
79*16467b97STreehugger Robot }
80*16467b97STreehugger Robot }
81*16467b97STreehugger Robot
82*16467b97STreehugger Robot tstream->_LT(1); // Don't do this mormally, just causes lexer to run for timings here
83*16467b97STreehugger Robot
84*16467b97STreehugger Robot delete tstream;
85*16467b97STreehugger Robot delete lxr; lxr = NULL;
86*16467b97STreehugger Robot delete input;
87*16467b97STreehugger Robot }
88*16467b97STreehugger Robot
slurp(string const & fileName)89*16467b97STreehugger Robot string slurp(string const& fileName)
90*16467b97STreehugger Robot {
91*16467b97STreehugger Robot ifstream ifs(fileName.c_str(), ios::in | ios::binary | ios::ate);
92*16467b97STreehugger Robot ifstream::pos_type fileSize = ifs.tellg();
93*16467b97STreehugger Robot ifs.seekg(0, ios::beg);
94*16467b97STreehugger Robot
95*16467b97STreehugger Robot stringstream sstr;
96*16467b97STreehugger Robot sstr << ifs.rdbuf();
97*16467b97STreehugger Robot return sstr.str();
98*16467b97STreehugger Robot }
99