KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > fri > patterns > interpreter > parsergenerator > semantics > TreeBuilderSemantic


1 package fri.patterns.interpreter.parsergenerator.semantics;
2
3 import java.util.List JavaDoc;
4 import fri.patterns.interpreter.parsergenerator.Semantic;
5 import fri.patterns.interpreter.parsergenerator.syntax.Rule;
6
7 /**
8     A semantic that builds a syntax tree model from a parser run.
9     Every node of the result tree contains the rule and the parsed token list.
10     The result of the parser run can be retrieved by
11     <i>(TreeBuilderSemantic.Node) parser.getResult()</i>.
12
13     @author (c) 2002, Fritz Ritzberger
14 */

15
16 public class TreeBuilderSemantic implements Semantic
17 {
18     /**
19         Implements Semantic to store every node of the syntax tree with rule and values.
20     */

21     public Object JavaDoc doSemantic(Rule rule, List JavaDoc inputTokens, List JavaDoc ranges) {
22         return new Node(rule, inputTokens, ranges);
23     }
24
25
26     /**
27         Node class that representy a syntax tree node. All sub-nodes are contained as children.
28     */

29     public static class Node
30     {
31         private Rule rule;
32         private List JavaDoc inputTokens, ranges;
33         
34         public Node(Rule rule, List JavaDoc inputTokens, List JavaDoc ranges) {
35             this.rule = rule;
36             this.inputTokens = inputTokens;
37             this.ranges = ranges;
38         }
39         
40         /** Returns the rule of this syntax tree node. */
41         public Rule getRule() {
42             return rule;
43         }
44         
45         /** Returns the instance token list. */
46         public List JavaDoc getInputTokens() {
47             return inputTokens;
48         }
49         
50         /** Returns the instance token line range list. */
51         public List JavaDoc getRanges() {
52             return ranges;
53         }
54         
55         /** Returns "nonterminal@hashcode" as String representation of this node. */
56         public String JavaDoc toString() {
57             return getRule().getNonterminal()+"@"+hashCode();
58         }
59         
60         /**
61             Returns the human readable representation of this node and all sub-nodes.
62             @param indent spaces to indent on sub-nodes.
63         */

64         public String JavaDoc toString(int indent) {
65             StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
66             for (int i = 0; i < indent; i++)
67                 sb.append(" ");
68                 
69             sb.append(toString());
70             sb.append(" ::= ");
71             
72             if (getRule().rightSize() <= 0)
73                 sb.append("/*nothing*/");
74             else
75                 for (int i = 0; i < getRule().rightSize(); i++)
76                     sb.append(getRule().getRightSymbol(i)+" ");
77                 
78             sb.append("\t=>\t");
79             sb.append(getInputTokens());
80             sb.append("\n");
81             
82             for (int i = 0; i < getInputTokens().size(); i++) {
83                 Object JavaDoc o = getInputTokens().get(i);
84                 
85                 if (o instanceof Node) {
86                     sb.append(((Node)o).toString(indent + 1));
87                 }
88             }
89             
90             return sb.toString();
91         }
92     }
93
94 }
95
Popular Tags