source: trunk/yao/share/antlr-2.7.7/examples/cpp/flexLexer/LexTokenStream.cpp @ 1

Last change on this file since 1 was 1, checked in by lnalod, 15 years ago

Initial import of YAO sources

  • Property svn:eol-style set to native
File size: 1.3 KB
Line 
1//#include <iostream>
2#include "LexTokenStream.hpp"
3#include "JavaTokenTypes.hpp"
4#include "antlr/CommonToken.hpp"
5
6extern "C" {
7        extern char* yytext;
8        extern char string_buf[];               // used for strings
9        extern int yylex();
10        extern int yyrestart(std::FILE*);
11}
12
13static LexTokenStream* currentLexer=0;
14
15extern "C"
16        void newLine()
17{
18        currentLexer->newLine();
19}
20
21LexTokenStream::LexTokenStream(std::FILE* fp)
22{
23        yyrestart(fp);
24        reachedEOF = false;
25        line = 1;
26}
27
28void LexTokenStream::newLine()
29{
30        ++line;
31}
32
33ANTLR_USE_NAMESPACE(antlr)RefToken LexTokenStream::nextToken()
34{
35        ANTLR_USE_NAMESPACE(antlr)RefToken ret;
36        if (!reachedEOF)
37        {
38                int type;
39
40                currentLexer = this;
41                while ((type = yylex()) == -1) // Token::SKIP
42                        ;
43
44                if (type != 0)
45                {
46                        if( type != JavaTokenTypes::STRING_LITERAL )
47                                ret = ANTLR_USE_NAMESPACE(antlr)RefToken(new ANTLR_USE_NAMESPACE(antlr)CommonToken(type,yytext));
48                        else
49                                ret = ANTLR_USE_NAMESPACE(antlr)RefToken(new ANTLR_USE_NAMESPACE(antlr)CommonToken(type,string_buf));
50
51//                      ANTLR_USE_NAMESPACE(std)cout << "Read token " << type << " [" << ret->getText() << "]" << ANTLR_USE_NAMESPACE(std)endl;
52                }
53                else
54                        reachedEOF = true;
55        }
56        if (reachedEOF)
57        {
58                ret = ANTLR_USE_NAMESPACE(antlr)RefToken(new ANTLR_USE_NAMESPACE(antlr)CommonToken(1,"EOF"));
59                //              cout << "EOF reached" << endl;
60        }
61        ret->setLine(line);
62        return ret;
63}
Note: See TracBrowser for help on using the repository browser.