source: proto/pablo/src/compiler/semanticAnalyzer/visitors/ASTAssertCompareVisitor.java @ 2672

Last change on this file since 2672 was 2672, checked in by ksherdy, 6 years ago

Added parser/semantic analyzer packages.

File size: 4.6 KB
Line 
1
2package compiler.semanticAnalyzer.visitors;
3
4import java.util.List;
5
6import ast.ASTNode;
7
8
9/**
10 * Through the static method <code>compare</code>,
11 * this class asserts AST subtrees are equal.
12 */
13public class ASTAssertCompareVisitor {
14
15        public enum Level {
16                FULL, // Node class, Token, Attributes
17                NODE_CLASS_AND_TOKEN,
18                NODE_CLASS_ONLY,
19                TOKEN_ONLY;
20                public boolean compareToken() {
21                        return this != NODE_CLASS_ONLY;
22                }
23                public boolean compareNodeClass() {
24                        return this != TOKEN_ONLY;
25                }
26                public boolean compareFull() {
27                        return this == FULL;
28                }
29        }
30
31        static Level comparisonLevel = Level.FULL;
32       
33        static public void setComparisonLevel(Level level) {
34                ASTAssertCompareVisitor.comparisonLevel = level;
35        }
36       
37        static public Level getComparisonLevel() {
38                return ASTAssertCompareVisitor.comparisonLevel;
39        }
40       
41        static public void compare(ASTNode ASTTree1, ASTNode ASTTree2) {
42                ASTAssertCompareVisitor comparator = new ASTAssertCompareVisitor();
43                boolean result = comparator.compareSubtree(ASTTree1, ASTTree2);
44               
45                if (!result) {
46                        printFailure(ASTTree1, ASTTree2);
47                }
48        }
49
50        static private void printFailure(ASTNode node1, ASTNode node2) {
51               
52                System.err.println("AST Expected: ");
53                if (node1 != null) {
54                        System.err.println(node1.toString());
55                } else {
56                        System.err.println("null");
57                }
58               
59               
60                System.err.println("AST Actual: ");
61                if (node2 != null) {
62                        System.err.println(node2.toString());
63                } else {
64                        System.err.println("null");
65                }
66        }       
67       
68        private boolean compareSubtree(ASTNode node1, ASTNode node2) { // DFS compare
69               
70                boolean result = true;
71               
72                result &= compareNodes(node1, node2);
73               
74                List<ASTNode> children1 = node1.getChildren();
75                List<ASTNode> children2 = node2.getChildren();
76               
77                int min = Math.min(children1.size(), children2.size());
78               
79                int i;
80                for(i=0; i< min; i++) {
81                        ASTNode child1 = children1.get(i);
82                        ASTNode child2 = children2.get(i);
83                        result &= compareSubtree(child1, child2);
84                }
85               
86                if(children1.size() > children2.size() ) {
87                        result &= compareNodes(children1.get(i), null);
88                } 
89               
90                if(children1.size() < children2.size() ){
91                        result &= compareNodes(null, children2.get(i));
92                }
93                               
94                return result;
95        }
96       
97        private boolean compareNodes(ASTNode node1, ASTNode node2) {
98                boolean result = true;
99               
100                result &= compareNodeClass(node1, node2);
101                result &= compareToken(node1, node2);
102                result &= compareAttributes(node1, node2);
103               
104                return result;
105        }
106       
107        private boolean compareNodeClass(ASTNode node1, ASTNode node2) {
108                if(comparisonLevel.compareNodeClass()) {                       
109                        if ((node1 != null) && (node2 != null)) {
110                                String nodeClassSimpleName1 = node1.getClass().getSimpleName();
111                                String nodeClassSimpleName2 = node2.getClass().getSimpleName();
112                                if (!nodeClassSimpleName1.equals(nodeClassSimpleName2)) {
113                                        System.err.println("Node class mismatch at: " + getFailureLocation(node1, node2));
114                                        System.err.println("");
115                                        System.err.println("Expected: " + nodeClassSimpleName1);
116                                        System.err.println("Actual: " + nodeClassSimpleName2);
117                                        System.err.println("");
118                                        return false;   
119                                }
120                        }
121                }
122                return true;
123        }
124       
125        private boolean compareToken(ASTNode node1, ASTNode node2) {
126                if(comparisonLevel.compareToken()) {                   
127                        if ((node1 != null) && (node2 != null)) {
128                                String tokenSimpleName1 = node1.getToken().toString();
129                                String tokenSimpleName2 = node2.getToken().toString();
130                               
131                                if(!tokenSimpleName1.equals(tokenSimpleName2)) {
132                                        System.err.println("Token mismatch at: " + getFailureLocation(node1, node2));
133                                        System.err.println("");
134                                        System.err.println("Expected: " + tokenSimpleName1);
135                                        System.err.println("Actual: " + tokenSimpleName2);
136                                        System.err.println("");
137                                        return false;   
138                                }
139                               
140                                return tokenSimpleName1.equals(tokenSimpleName2);
141                               
142                        } else {       
143                                return false;
144                        }                       
145                }
146                return true;
147        }
148       
149        private boolean compareAttributes(ASTNode node1, ASTNode node2) {
150                if(comparisonLevel.compareFull()) {
151                        if ((node1 != null) && (node2 != null)) {
152                                String attributeString1 = node1.attributeString();
153                                String attributeString2 = node2.attributeString();
154                               
155                                if(!attributeString1.equals(attributeString2)) {
156                                        System.err.println("Attribute mismatch at: " + getFailureLocation(node1, node2));
157                                        System.err.println("");
158                                        System.err.println("Expected: " + attributeString1);
159                                        System.err.println("Actual: " + attributeString2);
160                                        System.err.println("");
161                                        return false;
162                                }
163                        }
164                }
165                return true;
166        }
167
168        private String getFailureLocation(ASTNode node1, ASTNode node2) {
169       
170                String location= null;
171               
172                if (node2 != null) {
173                        location = node2.getToken().getLocation().toString();
174                } else if (node1 != null) {
175                        location = node1.getToken().getLocation().toString();
176                } 
177               
178                return location;
179        }
180}
181
182
Note: See TracBrowser for help on using the repository browser.