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

编译器/解释器

开发平台:

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/Grammar.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. /**A Grammar holds a set of rules (which are stored
  14.  * in a symbol table).  Most of the time a grammar
  15.  * needs a code generator and an LLkAnalyzer too.
  16.  */
  17. public abstract class Grammar {
  18. protected Tool tool;
  19. protected CodeGenerator generator;
  20. protected LLkGrammarAnalyzer theLLkAnalyzer;
  21. protected Hashtable symbols;
  22. protected boolean buildAST = false;
  23. protected boolean analyzerDebug = false;
  24. protected boolean interactive = false;
  25. protected String superClass = null;
  26. /** The token manager associated with the grammar, if any.
  27. // The token manager is responsible for maintaining the set of valid tokens, and
  28. // is conceptually shared between the lexer and parser.  This may be either a
  29. // LexerGrammar or a ImportVocabTokenManager.
  30. */
  31. protected TokenManager tokenManager;
  32. /** The name of the export vocabulary...used to generate the output
  33.  *  token types interchange file.
  34.  */
  35. protected String exportVocab = null;
  36. /** The name of the import vocabulary.  "Initial conditions"
  37.  */
  38. protected String importVocab = null;
  39. // Mapping from String keys to Token option values
  40. protected Hashtable options;
  41. // Vector of RuleSymbol entries
  42. protected Vector rules;
  43. protected String preambleAction = null;
  44. protected String className = null;
  45. protected String fileName = null;
  46. protected String classMemberAction = null;
  47. protected boolean hasSyntacticPredicate = false;
  48. protected boolean hasUserErrorHandling = false;
  49. // max lookahead that can be attempted for this parser.
  50. protected int maxk=1;
  51. // options
  52. protected boolean traceRules = false;
  53. protected boolean debuggingOutput = false;
  54. protected boolean defaultErrorHandler = true;
  55. protected String comment = null; // javadoc comment
  56. public Grammar(String className_, Tool tool_, String superClass) {
  57. className = className_;
  58. tool = tool_;
  59. symbols = new Hashtable();
  60. options = new Hashtable();
  61. rules = new Vector(100);
  62. this.superClass = superClass;
  63. }
  64. /** Define a rule */
  65. public void define(RuleSymbol rs) {
  66. rules.appendElement(rs);
  67. // add the symbol to the rules hash table
  68. symbols.put(rs.getId(), rs);
  69. }
  70. /** Top-level call to generate the code for this grammar */
  71. public abstract void generate() throws IOException;
  72. protected String getClassName() { return className; }
  73. /* Does this grammar have a default error handler? */
  74. public boolean getDefaultErrorHandler() {
  75. return defaultErrorHandler;
  76. }
  77. public String getFilename() {
  78. return fileName;
  79. }
  80. /** Get an integer option.  Given the name of the option find its 
  81.  * associated integer value.  If the associated value is not an integer or
  82.  * is not in the table, then throw an exception of type NumberFormatException.
  83.  * @param key The name of the option
  84.  * @return The value associated with the key.
  85.  */
  86. public int getIntegerOption(String key) throws NumberFormatException {
  87. Token t = (Token)options.get(key);
  88. if (t == null || t.getType() != ANTLRTokenTypes.INT) {
  89. throw new NumberFormatException();
  90. }
  91. else {
  92. return Integer.parseInt(t.getText());
  93. }
  94. }
  95. /** Get an option.  Given the name of the option find its associated value.
  96.  * @param key The name of the option
  97.  * @return The value associated with the key, or null if the key has not been set.
  98.  */
  99. public Token getOption(String key) {
  100. return (Token)options.get(key);
  101. }
  102. // Get name of class from which generated parser/lexer inherits
  103. protected abstract String getSuperClass();
  104. public GrammarSymbol getSymbol(String s) {
  105. return (GrammarSymbol) symbols.get(s);
  106. }
  107. public Enumeration getSymbols() {
  108. return symbols.elements();
  109. }
  110. /** Check the existence of an option in the table
  111.  * @param key The name of the option
  112.  * @return true if the option is in the table
  113.  */
  114. public boolean hasOption(String key) {
  115. return options.containsKey(key);
  116. }
  117. /** Is a rule symbol defined? (not used for tokens) */
  118. public boolean isDefined(String s) {
  119. return symbols.containsKey(s);
  120. }
  121. /**Process command line arguments.  Implemented in subclasses */
  122. public abstract void processArguments(String[] args);
  123. public void setCodeGenerator(CodeGenerator gen) {
  124. generator = gen;
  125. }
  126. public void setFilename(String s) {
  127. fileName = s;
  128. }
  129. public void setGrammarAnalyzer(LLkGrammarAnalyzer a) {
  130. theLLkAnalyzer = a;
  131. }
  132. /** Set a generic option.
  133.  * This associates a generic option key with a Token value.
  134.  * No validation is performed by this method, although users of the value
  135.  * (code generation and/or analysis) may require certain formats.
  136.  * The value is stored as a token so that the location of an error
  137.  * can be reported.
  138.  * @param key The name of the option.
  139.  * @param value The value to associate with the key.
  140.  * @return true if the option was a valid generic grammar option, false o/w
  141.  */
  142. public boolean setOption(String key, Token value) {
  143. options.put(key, value);
  144. String s = value.getText();
  145. int i;
  146. if (key.equals("k")) {
  147. try {
  148. maxk = getIntegerOption("k");
  149. //System.out.println("setting lookahead to " + maxk);
  150. } catch (NumberFormatException e) {
  151. tool.error("option 'k' must be an integer (was "+value.getText()+")", getFilename(), value.getLine());
  152. }
  153. return true;
  154. }
  155. if (key.equals("codeGenMakeSwitchThreshold")) {
  156. try {
  157. i = getIntegerOption("codeGenMakeSwitchThreshold");
  158. } catch (NumberFormatException e) {
  159. tool.error("option 'codeGenMakeSwitchThreshold' must be an integer", getFilename(), value.getLine());
  160. }
  161. return true;
  162. }
  163. if (key.equals("codeGenBitsetTestThreshold")) {
  164. try {
  165. i = getIntegerOption("codeGenBitsetTestThreshold");
  166. } catch (NumberFormatException e) {
  167. tool.error("option 'codeGenBitsetTestThreshold' must be an integer", getFilename(), value.getLine());
  168. }
  169. return true;
  170. }
  171. if (key.equals("defaultErrorHandler")) {
  172. if (s.equals("true")) {
  173. defaultErrorHandler = true;
  174. } else if (s.equals("false")) {
  175. defaultErrorHandler = false;
  176. } else {
  177. tool.error("Value for defaultErrorHandler must be true or false", getFilename(), value.getLine());
  178. }
  179. return true;
  180. }
  181. if (key.equals("analyzerDebug")) {
  182. if (s.equals("true")) {
  183. analyzerDebug = true;
  184. }
  185. else if (s.equals("false")) {
  186. analyzerDebug = false;
  187. }
  188. else {
  189. tool.error("option 'analyzerDebug' must be true or false", getFilename(), value.getLine());
  190. }
  191. return true;
  192. }
  193. if (key.equals("codeGenDebug")) {
  194. if (s.equals("true")) {
  195. analyzerDebug = true;
  196. }
  197. else if (s.equals("false")) {
  198. analyzerDebug = false;
  199. }
  200. else {
  201. tool.error("option 'codeGenDebug' must be true or false", getFilename(), value.getLine());
  202. }
  203. return true;
  204. }
  205. if (key.equals("classHeaderSuffix")) {
  206. return true;
  207. }
  208. return false;
  209. }
  210. public void setTokenManager(TokenManager tokenManager_) {
  211. tokenManager = tokenManager_;
  212. }
  213. }