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

编译器/解释器

开发平台:

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/LexerGrammar.java#1 $
  7.  */
  8. import java.util.Hashtable;
  9. import java.util.Enumeration;
  10. import java.io.IOException;
  11. import antlr.collections.impl.BitSet;
  12. import antlr.collections.impl.Vector;
  13. /** Lexer-specific grammar subclass */
  14. class LexerGrammar extends Grammar {
  15. // character set used by lexer
  16. protected BitSet charVocabulary;
  17. // true if the lexer generates literal testing code for nextToken
  18. protected boolean testLiterals = true;
  19. // true if the lexer generates case-sensitive LA(k) testing
  20. protected boolean caseSensitiveLiterals = true;
  21. /** true if the lexer generates case-sensitive literals testing */
  22. protected boolean caseSensitive = true;
  23. /** true if lexer is to ignore all unrecognized tokens */
  24. protected boolean filterMode = false;
  25. /** if filterMode is true, then filterRule can indicate an optional
  26.  *  rule to use as the scarf language.  If null, programmer used
  27.  *  plain "filter=true" not "filter=rule".
  28.  */
  29. protected String filterRule = null;
  30. LexerGrammar(String className_, Tool tool_, String superClass) {
  31. super(className_, tool_, superClass);
  32. charVocabulary = new BitSet();
  33. // Lexer usually has no default error handling
  34. defaultErrorHandler = false;
  35. }
  36. /** Top-level call to generate the code  */
  37. public void generate() throws IOException {
  38. generator.gen(this);
  39. }
  40. public String getSuperClass() {
  41. // If debugging, use debugger version of scanner
  42. if (debuggingOutput)
  43. return "debug.DebuggingCharScanner";
  44. return "CharScanner";
  45. }
  46. // Get the testLiterals option value
  47. public boolean getTestLiterals() {
  48. return testLiterals;
  49. }
  50. /**Process command line arguments.
  51.  * -trace have all rules call traceIn/traceOut
  52.  * -traceLexer have lexical rules call traceIn/traceOut
  53.  * -debug generate debugging output for parser debugger
  54.  */
  55. public void processArguments(String[] args) {
  56. for (int i=0; i<args.length; i++) {
  57. if ( args[i].equals("-trace") ) {
  58. traceRules = true;
  59. Tool.setArgOK(i);
  60. }
  61. else if ( args[i].equals("-traceLexer") ) {
  62. traceRules = true;
  63. Tool.setArgOK(i);
  64. }
  65. else if ( args[i].equals("-debug") ) {
  66. debuggingOutput = true;
  67. Tool.setArgOK(i);
  68. }
  69. }
  70. }
  71. /** Set the character vocabulary used by the lexer */
  72. public void setCharVocabulary(BitSet b) {
  73. charVocabulary = b;
  74. }
  75. /** Set lexer options */
  76. public boolean setOption(String key, Token value) {
  77. String s = value.getText();
  78. if (key.equals("buildAST")) {
  79. tool.warning("buildAST option is not valid for lexer", getFilename(), value.getLine());
  80. return true;
  81. }
  82. if (key.equals("testLiterals")) {
  83. if (s.equals("true")) {
  84. testLiterals = true;
  85. } else if (s.equals("false")) {
  86. testLiterals = false;
  87. } else {
  88. tool.warning("testLiterals option must be true or false", getFilename(), value.getLine());
  89. }
  90. return true;
  91. }
  92. if (key.equals("interactive")) {
  93. if (s.equals("true")) {
  94. interactive = true;
  95. } else if (s.equals("false")) {
  96. interactive = false;
  97. } else {
  98. tool.error("interactive option must be true or false", getFilename(), value.getLine());
  99. }
  100. return true;
  101. }
  102. if (key.equals("caseSensitive")) {
  103. if (s.equals("true")) {
  104. caseSensitive = true;
  105. } else if (s.equals("false")) {
  106. caseSensitive = false;
  107. } else {
  108. tool.warning("caseSensitive option must be true or false", getFilename(), value.getLine());
  109. }
  110. return true;
  111. }
  112. if (key.equals("caseSensitiveLiterals")) {
  113. if (s.equals("true")) {
  114. caseSensitiveLiterals= true;
  115. } else if (s.equals("false")) {
  116. caseSensitiveLiterals= false;
  117. } else {
  118. tool.warning("caseSensitiveLiterals option must be true or false", getFilename(), value.getLine());
  119. }
  120. return true;
  121. }
  122. if (key.equals("filter")) {
  123. if (s.equals("true")) {
  124. filterMode = true;
  125. } else if (s.equals("false")) {
  126. filterMode = false;
  127. } else if ( value.getType()==ANTLRTokenTypes.TOKEN_REF) {
  128. filterMode = true;
  129. filterRule = s;
  130. }
  131. else {
  132. tool.warning("filter option must be true, false, or a lexer rule name", getFilename(), value.getLine());
  133. }
  134. return true;
  135. }
  136. if (key.equals("longestPossible")) {
  137. tool.warning("longestPossible option has been deprecated; ignoring it...", getFilename(), value.getLine());
  138. return true;
  139. }
  140. if (super.setOption(key, value)) {
  141. return true;
  142. }
  143. tool.error("Invalid option: " + key, getFilename(), value.getLine());
  144. return false;
  145. }
  146. }