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

编译器/解释器

开发平台:

Others

  1. #ifndef INC_CharScanner_hpp__
  2. #define INC_CharScanner_hpp__
  3. /**
  4.  * <b>SOFTWARE RIGHTS</b>
  5.  * <p>
  6.  * ANTLR 2.6.0 MageLang Insitute, 1999
  7.  * <p>
  8.  * We reserve no legal rights to the ANTLR--it is fully in the
  9.  * public domain. An individual or company may do whatever
  10.  * they wish with source code distributed with ANTLR or the
  11.  * code generated by ANTLR, including the incorporation of
  12.  * ANTLR, or its output, into commerical software.
  13.  * <p>
  14.  * We encourage users to develop software with ANTLR. However,
  15.  * we do ask that credit is given to us for developing
  16.  * ANTLR. By "credit", we mean that if you use ANTLR or
  17.  * incorporate any source code into one of your programs
  18.  * (commercial product, research project, or otherwise) that
  19.  * you acknowledge this fact somewhere in the documentation,
  20.  * research report, etc... If you like ANTLR and have
  21.  * developed a nice tool with the output, please mention that
  22.  * you developed it using ANTLR. In addition, we ask that the
  23.  * headers remain intact in our source code. As long as these
  24.  * guidelines are kept, we expect to continue enhancing this
  25.  * system and expect to make other tools available as they are
  26.  * completed.
  27.  * <p>
  28.  * The ANTLR gang:
  29.  * @version ANTLR 2.6.0 MageLang Insitute, 1999
  30.  * @author Terence Parr, <a href=http://www.MageLang.com>MageLang Institute</a>
  31.  * @author <br>John Lilley, <a href=http://www.Empathy.com>Empathy Software</a>
  32.  * @author <br><a href="mailto:pete@yamuna.demon.co.uk">Pete Wells</a>
  33.  */
  34. #include "antlr/config.hpp"
  35. #include "antlr/TokenStream.hpp"
  36. #include "antlr/RecognitionException.hpp"
  37. #include "antlr/InputBuffer.hpp"
  38. #include "antlr/BitSet.hpp"
  39. #include "antlr/LexerSharedInputState.hpp"
  40. #include <map>
  41. ANTLR_BEGIN_NAMESPACE(antlr)
  42. class CharScanner;
  43. class CharScannerLiteralsLess : public ANTLR_USE_NAMESPACE(std)binary_function<ANTLR_USE_NAMESPACE(std)string,ANTLR_USE_NAMESPACE(std)string,bool> {
  44. private:
  45. const CharScanner* scanner;
  46. public:
  47. #ifdef NO_TEMPLATE_PARTS
  48. CharScannerLiteralsLess(); // not really used
  49. #endif
  50. CharScannerLiteralsLess(const CharScanner* theScanner);
  51. bool operator() (const ANTLR_USE_NAMESPACE(std)string& x,const ANTLR_USE_NAMESPACE(std)string& y) const;
  52. };
  53. class CharScanner : public TokenStream {
  54. private:
  55. #ifndef NO_STATIC_CONSTS
  56. static const int NO_CHAR = 0;
  57. #else
  58. enum {
  59. NO_CHAR = 0
  60. };
  61. #endif
  62. public:
  63. #ifndef NO_STATIC_CONSTS
  64. static const int EOF_CHAR = EOF;
  65. #else
  66. enum {
  67. EOF_CHAR = EOF
  68. };
  69. #endif
  70. protected:
  71. ANTLR_USE_NAMESPACE(std)string text; // text of current token
  72. bool saveConsumedInput; // does consume() save characters?
  73. typedef RefToken (*factory_type)();
  74. factory_type tokenFactory; // what kind of tokens to create?
  75. bool caseSensitive;
  76. ANTLR_USE_NAMESPACE(std)map<ANTLR_USE_NAMESPACE(std)string,int,CharScannerLiteralsLess> literals; // set by subclass
  77. RefToken _returnToken; // used to return tokens w/o using return val
  78. // Input chars
  79. LexerSharedInputState inputState;
  80. /** Used during filter mode to indicate that path is desired.
  81.  *  A subsequent scan error will report an error as usual if acceptPath=true;
  82.  */
  83. bool commitToPath;
  84. public:
  85. CharScanner();
  86. CharScanner(InputBuffer& cb);
  87. CharScanner(InputBuffer* cb);
  88. CharScanner(const LexerSharedInputState& state);
  89. virtual ~CharScanner();
  90. virtual void append(char c);
  91. virtual void append(const ANTLR_USE_NAMESPACE(std)string& s);
  92. virtual void commit();
  93. virtual void consume();
  94. /** Consume chars until one matches the given char */
  95. virtual void consumeUntil(int c);
  96. /** Consume chars until one matches the given set */
  97. virtual void consumeUntil(const BitSet& set);
  98. virtual bool getCaseSensitive() const;
  99. virtual bool getCaseSensitiveLiterals() const=0;
  100. virtual int getColumn() const;
  101. virtual bool getCommitToPath() const;
  102. virtual const ANTLR_USE_NAMESPACE(std)string& getFilename() const;
  103. virtual InputBuffer& getInputBuffer();
  104. virtual LexerSharedInputState getInputState();
  105. virtual int getLine() const;
  106. // return a copy of the current text buffer
  107. virtual const ANTLR_USE_NAMESPACE(std)string& getText() const;
  108. virtual RefToken getTokenObject() const;
  109. virtual int LA(int i);
  110. protected:
  111. virtual RefToken makeToken(int t);
  112. public:
  113. virtual int mark();
  114. virtual void match(int c);
  115. virtual void match(const BitSet& b);
  116. virtual void match(const ANTLR_USE_NAMESPACE(std)string& s);
  117. virtual void matchNot(int c);
  118. virtual void matchRange(int c1, int c2);
  119. virtual void newline();
  120. void panic();
  121. void panic(const ANTLR_USE_NAMESPACE(std)string& s);
  122. /** Report exception errors caught in nextToken() */
  123. virtual void reportError(const RecognitionException& e);
  124. /** Parser error-reporting function can be overridden in subclass */
  125. virtual void reportError(const ANTLR_USE_NAMESPACE(std)string& s);
  126. /** Parser warning-reporting function can be overridden in subclass */
  127. virtual void reportWarning(const ANTLR_USE_NAMESPACE(std)string& s);
  128. virtual void resetText();
  129. virtual void rewind(int pos);
  130. virtual void setCaseSensitive(bool t);
  131. virtual void setCommitToPath(bool commit);
  132. virtual void setFilename(const ANTLR_USE_NAMESPACE(std)string& f);
  133. virtual void setInputState(LexerSharedInputState state);
  134. virtual void setLine(int l);
  135. virtual void setText(const ANTLR_USE_NAMESPACE(std)string& s);
  136. virtual void setTokenObjectFactory(factory_type factory);
  137. // Test the token text against the literals table
  138. // Override this method to perform a different literals test
  139. virtual int testLiteralsTable(int ttype) const;
  140. // Test the text passed in against the literals table
  141. // Override this method to perform a different literals test
  142. // This is used primarily when you want to test a portion of
  143. // a token
  144. virtual int testLiteralsTable(const ANTLR_USE_NAMESPACE(std)string& text,int ttype) const;
  145. // Override this method to get more specific case handling
  146. virtual char toLower(char c) const;
  147. protected:
  148. class Tracer {
  149. private:
  150. CharScanner* parser;
  151. ANTLR_USE_NAMESPACE(std)string text;
  152. public:
  153. Tracer(CharScanner* p,const ANTLR_USE_NAMESPACE(std)string& t)
  154. : parser(p), text(t) { parser->traceIn(text); }
  155. ~Tracer()
  156. { parser->traceOut(text); }
  157. };
  158. public:
  159. virtual void traceIn(const ANTLR_USE_NAMESPACE(std)string& rname);
  160. virtual void traceOut(const ANTLR_USE_NAMESPACE(std)string& rname);
  161. /* This method is called by YourLexer::nextToken() when the lexer has
  162. *  hit EOF condition.  EOF is NOT a character.
  163. *  This method is not called if EOF is reached during
  164. *  syntactic predicate evaluation or during evaluation
  165. *  of normal lexical rules, which presumably would be
  166. *  an IOException.  This traps the "normal" EOF condition.
  167. *
  168. *  uponEOF() is called after the complete evaluation of
  169. *  the previous token and only if your parser asks
  170. *  for another token beyond that last non-EOF token.
  171. *
  172. *  You might want to throw token or char stream exceptions
  173. *  like: "Heh, premature eof" or a retry stream exception
  174. *  ("I found the end of this file, go back to referencing file").
  175. */
  176. virtual void uponEOF();
  177. };
  178. ANTLR_END_NAMESPACE
  179. #endif //INC_CharScanner_hpp__