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

编译器/解释器

开发平台:

Others

  1. package antlr.preprocessor;
  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/preprocessor/Hierarchy.java#1 $
  7.  */
  8. import antlr.collections.impl.IndexedVector;
  9. import java.util.Hashtable;
  10. import java.util.Enumeration;
  11. import java.io.*;
  12. import antlr.*;
  13. import antlr.preprocessor.Grammar;
  14. public class Hierarchy {
  15. protected static Grammar LexerRoot = new Grammar("Lexer", null, null);
  16. protected static Grammar ParserRoot = new Grammar("Parser", null, null);
  17. protected static Grammar TreeParserRoot = new Grammar("TreeParser", null, null);
  18. protected Hashtable symbols; // table of grammars
  19. protected Hashtable files; // table of grammar files read in
  20. public Hierarchy() {
  21. symbols = new Hashtable(10);
  22. files = new Hashtable(10);
  23. LexerRoot.setPredefined(true);
  24. ParserRoot.setPredefined(true);
  25. TreeParserRoot.setPredefined(true);
  26. symbols.put(LexerRoot.getName(), LexerRoot);
  27. symbols.put(ParserRoot.getName(), ParserRoot);
  28. symbols.put(TreeParserRoot.getName(), TreeParserRoot);
  29. }
  30. public void addGrammar(Grammar gr) {
  31. gr.setHierarchy(this);
  32. // add grammar to hierarchy
  33. symbols.put(gr.getName(), gr);
  34. // add grammar to file.
  35. GrammarFile f = getFile(gr.getFileName());
  36. f.addGrammar(gr);
  37. }
  38. public void addGrammarFile(GrammarFile gf) {
  39. files.put(gf.getName(), gf);
  40. }
  41. public void expandGrammarsInFile(String fileName) {
  42. GrammarFile f = getFile(fileName);
  43. for (Enumeration e=f.getGrammars().elements(); e.hasMoreElements(); ) {
  44. Grammar g = (Grammar)e.nextElement();
  45. g.expandInPlace();
  46. }
  47. }
  48. public Grammar findRoot(Grammar g) {
  49. if ( g.getSuperGrammarName()==null ) { // at root
  50. return g;
  51. }
  52. // return root of super.
  53. Grammar sg = g.getSuperGrammar();
  54. if ( sg==null ) return g; // return this grammar if super missing
  55. return findRoot(sg);
  56. }
  57. public GrammarFile getFile(String fileName) {
  58. return (GrammarFile)files.get(fileName);
  59. }
  60. public Grammar getGrammar(String gr) {
  61. return (Grammar)symbols.get(gr);
  62. }
  63. public static String optionsToString(IndexedVector options) {
  64. String s = "options {"+System.getProperty("line.separator");
  65. for (Enumeration e = options.elements() ; e.hasMoreElements() ;) {
  66. s += (Option)e.nextElement()+System.getProperty("line.separator");
  67. }
  68. s += "}"+
  69. System.getProperty("line.separator")+
  70. System.getProperty("line.separator");
  71. return s;
  72. }
  73. public void readGrammarFile(String file) throws FileNotFoundException {
  74. FileReader grStream = new FileReader(file);
  75. addGrammarFile(new GrammarFile(file));
  76. // Create the simplified grammar lexer/parser
  77. PreprocessorLexer ppLexer = new PreprocessorLexer(grStream);
  78. ppLexer.setFilename(file);
  79. Preprocessor pp = new Preprocessor(ppLexer);
  80. pp.setFilename(file);
  81. // populate the hierarchy with class(es) read in
  82. try {
  83. pp.grammarFile(this, file);
  84. }
  85. catch (TokenStreamException io) {
  86. antlr.Tool.toolError("Token stream error reading grammar(s):"+io);
  87. }
  88. catch (ANTLRException se) {
  89. antlr.Tool.toolError("error reading grammar(s):"+se);
  90. }
  91. }
  92. /** Return true if hierarchy is complete, false if not */
  93. public boolean verifyThatHierarchyIsComplete() {
  94. boolean complete = true;
  95. // Make a pass to ensure all grammars are defined
  96. for (Enumeration e = symbols.elements() ; e.hasMoreElements() ;) {
  97. Grammar c = (Grammar)e.nextElement();
  98. if ( c.getSuperGrammarName()==null ) {
  99. continue; // at root: ignore predefined roots
  100. }
  101. Grammar superG = c.getSuperGrammar();
  102. if ( superG == null ) {
  103. antlr.Tool.toolError("grammar "+c.getSuperGrammarName()+" not defined");
  104. complete = false;
  105. symbols.remove(c.getName()); // super not defined, kill sub
  106. }
  107. }
  108. if ( !complete ) return false;
  109. // Make another pass to set the 'type' field of each grammar
  110. // This makes it easy later to ask a grammar what its type
  111. // is w/o having to search hierarchy.
  112. for (Enumeration e = symbols.elements() ; e.hasMoreElements() ;) {
  113. Grammar c = (Grammar)e.nextElement();
  114. if ( c.getSuperGrammarName()==null ) {
  115. continue; // ignore predefined roots
  116. }
  117. c.setType(findRoot(c).getName());
  118. }
  119. return true;
  120. }
  121. }