source: proto/s2k/trunk/framework/src/toolchain/s2k/lang/builtin/S2KBuiltinsUtil.java @ 4021

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

Restructure s2k package.

File size: 3.9 KB
Line 
1package toolchain.s2k.lang.builtin;
2
3import java.util.List;
4
5import s2k.ast.*;
6import toolchain.s2k.ast.Accessors;
7
8public class S2KBuiltinsUtil {
9       
10    public static boolean isAtEOF(ASTNode node) {
11        return isBuiltInCall(node, S2KBuiltins.FLOW_AT_EOF);
12    }
13    public static boolean isInFile(ASTNode node) {
14        return isBuiltInCall(node, S2KBuiltins.FLOW_IN_FILE);
15    }
16    public static boolean isAssertZero(ASTNode node) {
17        return isBuiltInCall(node, S2KBuiltins.FLOW_ASSERT_ZERO);
18    }
19    public static boolean isMask(ASTNode node) {
20        return isBuiltInCall(node, S2KBuiltins.FLOW_MASK);
21    } 
22    public static boolean isAdvance1(ASTNode node) {
23        return isBuiltInCall(node, S2KBuiltins.FLOW_ADVANCE);   
24    }   
25    public static boolean isAdvanceN(ASTNode node) {
26        return isBuiltInCall(node, S2KBuiltins.FLOW_ADVANCE_N);   
27    } 
28    public static boolean isAdvance(ASTNode node) {             // Advance(X) || Advance(X,n)
29        return isAdvance1(node) || isAdvanceN(node);   
30    }
31     
32    public static boolean isCarryNone(ASTNode node) {
33        if(isBuiltInCall(node)) {
34            S2KBuiltins builtin = builtin(node);
35            return builtin.isCarryNone();
36        }
37        return false;
38    }
39   
40    public static boolean isCarry1(ASTNode node) {
41        if(isBuiltInCall(node)) {
42                S2KBuiltins builtin = builtin(node);
43                return builtin.isCarry1();
44        }
45        return false;
46    }
47    public static boolean isCarryN(ASTNode node) {
48        if(isBuiltInCall(node)) {
49                S2KBuiltins builtin = builtin(node);
50                return builtin.isCarryN();
51        }
52        return false;
53    }
54    public static boolean isCarry(ASTNode node) {
55        return isCarry1(node) || isCarryN(node);
56    }
57   
58    // guard invocation with isCarryN
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 S2KBuiltins 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                S2KBuiltins builtin = S2KBuiltins.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, S2KBuiltins 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                        S2KBuiltins builtin = S2KBuiltins.forName(builtinName);
105
106                        if (builtin != S2KBuiltins.NULL_BUILTIN) {
107                                return true;
108                        }                       
109                }
110               
111                return false;
112        }
113}
Note: See TracBrowser for help on using the repository browser.