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

编译器/解释器

开发平台:

Others

  1. package antlr;
  2. /* ANTLR Translator Generator
  3.  * Project led by Terence Parr at http://www.jGuru.com
  4.  * Software rights: http://www.antlr.org/RIGHTS.html
  5.  *
  6.  * $Id: //depot/code/org.antlr/release/antlr-2.7.0/antlr/CharScanner.java#1 $
  7.  */
  8. import java.util.Hashtable;
  9. import antlr.collections.impl.BitSet;
  10. import java.io.IOException;
  11. public abstract class CharScanner implements TokenStream {
  12.     static final char NO_CHAR = 0;
  13.     public static final char EOF_CHAR = (char) - 1;
  14.     protected ANTLRStringBuffer text; // text of current token
  15.     protected boolean saveConsumedInput = true; // does consume() save characters?
  16.     protected Class tokenObjectClass; // what kind of tokens to create?
  17.     protected boolean caseSensitive = true;
  18.     protected boolean caseSensitiveLiterals = true;
  19.     protected Hashtable literals; // set by subclass
  20.     protected Token _returnToken = null; // used to return tokens w/o using return val.
  21.     // Hash string used so we don't new one every time to check literals table
  22.     protected ANTLRHashString hashString;
  23.     protected LexerSharedInputState inputState;
  24.     /** Used during filter mode to indicate that path is desired.
  25.      *  A subsequent scan error will report an error as usual if
  26.      *  acceptPath=true;
  27.      */
  28.     protected boolean commitToPath = false;
  29.     public CharScanner() {
  30. text = new ANTLRStringBuffer();
  31. hashString = new ANTLRHashString(this);
  32. setTokenObjectClass("antlr.CommonToken");
  33.     }
  34.     public CharScanner(InputBuffer cb) { // SAS: use generic buffer
  35. this();
  36. inputState = new LexerSharedInputState(cb);
  37.     }
  38.     public CharScanner(LexerSharedInputState sharedState) {
  39. this();
  40. inputState = sharedState;
  41.     }
  42.     public void append(char c) {
  43. if ( saveConsumedInput ) {
  44.     text.append(c);
  45. }
  46.     }
  47.     public void append(String s) {
  48. if ( saveConsumedInput ) {
  49.     text.append(s);
  50. }
  51.     }
  52.     public void commit() {
  53. inputState.input.commit();
  54.     }
  55.     public void consume() throws CharStreamException {
  56. if (inputState.guessing == 0) {
  57.     if (caseSensitive) {
  58. append(LA(1));
  59.     } else {
  60. // use input.LA(), not LA(), to get original case
  61. // CharScanner.LA() would toLower it.
  62. append(inputState.input.LA(1));
  63.     }
  64. }
  65. inputState.input.consume();
  66.     }
  67.     /** Consume chars until one matches the given char */
  68.     public void consumeUntil(int c) throws CharStreamException {
  69. while (LA(1) != EOF_CHAR && LA(1) != c)
  70.     {
  71. consume();
  72.     }
  73.     }
  74.     /** Consume chars until one matches the given set */
  75.     public void consumeUntil(BitSet set) throws CharStreamException {
  76. while (LA(1) != EOF_CHAR && !set.member(LA(1))) {
  77.     consume();
  78. }
  79.     }
  80.     public boolean getCaseSensitive() { return caseSensitive; }
  81.     public final boolean getCaseSensitiveLiterals() { return caseSensitiveLiterals; }
  82.     public int getColumn() {
  83. return inputState.column;
  84.     }
  85.     public boolean getCommitToPath() { return commitToPath; }
  86.     public String getFilename() {return inputState.filename;}
  87.     public InputBuffer getInputBuffer() {
  88. return inputState.input;
  89.     }
  90.     public LexerSharedInputState getInputState() {
  91. return inputState;
  92.     }
  93.     public void setInputState(LexerSharedInputState state) {
  94. inputState = state;
  95.     }
  96.     public int getLine() { return inputState.line; }
  97.     // return a copy of the current text buffer
  98.     public String getText() {
  99. return text.toString();
  100.     }
  101.     public Token getTokenObject() {
  102. return _returnToken;
  103.     }
  104.     public char LA(int i) throws CharStreamException {
  105. if (caseSensitive) {
  106.     return inputState.input.LA(i);
  107. } else {
  108.     return toLower(inputState.input.LA(i));
  109. }
  110.     }
  111.     protected Token makeToken(int t) {
  112. try {
  113.     Token tok = (Token)tokenObjectClass.newInstance();
  114.     tok.setType(t);
  115.     // tok.setText(getText()); done in generated lexer now
  116.     tok.setLine(inputState.line);
  117.     return tok;
  118. }
  119. catch (InstantiationException ie) {
  120.     panic("can't instantiate token: "+tokenObjectClass);
  121. }
  122. catch (IllegalAccessException iae) {
  123.     panic("Token class is not accessible"+tokenObjectClass);
  124. }
  125. return Token.badToken;
  126.     }
  127.     public int mark() {
  128. return inputState.input.mark();
  129.     }
  130.     public void match(char c) throws MismatchedCharException, CharStreamException {
  131. if ( LA(1) != c ) {
  132.     throw new MismatchedCharException(LA(1), c, false, this);
  133. }
  134. consume();
  135.     }
  136.     public void match(BitSet b) throws MismatchedCharException, CharStreamException {
  137. if ( !b.member(LA(1)) ) {
  138.     throw new MismatchedCharException(LA(1), b, false, this);
  139. } else {
  140.     consume();
  141. }
  142.     }
  143.     public void match(String s) throws MismatchedCharException, CharStreamException {
  144. int len = s.length();
  145. for (int i=0; i<len; i++) {
  146.     if ( LA(1) != s.charAt(i) ) {
  147. throw new MismatchedCharException(LA(1), s.charAt(i), false, this);
  148.     }
  149.     consume();
  150. }
  151.     }
  152.     public void matchNot(char c) throws MismatchedCharException, CharStreamException {
  153. if ( LA(1) == c ) {
  154.     throw new MismatchedCharException(LA(1), c, true, this);
  155. }
  156. consume();
  157.     }
  158.     public void matchRange(char c1, char c2) throws MismatchedCharException, CharStreamException {
  159. if ( LA(1) < c1 || LA(1) > c2 ) throw new MismatchedCharException(LA(1), c1, c2, false, this);
  160. consume();
  161.     }
  162.     public void newline() { inputState.line++; }
  163.     public void panic() {
  164. System.err.println("CharScanner: panic");
  165. System.exit(1);
  166.     }
  167.     public void panic(String s) {
  168. System.err.println("CharScanner; panic: "+s);
  169. System.exit(1);
  170.     }
  171.     /** Parser error-reporting function can be overridden in subclass */
  172.     public void reportError(RecognitionException ex) {
  173. System.err.println(ex);
  174.     }
  175.     /** Parser error-reporting function can be overridden in subclass */
  176.     public void reportError(String s) {
  177. if ( getFilename()==null ) {
  178.     System.err.println("error: " + s);
  179. }
  180. else {
  181.     System.err.println(getFilename()+": error: " + s);
  182. }
  183.     }
  184.     /** Parser warning-reporting function can be overridden in subclass */
  185.     public void reportWarning(String s) {
  186. if ( getFilename()==null ) {
  187.     System.err.println("warning: "+s);
  188. }
  189. else {
  190.     System.err.println(getFilename()+": warning: " + s);
  191. }
  192.     }
  193.     public void resetText() {
  194. text.setLength(0);
  195.     }
  196.     public void rewind(int pos) {
  197. inputState.input.rewind(pos);
  198.     }
  199.     public void setCaseSensitive(boolean t) { caseSensitive = t; }
  200.     public void setCommitToPath(boolean commit) { commitToPath = commit; }
  201.     public void setFilename(String f) {inputState.filename=f;}
  202.     public void setLine(int line) { inputState.line = line; }
  203.     public void setText(String s) {
  204. resetText();
  205. text.append(s);
  206.     }
  207.     public void setTokenObjectClass(String cl) {
  208. try {
  209.     tokenObjectClass = Class.forName(cl);
  210. }
  211. catch (ClassNotFoundException ce) {
  212.     panic("ClassNotFoundException: "+cl);
  213. }
  214.     }
  215.     // Test the token text against the literals table
  216.     // Override this method to perform a different literals test
  217.     public int testLiteralsTable(int ttype) {
  218. hashString.setBuffer(text.getBuffer(), text.length());
  219. Integer literalsIndex = (Integer)literals.get(hashString);
  220. if (literalsIndex != null) {
  221.     ttype = literalsIndex.intValue();
  222. }
  223. return ttype;
  224.     }
  225.     /** Test the text passed in against the literals table
  226.      * Override this method to perform a different literals test
  227.      * This is used primarily when you want to test a portion of
  228.      * a token.
  229.      */
  230.     public int testLiteralsTable(String text, int ttype) {
  231. ANTLRHashString s = new ANTLRHashString(text, this);
  232. Integer literalsIndex = (Integer)literals.get(s);
  233. if (literalsIndex != null) {
  234.     ttype = literalsIndex.intValue();
  235. }
  236. return ttype;
  237.     }
  238.     // Override this method to get more specific case handling
  239.     public char toLower(char c) {
  240. return Character.toLowerCase(c);
  241.     }
  242.     public void traceIn(String rname) throws CharStreamException {
  243. System.out.println("enter lexer "+rname+"; c==" + LA(1));
  244.     }
  245.     public void traceOut(String rname) throws CharStreamException {
  246. System.out.println("exit lexer "+rname+"; c==" + LA(1));
  247.     }
  248.     /** This method is called by YourLexer.nextToken() when the lexer has
  249.      *  hit EOF condition.  EOF is NOT a character.
  250.      *  This method is not called if EOF is reached during
  251.      *  syntactic predicate evaluation or during evaluation
  252.      *  of normal lexical rules, which presumably would be
  253.      *  an IOException.  This traps the "normal" EOF condition.
  254.      *
  255.      *  uponEOF() is called after the complete evaluation of
  256.      *  the previous token and only if your parser asks
  257.      *  for another token beyond that last non-EOF token.
  258.      *
  259.      *  You might want to throw token or char stream exceptions
  260.      *  like: "Heh, premature eof" or a retry stream exception
  261.      *  ("I found the end of this file, go back to referencing file").
  262.      */
  263.     public void uponEOF() throws TokenStreamException, CharStreamException {
  264.     }
  265. }