00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 package org.antlr.runtime.tree;
00029
00030 import org.antlr.runtime.*;
00031
00032 import java.util.regex.Pattern;
00033 import java.util.regex.Matcher;
00034
00039 public class TreeParser extends BaseRecognizer {
00040 public static final int DOWN = Token.DOWN;
00041 public static final int UP = Token.UP;
00042
00043
00044 static String dotdot = ".*[^.]\\.\\.[^.].*";
00045 static String doubleEtc = ".*\\.\\.\\.\\s+\\.\\.\\..*";
00046 static Pattern dotdotPattern = Pattern.compile(dotdot);
00047 static Pattern doubleEtcPattern = Pattern.compile(doubleEtc);
00048
00049 protected TreeNodeStream input;
00050
00051 public TreeParser(TreeNodeStream input) {
00052 super();
00053 setTreeNodeStream(input);
00054 }
00055
00056 public TreeParser(TreeNodeStream input, RecognizerSharedState state) {
00057 super(state);
00058 setTreeNodeStream(input);
00059 }
00060
00061 public void reset() {
00062 super.reset();
00063 if ( input!=null ) {
00064 input.seek(0);
00065 }
00066 }
00067
00069 public void setTreeNodeStream(TreeNodeStream input) {
00070 this.input = input;
00071 }
00072
00073 public TreeNodeStream getTreeNodeStream() {
00074 return input;
00075 }
00076
00077 public String getSourceName() {
00078 return input.getSourceName();
00079 }
00080
00081 protected Object getCurrentInputSymbol(IntStream input) {
00082 return ((TreeNodeStream)input).LT(1);
00083 }
00084
00085 protected Object getMissingSymbol(IntStream input,
00086 RecognitionException e,
00087 int expectedTokenType,
00088 BitSet follow)
00089 {
00090 String tokenText =
00091 "<missing "+getTokenNames()[expectedTokenType]+">";
00092 TreeAdaptor adaptor = ((TreeNodeStream)e.input).getTreeAdaptor();
00093 return adaptor.create(new CommonToken(expectedTokenType, tokenText));
00094 }
00095
00100 public void matchAny(IntStream ignore) {
00101 state.errorRecovery = false;
00102 state.failed = false;
00103 Object look = input.LT(1);
00104 if ( input.getTreeAdaptor().getChildCount(look)==0 ) {
00105 input.consume();
00106 return;
00107 }
00108
00109
00110 int level=0;
00111 int tokenType = input.getTreeAdaptor().getType(look);
00112 while ( tokenType!=Token.EOF && !(tokenType==UP && level==0) ) {
00113 input.consume();
00114 look = input.LT(1);
00115 tokenType = input.getTreeAdaptor().getType(look);
00116 if ( tokenType == DOWN ) {
00117 level++;
00118 }
00119 else if ( tokenType == UP ) {
00120 level--;
00121 }
00122 }
00123 input.consume();
00124 }
00125
00130 protected Object recoverFromMismatchedToken(IntStream input,
00131 int ttype,
00132 BitSet follow)
00133 throws RecognitionException
00134 {
00135 throw new MismatchedTreeNodeException(ttype, (TreeNodeStream)input);
00136 }
00137
00142 public String getErrorHeader(RecognitionException e) {
00143 return getGrammarFileName()+": node from "+
00144 (e.approximateLineInfo?"after ":"")+"line "+e.line+":"+e.charPositionInLine;
00145 }
00146
00150 public String getErrorMessage(RecognitionException e, String[] tokenNames) {
00151 if ( this instanceof TreeParser ) {
00152 TreeAdaptor adaptor = ((TreeNodeStream)e.input).getTreeAdaptor();
00153 e.token = adaptor.getToken(e.node);
00154 if ( e.token==null ) {
00155 e.token = new CommonToken(adaptor.getType(e.node),
00156 adaptor.getText(e.node));
00157 }
00158 }
00159 return super.getErrorMessage(e, tokenNames);
00160 }
00161
00162 public void traceIn(String ruleName, int ruleIndex) {
00163 super.traceIn(ruleName, ruleIndex, input.LT(1));
00164 }
00165
00166 public void traceOut(String ruleName, int ruleIndex) {
00167 super.traceOut(ruleName, ruleIndex, input.LT(1));
00168 }
00169 }