xref: /aosp_15_r20/external/antlr/runtime/Cpp/tests/t051.cpp (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
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