LexTokenStream.cpp
上传用户:afrynkmhm
上传日期:2007-01-06
资源大小:1262k
文件大小:1k
源码类别:

编译器/解释器

开发平台:

Others

  1. //#include <iostream>
  2. #include "LexTokenStream.hpp"
  3. #include "antlr/CommonToken.hpp"
  4. extern "C" {
  5. extern char* yytext;
  6. extern int yylex();
  7. extern int yyrestart(std::FILE*);
  8. }
  9. static LexTokenStream* currentLexer=0;
  10. extern "C"
  11. void newLine()
  12. {
  13. currentLexer->newLine();
  14. }
  15. LexTokenStream::LexTokenStream(std::FILE* fp)
  16. {
  17. yyrestart(fp);
  18. reachedEOF = false;
  19. line = 1;
  20. }
  21. void LexTokenStream::newLine()
  22. {
  23. ++line;
  24. }
  25. ANTLR_USE_NAMESPACE(antlr)RefToken LexTokenStream::nextToken()
  26. {
  27. ANTLR_USE_NAMESPACE(antlr)RefToken ret;
  28. if (!reachedEOF) {
  29. int type;
  30. currentLexer = this;
  31. while ((type = yylex()) == -1) // Token::SKIP
  32. ;
  33. if (type != 0) {
  34. ret = ANTLR_USE_NAMESPACE(antlr)RefToken(new ANTLR_USE_NAMESPACE(antlr)CommonToken(type,yytext));
  35. // cout << "Read token " << type << " [" << yytext << "]" << endl;
  36. } else
  37. reachedEOF = true;
  38. }
  39. if (reachedEOF) {
  40. ret = ANTLR_USE_NAMESPACE(antlr)RefToken(new ANTLR_USE_NAMESPACE(antlr)CommonToken(1,"EOF"));
  41. // cout << "EOF reached" << endl;
  42. }
  43. ret->setLine(line);
  44. return ret;
  45. }