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

编译器/解释器

开发平台:

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/TreeParser.java#1 $
  7.  */
  8. import java.util.NoSuchElementException;
  9. import antlr.collections.AST;
  10. import antlr.collections.impl.BitSet;
  11. public class TreeParser {
  12. /** The AST Null object; the parsing cursor is set to this when
  13.  *  it is found to be null.  This way, we can test the
  14.  *  token type of a node without having to have tests for null
  15.  *  everywhere.
  16.  */
  17. public static ASTNULLType ASTNULL = new ASTNULLType();
  18. /** Where did this rule leave off parsing; avoids a return parameter */
  19. protected AST _retTree;
  20. /** guessing nesting level; guessing==0 implies not guessing */
  21. // protected int guessing = 0;
  22. /** Nesting level of registered handlers */
  23. // protected int exceptionLevel = 0;
  24. protected TreeParserSharedInputState inputState;
  25. /** Table of token type to token names */
  26. protected String[] tokenNames;
  27. /** AST return value for a rule is squirreled away here */
  28. protected AST returnAST;
  29. /** AST support code; parser and treeparser delegate to this object */
  30. protected ASTFactory astFactory = new ASTFactory();
  31. public TreeParser() {
  32. inputState = new TreeParserSharedInputState();
  33. }
  34. /** Get the AST return value squirreled away in the parser */
  35. public AST getAST() {
  36. return returnAST;
  37. }
  38. public ASTFactory getASTFactory() {
  39. return astFactory;
  40. }
  41. public String getTokenName(int num) {
  42. return tokenNames[num];
  43. }
  44. public String[] getTokenNames() {
  45. return tokenNames;
  46. }
  47. protected void match(AST t, int ttype) throws MismatchedTokenException {
  48. //System.out.println("match("+ttype+"); cursor is "+t);
  49. if ( t==null || t==ASTNULL || t.getType() != ttype ) {
  50. throw new MismatchedTokenException(getTokenNames(), t, ttype, false);
  51. }
  52. }
  53. /**Make sure current lookahead symbol matches the given set
  54.  * Throw an exception upon mismatch, which is catch by either the
  55.  * error handler or by the syntactic predicate.
  56.  */
  57. public void match(AST t, BitSet b) throws MismatchedTokenException {
  58. if ( t==null || t==ASTNULL || !b.member(t.getType()) ) {
  59. throw new MismatchedTokenException(getTokenNames(), t, b, false);
  60. }
  61. }
  62. protected void matchNot(AST t, int ttype) throws MismatchedTokenException {
  63. //System.out.println("match("+ttype+"); cursor is "+t);
  64. if ( t==null || t==ASTNULL || t.getType() == ttype ) {
  65. throw new MismatchedTokenException(getTokenNames(), t, ttype, true);
  66. }
  67. }
  68. public static void panic() {
  69. System.err.println("TreeWalker: panic");
  70. System.exit(1);
  71. }
  72. /** Parser error-reporting function can be overridden in subclass */
  73. public void reportError(RecognitionException ex) {
  74. System.err.println(ex.toString());
  75. }
  76. /** Parser error-reporting function can be overridden in subclass */
  77. public void reportError(String s) {
  78. System.err.println("error: " + s);
  79. }
  80. /** Parser warning-reporting function can be overridden in subclass */
  81. public void reportWarning(String s) {
  82. System.err.println("warning: " + s);
  83. }
  84. /** Specify an object with support code (shared by
  85.  *  Parser and TreeParser.  Normally, the programmer
  86.  *  does not play with this, using setASTNodeType instead.
  87.  */
  88. public void setASTFactory(ASTFactory f) {
  89. astFactory = f;
  90. }
  91.     
  92.     /** Specify the type of node to create during tree building */
  93.     public void setASTNodeType(String nodeType) {
  94. setASTNodeClass(nodeType);
  95.     }
  96.     /** Specify the type of node to create during tree building */
  97.     public void setASTNodeClass(String nodeType) {
  98. astFactory.setASTNodeType(nodeType);
  99.     }
  100. public void traceIn(String rname, AST t) {
  101. System.out.println("enter "+rname+
  102. "("+(t!=null?t.toString():"null")+")"+
  103. ((inputState.guessing>0)?" [guessing]":""));
  104. }
  105. public void traceOut(String rname, AST t) {
  106. System.out.println("exit "+rname+
  107. "("+(t!=null?t.toString():"null")+")"+
  108. ((inputState.guessing>0)?" [guessing]":""));
  109. }
  110. }