source: proto/pablo/src/compiler/backend/visitors/AugAssignXFormer.java @ 2710

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

General refactoring.

File size: 2.5 KB
Line 
1package compiler.backend.visitors;
2
3import java.util.HashMap;
4import java.util.Map;
5
6import ast.*;
7import compiler.ast.Accessors;
8import compiler.ast.Generators;
9
10
11import lexicalAnalyzer.Lextant;
12import tokens.*;
13
14public class AugAssignXFormer {
15
16        private static Map<Lextant, Lextant> AugAssignMap = new HashMap<Lextant, Lextant>();
17       
18        static {
19                AugAssignMap.put(Lextant.AND_ASSIGN, Lextant.AND);
20                AugAssignMap.put(Lextant.OR_ASSIGN, Lextant.OR);
21                AugAssignMap.put(Lextant.XOR_ASSIGN, Lextant.XOR);
22                //AugAssignMap.put(Lextant.NOT_ASSIGN, Lextant.NOT);
23        };
24       
25        private ASTNode ASTree;
26       
27        public AugAssignXFormer(ASTNode ASTree) {
28                this.ASTree = ASTree;
29        }
30       
31        public void XForm() {
32                VoidVisitor visitor = new AugAssignRemovalVisitor();
33                ASTree.accept(visitor);
34        }
35
36        private class AugAssignRemovalVisitor extends VoidVisitor.Default {
37               
38                public void visitLeave(AssignNode node) {
39                        XFormAugAssign(node, Accessors.lhs(node), Accessors.rhs(node)); 
40                }
41
42                public void visitLeave(LocalVarDeclNode node) {
43                        if(Accessors.hasInitializationAssign(node)) {
44                                XFormAugAssign(node, Accessors.lhs(node), Accessors.rhs(node));
45                        }
46                }
47                               
48                private void XFormAugAssign(ASTNode node, ASTNode lhs, ASTNode rhs) {
49                        if(isAugAssignLextant(node.getToken())) {
50                               
51                                // TODO: bug here, simply use node.child(0) as lhs may fail if side effect exists.
52                                Lextant binaryOperatorLextant = getMappedLextant(node.getToken());
53                                String lexeme = binaryOperatorLextant.getPrimaryLexeme();
54                               
55                                LextantToken binaryOperatorToken = LextantToken.make(node.getToken().getLocation(), lexeme, binaryOperatorLextant);
56                               
57                                BinaryOperatorNode binaryOperatorNode = Generators.makeBinaryOperatorNode(lhs, rhs, binaryOperatorToken);
58                               
59                                LextantToken assign = LextantToken.make(node.getToken().getLocation(), 
60                                                                                                                Lextant.ASSIGN.getPrimaryLexeme(), 
61                                                                                                                Lextant.ASSIGN);
62                                node.setToken(assign);
63                                                               
64                                //Accessors.rhs(node).updateSelf(binaryOperatorNode);
65                                node.replaceChild(rhs, binaryOperatorNode);
66                        }
67                }
68               
69                private boolean isAugAssignLextant(Token token) {
70                        for (Lextant key : AugAssignMap.keySet()) {
71                                if (token.isLextant(key)) {
72                                        return true;
73                                }
74                        }
75                        return false;
76                }
77
78                private Lextant getMappedLextant(Token token) {
79                        for (Lextant key : AugAssignMap.keySet()) {
80                                if (token.isLextant(key)) {
81                                        return AugAssignMap.get(key);
82                                }
83                        }
84                        throw new RuntimeException();
85                }               
86               
87        }
88}
Note: See TracBrowser for help on using the repository browser.