source: proto/pablo/src/compiler/PabloCompiler.java @ 2660

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

Shortened variable names for sanity.

File size: 5.1 KB
Line 
1package  compiler;
2
3import java.io.FileNotFoundException;
4import java.util.ArrayList;
5import java.util.List;
6import java.util.Map;
7
8import  tokens.Tokens;
9import  ast.ASTNode;
10import  lexicalAnalyzer.LexicalController;
11import parser.Parser;
12import  logging.ScatterLogger;
13import compiler.lang.carry.CarrySet2CPP;
14import compiler.lang.carry.CarrySet2Lang;
15import compiler.lang.idisa.*;
16import compiler.lang.pablo.Builtins2CPP;
17import compiler.lang.pablo.Builtins2Lang;
18import compiler.visitors.*;
19//import semanticAnalyzer.SampleSemanticAnalyzer;
20//import codeGeneration.CodeGenerator;
21
22import org.apache.commons.cli.CommandLine;
23import org.apache.commons.cli.CommandLineParser;
24import org.apache.commons.cli.HelpFormatter;
25import org.apache.commons.cli.Option;
26import org.apache.commons.cli.Options;
27import org.apache.commons.cli.PosixParser;
28 
29@SuppressWarnings("unused")
30public class PabloCompiler extends PabloApplication {
31       
32        public static final String applicationName = "PabloCompiler";   
33        public static final int EXIT_CODE_FOR_ERROR = 1;
34       
35        // Options
36        private static String inputFilename;
37        private static String templateFilename;
38        private static String outputFilename;
39        private static String errorRoutine;
40       
41        private static boolean addDumpStmts = false;
42        private static boolean addAssertBitBlockAlignStmts = false;
43               
44        public static void main(String[] args) throws FileNotFoundException {
45       
46                Options options = OptionsConfig.createOptions();
47               
48                try {
49                        CommandLineParser parser = new PosixParser();
50                        CommandLine cmd = parser.parse(options, args);
51                        inputFilename = cmd.getOptionValue("i"); 
52                        templateFilename = cmd.getOptionValue("t", "code.c");
53                    outputFilename = cmd.getOptionValue("o", "template.c");         
54                    errorRoutine = cmd.getOptionValue("e", "assert_0_error");
55                   
56                    if(cmd.hasOption("d")) { addDumpStmts = true; }
57                    if(cmd.hasOption("a")) { addAssertBitBlockAlignStmts = true; }
58                       
59                } catch (Exception e) {
60                        //e.printStackTrace();
61                        OptionsConfig.exitWithUsageMessage(options);
62                }
63               
64                Tokens.setPrintLevel(Tokens.Level.FULL);
65                compile(inputFilename);
66        }
67       
68        /**
69         * @param filename
70         * @throws FileNotFoundException
71         */
72        public static void compile(String filename) throws FileNotFoundException {
73                               
74                LexicalController lexController = LexicalController.make(filename);
75                ASTNode syntaxTree = Parser.parse(lexController);
76                               
77                StreamFuncVisitor streamFuncVisitor = new StreamFuncVisitor(syntaxTree);
78                Map<String, ASTNode> streamFuncMap = streamFuncVisitor.makeStreamFuncMap();
79               
80                Builtins2Lang builtins2CPP = new Builtins2CPP();
81                CarrySet2Lang carrySet2CPP = new CarrySet2CPP();
82               
83                for (Map.Entry<String, ASTNode> entry : streamFuncMap.entrySet()) {
84                       
85                    ASTNode value = entry.getValue();
86                       
87                    AdvanceCombinerXFormer advanceCombiner = new AdvanceCombinerXFormer(value);
88                    advanceCombiner.XForm();
89                   
90                    /*
91                    CarryCounter carryCounter = new CarryCounter(entry.getValue());
92                    AdvanceNCounter advNCounter = new AdvanceNCounter(entry.getValue());                       
93                    System.out.println();
94                        System.out.println(entry.getKey());
95                        System.out.println("Carry Count = " + carryCounter.count());
96                        System.out.println("Adv n Count = " + advNCounter.count());
97                        System.out.println();
98                        */
99                       
100                    AugAssignXFormer AugAssign = new AugAssignXFormer(value);
101                        AugAssign.XForm();
102                       
103                        CarryIntroXFormer carryQIntro = new CarryIntroXFormer(value, carrySet2CPP);
104                        carryQIntro.XForm(true, false);
105                       
106                        Pablo2CarryXFormer pablo2CarryQ = new Pablo2CarryXFormer(value, builtins2CPP, carrySet2CPP);
107                        pablo2CarryQ.XForm(true, false);                   
108                   
109                        AssertZeroXFormer assertZeroXFormer = new AssertZeroXFormer(value, builtins2CPP);
110                        assertZeroXFormer.XForm();
111                       
112                        Bitwise2IDISAXFormer bitwiseToIDISA = new Bitwise2IDISAXFormer(value); 
113                        bitwiseToIDISA.XForm();
114
115                        if(PabloCompiler.addDumpStmts) {
116                                DumpAssignStmtsXFormer dumpAssignStmtsXFormer = new DumpAssignStmtsXFormer(value, builtins2CPP); 
117                                dumpAssignStmtsXFormer.XForm();
118                        }
119                       
120                        if(PabloCompiler.addAssertBitBlockAlignStmts) {
121                                AssertBitBlockAlignStmtsXFormer assertBitBlockAlignStmtsXFormer = new AssertBitBlockAlignStmtsXFormer(value, builtins2CPP, carrySet2CPP); 
122                                assertBitBlockAlignStmtsXFormer.XForm();
123                        }                       
124                       
125                        Unparser cPPUnparser = new CPPUnparser(value);
126                        String code = cPPUnparser.getCode();
127                        System.out.print(code);
128                       
129                }
130
131//              ASTNode decoratedTree = SemanticAnalyzer.analyze(syntaxTree);
132//              generateCodeIfNoErrors(filename, decoratedTree);
133        }
134
135        private static void generateCodeIfNoErrors(String filename, ASTNode decoratedTree)
136                        throws FileNotFoundException {
137                if(thereAreErrors()) {
138                        stopProcessing();
139                } 
140                else {
141                        generateAndPrintCode(decoratedTree);
142                }
143        }
144
145        private static void stopProcessing() {
146                informUserNoCodeGenerated();
147        }
148       
149        private static void informUserNoCodeGenerated() {
150                System.err.println("Pablo program errors. No code generated.");
151        }
152       
153        private static void generateAndPrintCode(ASTNode decoratedTree) 
154                        throws FileNotFoundException {
155//              CodeGenerator generator = new CodeGenerator(outputDirectory, decoratedTree);
156//              generator.generate();
157        }
158       
159        private static boolean thereAreErrors() {
160                return ScatterLogger.hasErrors();
161        }
162               
163}
164
Note: See TracBrowser for help on using the repository browser.