| #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(); |
| } |