source: proto/s2k/trunk/framework/src/toolchain/b2k/lang/B2KBuiltinsUtil.java @ 3820

Last change on this file since 3820 was 3820, checked in by ksherdy, 5 years ago

Harmonized names.

File size: 3.9 KB
Line 
1package toolchain.b2k.lang;
2
3import java.util.List;
4
5import b2k.ast.*;
6import toolchain.b2k.ast.Accessors;
7import toolchain.b2k.lang.B2KBuiltins;
8
9public class B2KBuiltinsUtil {
10       
11    public static boolean isAtEOF(ASTNode node) {
12        return isBuiltInCall(node, B2KBuiltins.FLOW_AT_EOF);
13    }
14    public static boolean isInFile(ASTNode node) {
15        return isBuiltInCall(node, B2KBuiltins.FLOW_IN_FILE);
16    }
17    public static boolean isAssertZero(ASTNode node) {
18        return isBuiltInCall(node, B2KBuiltins.FLOW_ASSERT_ZERO);
19    }
20    public static boolean isMask(ASTNode node) {
21        return isBuiltInCall(node, B2KBuiltins.FLOW_MASK);
22    } 
23    public static boolean isAdvance1(ASTNode node) {
24        return isBuiltInCall(node, B2KBuiltins.FLOW_ADVANCE);   
25    }   
26    public static boolean isAdvanceN(ASTNode node) {
27        return isBuiltInCall(node, B2KBuiltins.FLOW_ADVANCE_N);   
28    } 
29    public static boolean isAdvance(ASTNode node) {             // Advance(X) || Advance(X,n)
30        return isAdvance1(node) || isAdvanceN(node);   
31    }   
32     
33    public static boolean isCarryNone(ASTNode node) {
34        if(isBuiltInCall(node)) {
35            B2KBuiltins builtin = builtin(node);
36            return builtin.isCarryNone();
37        }
38        return false;
39    }
40   
41    public static boolean isCarry1(ASTNode node) {
42        if(isBuiltInCall(node)) {
43                B2KBuiltins builtin = builtin(node);
44                return builtin.isCarry1();
45        }
46        return false;
47    }
48    public static boolean isCarryN(ASTNode node) {
49        if(isBuiltInCall(node)) {
50                B2KBuiltins builtin = builtin(node);
51                return builtin.isCarryN();
52        }
53        return false;
54    }
55    public static boolean isCarry(ASTNode node) {
56        return isCarry1(node) || isCarryN(node);
57    }
58   
59        public static String carryNValue(ASTNode node) {
60                assert isCarryN(node);
61                List<ASTNode> arguments = Accessors.argsListNode((FuncCallNode)node).getChildren();
62                String value = Accessors.lexeme(arguments.get(1));
63                return value;
64        }
65   
66        ///////////////////////////////////////////////////////////////////////////////////
67        // builtin(node) - what builtin does this node invoke?
68        // guard invocations with isBuiltInCall
69        ///////////////////////////////////////////////////////////////////////////////////
70        public static B2KBuiltins builtin(ASTNode node) {
71                assert isBuiltInCall(node) : "Unknown builtin: " + Accessors.name(node);
72                CompoundIdentifierNode compound = (CompoundIdentifierNode)Accessors.nameNode((FuncCallNode)node);
73                String fullyQualifiedName = Accessors.name(compound);
74                B2KBuiltins builtin = B2KBuiltins.forName(fullyQualifiedName);
75                return builtin;
76        }
77       
78        ///////////////////////////////////////////////////////////////////////////////////
79        // isBuiltinCall(node, builtin) - is this node an invocation of the given builtin?
80        ///////////////////////////////////////////////////////////////////////////////////
81        public static boolean isBuiltInCall(ASTNode node, B2KBuiltins builtin) {
82                if(isBuiltInCall(node)) {
83                        return builtin(node) == builtin;
84                }
85                return false;
86        }
87
88        ///////////////////////////////////////////////////////////////////////////////////
89        // isBuiltinCall(node) - is this node an invocation of a builtin?
90        ///////////////////////////////////////////////////////////////////////////////////
91        public static boolean isBuiltInCall(ASTNode node) {
92            if(!(node instanceof FuncCallNode)) {
93                return false; 
94            }
95           
96                ASTNode nameNode = Accessors.nameNode((FuncCallNode)node);
97                return isBuiltinCompoundIdentifier(nameNode);
98        }
99        private static boolean isBuiltinCompoundIdentifier(ASTNode nameNode) {
100
101                if (nameNode instanceof CompoundIdentifierNode) {
102                        CompoundIdentifierNode compound = (CompoundIdentifierNode)nameNode;
103                        String builtinName = Accessors.name(compound);
104                        B2KBuiltins builtin = B2KBuiltins.forName(builtinName);
105
106                        if (builtin != B2KBuiltins.NULL_BUILTIN) {
107                                return true;
108                        }                       
109                }
110               
111                return false;
112        }
113}
Note: See TracBrowser for help on using the repository browser.