X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=src%2Fedu%2Fuci%2Feecs%2FspecCompiler%2FcodeGenerator%2FSemanticsChecker.java;h=60732306a12f2768f44109f57d4e9d1b49b1470d;hb=ab51330e8c0c515221db828346729de2176e9e01;hp=495801b97d263965c5fa5aed5828ef2dc942f63f;hpb=1c89b92ed0363b0c283fc49cdd4f53451eb47d3d;p=cdsspec-compiler.git diff --git a/src/edu/uci/eecs/specCompiler/codeGenerator/SemanticsChecker.java b/src/edu/uci/eecs/specCompiler/codeGenerator/SemanticsChecker.java index 495801b..6073230 100644 --- a/src/edu/uci/eecs/specCompiler/codeGenerator/SemanticsChecker.java +++ b/src/edu/uci/eecs/specCompiler/codeGenerator/SemanticsChecker.java @@ -1,63 +1,120 @@ package edu.uci.eecs.specCompiler.codeGenerator; +import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import edu.uci.eecs.specCompiler.grammerParser.ParseException; +import edu.uci.eecs.specCompiler.grammerParser.SpecParser; import edu.uci.eecs.specCompiler.specExtraction.CPDefineCheckConstruct; import edu.uci.eecs.specCompiler.specExtraction.CPDefineConstruct; +import edu.uci.eecs.specCompiler.specExtraction.ClassBeginConstruct; +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.InterfaceConstruct; import edu.uci.eecs.specCompiler.specExtraction.InterfaceDefineConstruct; +import edu.uci.eecs.specCompiler.specExtraction.ParserUtils; import edu.uci.eecs.specCompiler.specExtraction.PotentialCPDefineConstruct; +import edu.uci.eecs.specCompiler.specExtraction.SourceFileInfo; +import edu.uci.eecs.specCompiler.specExtraction.SpecExtractor; public class SemanticsChecker { + public final HashMap srcFilesInfo; public final ArrayList constructs; public final HashMap CPLabel2Construct; - public final HashMap potentialCPLabel2Construct; - public final HashMap interfaceName2Construct; - public final HashMap interfaceName2DefineConstruct; + public final HashMap potentialCPLabel2Construct; + public final HashMap interfaceName2Construct; + public final HashMap interfaceName2DefineConstruct; public final HashMap> CPLabel2InterfaceConstruct; - + public final HashMap interface2Num; public final HashMap hbLabel2Num; public final HashMap commitPointLabel2Num; private HashMap options; private HashMap> hbConditions; - private Construct entryPointConstruct; + private ArrayList entryPointConstructs; + private ClassBeginConstruct classBeginConstruct; + private ClassEndConstruct classEndConstruct; + private String templateStr; + private String templateFullStr; + private String className; + private int _interfaceNum; private int _hbLabelNum; - private int _commitPointNum; + private int _commitPointNum; - public SemanticsChecker(ArrayList constructs) { - this.constructs = constructs; + public SemanticsChecker(SpecExtractor extractor) { + this.srcFilesInfo = extractor.srcFilesInfo; + this.constructs = extractor.getConstructs(); this.CPLabel2Construct = new HashMap(); - this.potentialCPLabel2Construct = new HashMap(); - this.interfaceName2Construct = new HashMap(); - this.interfaceName2DefineConstruct = new HashMap(); + this.potentialCPLabel2Construct = new HashMap(); + this.interfaceName2Construct = new HashMap(); + this.interfaceName2DefineConstruct = new HashMap(); this.CPLabel2InterfaceConstruct = new HashMap>(); - this.entryPointConstruct = null; - + this.entryPointConstructs = new ArrayList(); + this.classBeginConstruct = null; + this.classEndConstruct = null; + this.interface2Num = new HashMap(); this.hbLabel2Num = new HashMap(); // Immediately init the true HB-condition to be 0 hbLabel2Num.put("", 0); - + this.commitPointLabel2Num = new HashMap(); - + _interfaceNum = 0; _hbLabelNum = 0; _commitPointNum = 0; + + templateStr = null; + templateFullStr = null; + className = null; + } + + public ClassBeginConstruct getClassBeginConstruct() { + return this.classBeginConstruct; + } + + public ClassEndConstruct getClassEndConstruct() { + return this.classEndConstruct; + } + + public String getTemplateFullStr() { + return this.templateFullStr; + } + + public String getTemplateStr() { + return this.templateStr; + } + + public String getClassName() { + return this.className; } public HashMap> getHBConditions() { return this.hbConditions; } + + /** + * Check if the conditional interface is in the HB checking list + * @param condInterface + * @return + */ + public boolean containsConditionalInterface(ConditionalInterface condInterface) { + if (hbConditions.containsKey(condInterface)) + return true; + for (ConditionalInterface key : hbConditions.keySet()) { + if (hbConditions.get(key).contains(condInterface)) + return true; + } + return false; + } public String getOption(String key) { return options.get(key); @@ -78,16 +135,10 @@ public class SemanticsChecker { + interfaceName + " doesn't contain HB_codition: " + label + "!"); } - - // No HB condition label can duplicate! - if (hbLabel2Num.containsKey(label)) { - throw new SemanticsCheckerException("Happens-before label: " - + label + " duplicates!"); - } - + // Number the HB-condition label hbLabel2Num.put(label, _hbLabelNum++); - } + } } private void checkLabelDuplication(Construct construct, String label) @@ -103,17 +154,25 @@ public class SemanticsChecker { } private void postCheck() throws SemanticsCheckerException { - // This is a C program, must provide the entry point - if (getOption("LANG").equals("C") && entryPointConstruct == null) { + // C++ data structure with Class must provide the beginning and ending + // of its declaration + if (getOption("Class") != null) { + if (classBeginConstruct == null || classEndConstruct == null) { + throw new SemanticsCheckerException( + "Class must provide the boundary explicitly!"); + } + } + // It must provide the entry point + if (entryPointConstructs.size() == 0) { throw new SemanticsCheckerException( - "C program must provide the entry point!"); + "The program must have at least one entry point!"); } // Check if interface define construct labels are correct for (String name : interfaceName2DefineConstruct.keySet()) { if (!interfaceName2Construct.containsKey(name)) { - throw new SemanticsCheckerException( - "Label \"" + name + "\" does not have interface declaration!"); + throw new SemanticsCheckerException("Label \"" + name + + "\" does not have interface declaration!"); } } } @@ -131,8 +190,9 @@ public class SemanticsChecker { } // Number the interface label interface2Num.put(iConstruct.name, _interfaceNum++); - - interfaceName2Construct.put(iConstruct.name, constructs.get(i)); + + interfaceName2Construct.put(iConstruct.name, + (InterfaceConstruct) constructs.get(i)); for (int j = 0; j < iConstruct.commitPointSet.size(); j++) { String label = iConstruct.commitPointSet.get(j); @@ -164,7 +224,7 @@ public class SemanticsChecker { for (ConditionalInterface left : hbConditions.keySet()) { HashSet set = hbConditions.get(left); checkHBLabelConsistency(left); - + for (ConditionalInterface right : set) { checkHBLabelConsistency(right); } @@ -175,15 +235,16 @@ public class SemanticsChecker { checkLabelDuplication(construct, label); // Number the commit_point label commitPointLabel2Num.put(label, _commitPointNum++); - - potentialCPLabel2Construct.put(label, construct); + + potentialCPLabel2Construct.put(label, + (PotentialCPDefineConstruct) construct); } else if (construct instanceof CPDefineCheckConstruct) { CPDefineCheckConstruct theConstruct = (CPDefineCheckConstruct) construct; label = theConstruct.label; checkLabelDuplication(construct, label); // Number the commit_point label commitPointLabel2Num.put(label, _commitPointNum++); - + CPLabel2Construct.put(label, construct); } else if (construct instanceof CPDefineConstruct) { CPDefineConstruct theConstruct = (CPDefineConstruct) construct; @@ -191,14 +252,10 @@ public class SemanticsChecker { checkLabelDuplication(construct, label); // Number the commit_point label commitPointLabel2Num.put(label, _commitPointNum++); - + CPLabel2Construct.put(label, construct); } else if (construct instanceof EntryPointConstruct) { - if (entryPointConstruct != null) { - throw new SemanticsCheckerException( - "More than one entry point!"); - } - entryPointConstruct = construct; + entryPointConstructs.add((EntryPointConstruct) construct); } else if (construct instanceof InterfaceDefineConstruct) { InterfaceDefineConstruct theConstruct = (InterfaceDefineConstruct) construct; String name = theConstruct.name; @@ -206,25 +263,35 @@ public class SemanticsChecker { throw new SemanticsCheckerException( "Interface define label duplicates!"); } - interfaceName2DefineConstruct.put(name, construct); + interfaceName2DefineConstruct.put(name, theConstruct); + } else if (construct instanceof ClassBeginConstruct) { + classBeginConstruct = (ClassBeginConstruct) construct; + ArrayList content = srcFilesInfo.get(classBeginConstruct.file).content; + String firstLine = content.get(classBeginConstruct.beginLineNum), secondLine; + if (firstLine.startsWith("template")) { + secondLine = content.get(classBeginConstruct.beginLineNum + 1); + templateFullStr = firstLine; + templateStr = ParserUtils.getTemplateStr(firstLine); + className = ParserUtils.getClassName(secondLine); + } else { + className = ParserUtils.getClassName(firstLine); + } + + } else if (construct instanceof ClassEndConstruct) { + classEndConstruct = (ClassEndConstruct) construct; } } } public String toString() { StringBuilder sb = new StringBuilder(); - if (entryPointConstruct == null) { - sb.append("Entry point is not specified!"); - } else { - sb.append("@Entry_point:\n" + entryPointConstruct); - } - + sb.append("Interface name 2 Construct:\n"); for (String interfaceName : interfaceName2Construct.keySet()) { sb.append(interfaceName + "\t" + interfaceName2Construct.get(interfaceName) + "\n"); } - + sb.append("Interface name 2 define construct:\n"); for (String interfaceName : interfaceName2DefineConstruct.keySet()) { sb.append(interfaceName + "\t"