X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=src%2Fedu%2Fuci%2Feecs%2FspecCompiler%2FcodeGenerator%2FCodeGenerator.java;h=e78624cc67d3b6f1c2bb644999820caa4f367733;hb=20f4a8dc41dedff13ccdd90bcf420d0f1f78844c;hp=b53b482f582570f7608b388c6fda5e17bba769cc;hpb=18609d4482268ee61246f182a6a5cb1144e34573;p=cdsspec-compiler.git diff --git a/src/edu/uci/eecs/specCompiler/codeGenerator/CodeGenerator.java b/src/edu/uci/eecs/specCompiler/codeGenerator/CodeGenerator.java index b53b482..e78624c 100644 --- a/src/edu/uci/eecs/specCompiler/codeGenerator/CodeGenerator.java +++ b/src/edu/uci/eecs/specCompiler/codeGenerator/CodeGenerator.java @@ -7,16 +7,22 @@ import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; import edu.uci.eecs.specCompiler.specExtraction.CPDefineCheckConstruct; import edu.uci.eecs.specCompiler.specExtraction.CPDefineConstruct; +import edu.uci.eecs.specCompiler.specExtraction.ClassEndConstruct; +import edu.uci.eecs.specCompiler.specExtraction.ConditionalInterface; import edu.uci.eecs.specCompiler.specExtraction.Construct; +import edu.uci.eecs.specCompiler.specExtraction.EntryPointConstruct; import edu.uci.eecs.specCompiler.specExtraction.GlobalConstruct; +import edu.uci.eecs.specCompiler.specExtraction.IDExtractor; import edu.uci.eecs.specCompiler.specExtraction.InterfaceConstruct; +import edu.uci.eecs.specCompiler.specExtraction.InterfaceDefineConstruct; import edu.uci.eecs.specCompiler.specExtraction.PotentialCPDefineConstruct; -import edu.uci.eecs.specCompiler.specExtraction.SpecConstruct; +import edu.uci.eecs.specCompiler.specExtraction.SequentialDefineSubConstruct; +import edu.uci.eecs.specCompiler.specExtraction.SourceFileInfo; import edu.uci.eecs.specCompiler.specExtraction.SpecExtractor; -import edu.uci.eecs.specCompiler.specExtraction.SpecNotMatchException; /** *

@@ -33,25 +39,20 @@ public class CodeGenerator { private File[] srcFiles; - private HashMap> contents; + private HashMap srcFilesInfo; private HashMap> codeAdditions; public CodeGenerator(File[] srcFiles) { this.srcFiles = srcFiles; - this.contents = new HashMap>(); - readSrcFiles(); - this.codeAdditions = new HashMap>(); - _extractor = new SpecExtractor(); + _extractor.extract(srcFiles); - try { - _extractor.extract(srcFiles); - } catch (SpecNotMatchException e1) { - e1.printStackTrace(); - } + this.srcFilesInfo = _extractor.srcFilesInfo; - _semantics = new SemanticsChecker(_extractor.getConstructs()); + this.codeAdditions = new HashMap>(); + + _semantics = new SemanticsChecker(_extractor); try { _semantics.check(); System.out.println(_semantics); @@ -60,128 +61,107 @@ public class CodeGenerator { } } - private ArrayList readSrcFile(File f) throws IOException { - BufferedReader bf = new BufferedReader(new FileReader(f)); - ArrayList content = new ArrayList(); - String curLine; - while ((curLine = bf.readLine()) != null) { - content.add(curLine); - } - return content; - } - - private void readSrcFiles() { - for (int i = 0; i < srcFiles.length; i++) { - File f = srcFiles[i]; - if (!contents.containsKey(f)) { - try { - contents.put(f, readSrcFile(f)); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } - /** *

* Generate all the global code, including the "@DefineVar" in each * "@Interface" define *

*/ - private void globalConstruct2Code(SpecConstruct inst) { - int lineNum = inst.endLineNum + 1; - GlobalConstruct construct = (GlobalConstruct) inst.construct; - ArrayList newCode = new ArrayList(); - - // Generate the code in global construct first - String globalCode = construct.code; - int begin = 0, end = 0; - while (end < globalCode.length()) { - if (globalCode.charAt(end) == '\n') { - String line = globalCode.substring(begin, end); - newCode.add(line); - begin = end + 1; - } - end++; + private void globalConstruct2Code(GlobalConstruct construct) { + ArrayList newCode = CodeVariables.generateGlobalVarDeclaration( + _semantics, construct); + // Add it to the codeAdditions + if (!codeAdditions.containsKey(construct.file)) { + codeAdditions.put(construct.file, new ArrayList()); } - - // Generate code from the DefineVar and __COND_SAT__ - - - CodeAddition addition = new CodeAddition(lineNum, newCode); - if (!codeAdditions.containsKey(inst.file)) { - codeAdditions.put(inst.file, new ArrayList()); + CodeAddition addition = new CodeAddition(construct.beginLineNum, + newCode); + codeAdditions.get(construct.file).add(addition); + newCode = CodeVariables.generateStaticVarDefine(_semantics, construct); + if (newCode.size() > 0) { + addition = new CodeAddition(_semantics.getClassEndConstruct().beginLineNum, newCode); + codeAdditions.get(construct.file).add(addition); } - codeAdditions.get(inst.file).add(addition); } - private void interface2Code(SpecConstruct inst) { - int lineNum = inst.endLineNum + 1; - GlobalConstruct construct = (GlobalConstruct) inst.construct; - ArrayList newCode = new ArrayList(); - - + // Mainly rename and wrap the interface + private void interface2Code(InterfaceConstruct construct) + throws InterfaceWrongFormatException { + ArrayList newCode = CodeVariables.generateInterfaceWrapper( + _semantics, construct); + int lineNum = construct.beginLineNum; + // Add it to the codeAdditions CodeAddition addition = new CodeAddition(lineNum, newCode); - if (!codeAdditions.containsKey(inst.file)) { - codeAdditions.put(inst.file, new ArrayList()); + if (!codeAdditions.containsKey(construct.file)) { + codeAdditions.put(construct.file, new ArrayList()); } - codeAdditions.get(inst.file).add(addition); + codeAdditions.get(construct.file).add(addition); } - private void potentialCP2Code(SpecConstruct inst) { - int lineNum = inst.endLineNum + 1; - GlobalConstruct construct = (GlobalConstruct) inst.construct; - ArrayList newCode = new ArrayList(); - - + private void potentialCPDefine2Code(PotentialCPDefineConstruct construct) { + int lineNum = construct.beginLineNum; + ArrayList newCode = CodeVariables.generatePotentialCPDefine( + _semantics, construct); + CodeAddition addition = new CodeAddition(lineNum, newCode); - if (!codeAdditions.containsKey(inst.file)) { - codeAdditions.put(inst.file, new ArrayList()); + if (!codeAdditions.containsKey(construct.file)) { + codeAdditions.put(construct.file, new ArrayList()); } - codeAdditions.get(inst.file).add(addition); + codeAdditions.get(construct.file).add(addition); } - private void CPDefine2Code(SpecConstruct inst) { - int lineNum = inst.endLineNum + 1; - GlobalConstruct construct = (GlobalConstruct) inst.construct; - ArrayList newCode = new ArrayList(); - - + private void CPDefine2Code(CPDefineConstruct construct) { + int lineNum = construct.beginLineNum; + ArrayList newCode = CodeVariables.generateCPDefine(_semantics, construct); + CodeAddition addition = new CodeAddition(lineNum, newCode); - if (!codeAdditions.containsKey(inst.file)) { - codeAdditions.put(inst.file, new ArrayList()); + if (!codeAdditions.containsKey(construct.file)) { + codeAdditions.put(construct.file, new ArrayList()); } - codeAdditions.get(inst.file).add(addition); + codeAdditions.get(construct.file).add(addition); } - private void CPDefineCheck2Code(SpecConstruct inst) { - int lineNum = inst.endLineNum + 1; - GlobalConstruct construct = (GlobalConstruct) inst.construct; + private void CPDefineCheck2Code(CPDefineCheckConstruct construct) { + int lineNum = construct.beginLineNum; + ArrayList newCode = CodeVariables.generateCPDefineCheck(_semantics, construct); + + CodeAddition addition = new CodeAddition(lineNum, newCode); + if (!codeAdditions.containsKey(construct.file)) { + codeAdditions.put(construct.file, new ArrayList()); + } + codeAdditions.get(construct.file).add(addition); + } + + private void EntryPoint2Code(EntryPointConstruct construct) { + int lineNum = construct.beginLineNum; ArrayList newCode = new ArrayList(); - - + newCode.add(") + CodeAddition addition = new CodeAddition(lineNum, newCode); - if (!codeAdditions.containsKey(inst.file)) { - codeAdditions.put(inst.file, new ArrayList()); + if (!codeAdditions.containsKey(construct.file)) { + codeAdditions.put(construct.file, new ArrayList()); } - codeAdditions.get(inst.file).add(addition); + codeAdditions.get(construct.file).add(addition); } + public void generateCode() { for (int i = 0; i < _semantics.constructs.size(); i++) { - SpecConstruct inst = _semantics.constructs.get(i); - Construct construct = inst.construct; + Construct construct = _semantics.constructs.get(i); if (construct instanceof GlobalConstruct) { - globalConstruct2Code(inst); + globalConstruct2Code((GlobalConstruct) construct); } else if (construct instanceof InterfaceConstruct) { - interface2Code(inst); + try { + interface2Code((InterfaceConstruct) construct); + } catch (InterfaceWrongFormatException e) { + e.printStackTrace(); + } } else if (construct instanceof PotentialCPDefineConstruct) { - potentialCP2Code(inst); + // potentialCP2Code(inst); } else if (construct instanceof CPDefineConstruct) { - CPDefine2Code(inst); + // CPDefine2Code(inst); } else if (construct instanceof CPDefineCheckConstruct) { - CPDefineCheck2Code(inst); + // CPDefineCheck2Code(inst); } } } @@ -191,9 +171,9 @@ public class CodeGenerator { File[] srcFiles = { // new File(homeDir + "/benchmark/linuxrwlocks/linuxrwlocks.c"), new File(homeDir - + "/benchmark/cliffc-hashtable/simplified_cliffc_hashtable.h"), - // new File(homeDir + "/benchmark/ms-queue/my_queue.c") - }; + + "/benchmark/cliffc-hashtable/simplified_cliffc_hashtable.h"), }; + // new File(homeDir + "/benchmark/ms-queue/my_queue.c"), + // new File(homeDir + "/benchmark/ms-queue/my_queue.h") }; CodeGenerator gen = new CodeGenerator(srcFiles); gen.generateCode(); }