KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > fri > patterns > interpreter > parsergenerator > lexer > ResultTree


1 package fri.patterns.interpreter.parsergenerator.lexer;
2
3 import java.util.*;
4 import fri.patterns.interpreter.parsergenerator.Token;
5 import fri.patterns.interpreter.parsergenerator.syntax.Rule;
6
7 /**
8     Lexer result tree element, holding texts, its line/column range, and result children.
9     
10     @author Fritz Ritzberger, 2003
11 */

12
13 public class ResultTree
14 {
15     private Rule rule;
16     private List sequenceList;
17     private Token.Range range;
18     private StringBuffer JavaDoc buffer;
19     private String JavaDoc stringResult;
20     
21     ResultTree(Rule rule) {
22         this.rule = rule;
23     }
24     
25     /** Returns the character- or byte-range within input where the token was found. */
26     public Token.Range getRange() {
27         return range;
28     }
29     
30     void setRange(Token.Range range) {
31         this.range = range;
32     }
33     
34     /** Returns true if this ResultTree or any of its children has text. */
35     public boolean hasText() {
36         for (int i = 0; sequenceList != null && i < sequenceList.size(); i++) {
37             Object JavaDoc o = sequenceList.get(i);
38             if (o instanceof ResultTree == false)
39                 return true; // StringBuffer was allocated with minimum one char
40
else
41             if (((ResultTree)o).hasText())
42                 return true;
43         }
44         return false;
45     }
46     
47     /** Returns the String text of this ResultTree, including any text of its children. */
48     public String JavaDoc toString() {
49         if (stringResult == null) {
50             StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
51             for (int i = 0; sequenceList != null && i < sequenceList.size(); i++) {
52                 Object JavaDoc o = sequenceList.get(i);
53                 if (o instanceof ResultTree)
54                     sb.append(((ResultTree)o).toString());
55                 else
56                     sb.append(o.toString());
57                     // since JDK 1.4: sb.append((StringBuffer) o); // is faster than o.toString()
58
}
59             stringResult = sb.toString();
60         }
61         return stringResult;
62     }
63     
64     /** Returns the rule this ResultTree was built from. */
65     public Rule getRule() {
66         return rule;
67     }
68
69     /** Returns the child at index i of this element, which could be StringBuffer or ResultTree. */
70     public Object JavaDoc getChild(int i) {
71         Object JavaDoc o = sequenceList.get(i);
72         return o instanceof StringBuffer JavaDoc ? o.toString() : o; // avoid StringBuffer.append calls
73
}
74
75     /** Returns the count of children of this element. */
76     public int getChildCount() {
77         return sequenceList != null ? sequenceList.size() : 0;
78     }
79
80     ResultTree append(char c) {
81         ensureStringBuffer(null).append(c);
82         return this;
83     }
84
85     ResultTree append(String JavaDoc s) {
86         ensureStringBuffer(s);
87         return this;
88     }
89
90     ResultTree addChild(ResultTree r) {
91         if (r.hasText()) {
92             ensureSequenceList().add(r);
93             buffer = null; // force new list element
94
}
95         return this;
96     }
97
98     private List ensureSequenceList() {
99         if (sequenceList == null)
100             sequenceList = new ArrayList(rule != null ? rule.rightSize() : 1);
101         return sequenceList;
102     }
103
104     private StringBuffer JavaDoc ensureStringBuffer(String JavaDoc toStore) {
105         if (buffer == null) {
106             if (toStore == null)
107                 buffer = new StringBuffer JavaDoc(8);
108             else
109                 buffer = new StringBuffer JavaDoc(toStore);
110             ensureSequenceList().add(buffer);
111         }
112         else
113         if (toStore != null) {
114             buffer.append(toStore);
115         }
116         return buffer;
117     }
118
119 }
120
Popular Tags