add more parsing
authorPeizhao Ou <peizhaoo@uci.edu>
Mon, 14 Oct 2013 23:19:07 +0000 (16:19 -0700)
committerPeizhao Ou <peizhaoo@uci.edu>
Mon, 14 Oct 2013 23:19:07 +0000 (16:19 -0700)
grammer/spec-compiler.jj
src/edu/uci/eecs/specCompiler/specExtraction/ActionSubConstruct.java [new file with mode: 0644]
src/edu/uci/eecs/specCompiler/specExtraction/InterfaceConstruct.java
src/edu/uci/eecs/specCompiler/specExtraction/SpecExtractor.java

index ca38b5facb925cb5208d3bf36b535214c16c3c1f..85aabff176d0ab19da6572b2fac30649eb15f218 100644 (file)
@@ -31,6 +31,8 @@
        @Check: (Optional)
                ...
        @Action: (Optional)
+               @DefineVar: Type var1 = SomeExpression (Optional)
+               @Code (Optional)
                ...
        @Post_action: (Optional)
        @Post_check: (Optional)
@@ -80,6 +82,8 @@ import edu.uci.eecs.specCompiler.specExtraction.PotentialCPDefineConstruct;
 import edu.uci.eecs.specCompiler.specExtraction.CPDefineConstruct;
 import edu.uci.eecs.specCompiler.specExtraction.CPDefineCheckConstruct;
 import edu.uci.eecs.specCompiler.specExtraction.ConditionalInterface;
+import edu.uci.eecs.specCompiler.specExtraction.ActionSubConstruct;
+import edu.uci.eecs.specCompiler.specExtraction.ActionSubConstruct.DefineVar;
 
        public class SpecParser {
                public static void main(String[] argvs)
@@ -87,7 +91,7 @@ import edu.uci.eecs.specCompiler.specExtraction.ConditionalInterface;
                        try {
                                FileInputStream fis = new FileInputStream("./grammer/spec.txt");
                                SpecParser parser = new SpecParser(fis);
-                               parser.Start();
+                               parser.Parse();
                                System.out.println("Parsing finished!");
                        } catch (FileNotFoundException e) {
                                e.printStackTrace();
@@ -145,6 +149,10 @@ TOKEN :
        <CHECK: "@Check:">
 |
        <ACTION: "@Action:">
+|
+       <DEFINEVAR: "@DefineVar:">
+|
+       <CODE: "@Code:">
 |
        <POST_ACTION: "@Post_action:">
 |
@@ -291,7 +299,7 @@ TOKEN :
        < #HEXADECIMAL_EXPONENT: ["p","P"] (["+","-"])? (["0"-"9"])+ >
 }
 
-Construct Start() :
+Construct Parse() :
 {
        Construct res;  
 }
@@ -341,13 +349,15 @@ String C_CPP_CODE() :
                text = new StringBuilder();
                t = new Token();
        }
-       ((
+       (
+       //LOOKAHEAD(2)
+       (
        t = <IDENTIFIER> | t = <EQUALS> | t = <OPEN_PAREN> | t = <CLOSE_PAREN> |
        t = <OPEN_BRACKET> | t = <CLOSE_BRACKET> | t = <HB_SYMBOL> | t = <COMMA> |
        t = <DOT> | t = <STAR> | t = <NEGATE> | t = <AND> | t = <OR> | t = <MOD> | t = <PLUS> |
        t = <PLUSPLUS> | t = <MINUS> | t = <MINUSMINUS> | t = <DIVIDE> | t = <BACKSLASH> |
        t = <LESS_THAN> | t = <GREATER_THAN> | t = <GREATER_EQUALS>     | t = <LESS_EQUALS> |
-       t = <LOGICAL_EQUALS> | t = <NOT_EQUALS> | t = <LOGICAL_AND> | t = <LOGICAL_OR> | t = <XOR>
+       t = <LOGICAL_EQUALS> | t = <NOT_EQUALS> | t = <LOGICAL_AND> | t = <LOGICAL_OR> | t = <XOR> |
        t = <QUESTION_MARK> | t = <COLON> | t = <DOUBLECOLON> |
        t = <SEMI_COLON> | t = <STRING_LITERAL> | t = <CHARACTER_LITERAL> |
        t = <INTEGER_LITERAL> | t = <FLOATING_POINT_LITERAL>
@@ -431,18 +441,19 @@ void Happens_before(GlobalConstruct inst) :
 InterfaceConstruct Interface() :
 {
        InterfaceConstruct res;
-       String interfaceName, condition, idCode, check, action, postAction,
+       String interfaceName, condition, idCode, check, postAction,
                postCheck, commitPoint, hbLabel, hbCondition;
+       ActionSubConstruct action;
        ArrayList<String> commitPointSet;
        HashMap<String, String> hbConditions;
 }
 {
        {
                res = null;
+               action = null;
                condition = "";
                idCode = "";
                check = "";
-               action = "";
                postAction = "";
                postCheck = "";
                commitPointSet = new ArrayList<String>();
@@ -481,7 +492,7 @@ InterfaceConstruct Interface() :
                        )*
                        (<ID> (idCode = C_CPP_CODE()))?
                        (<CHECK> (check = C_CPP_CODE()))?
-                       (<ACTION> (action = C_CPP_CODE()))?
+                       (action = Action())?
                        (<POST_ACTION> (postAction = C_CPP_CODE()))?
                        (<POST_CHECK> (postCheck = C_CPP_CODE()))?
                <END>
@@ -493,6 +504,34 @@ InterfaceConstruct Interface() :
        }
 }
 
+ActionSubConstruct Action() :
+{
+       String type, name, expr, defineVarStr, code;
+       ArrayList<DefineVar> defineVars;
+}
+{
+       {
+               defineVars = new ArrayList<DefineVar>();
+       }
+       <ACTION>
+               (<DEFINEVAR> (defineVarStr = C_CPP_CODE()) 
+               {
+                       int eqIdx = defineVarStr.indexOf('=');
+                       int typeEnd = defineVarStr.lastIndexOf(' ', eqIdx - 2);
+                       type = defineVarStr.substring(0, typeEnd);
+                       name = defineVarStr.substring(typeEnd + 1, eqIdx - 1);
+                       expr = defineVarStr.substring(eqIdx + 2);
+                       DefineVar defineVar = new DefineVar(type, name, expr);
+                       defineVars.add(defineVar);
+               }
+               )*
+               <CODE> (code = C_CPP_CODE())
+               {
+                       ActionSubConstruct res = new ActionSubConstruct(defineVars, code);
+                       return res;
+               }
+}
+
 PotentialCPDefineConstruct Potential_commit_point_define() :
 {
        PotentialCPDefineConstruct res;
diff --git a/src/edu/uci/eecs/specCompiler/specExtraction/ActionSubConstruct.java b/src/edu/uci/eecs/specCompiler/specExtraction/ActionSubConstruct.java
new file mode 100644 (file)
index 0000000..b8b8689
--- /dev/null
@@ -0,0 +1,43 @@
+package edu.uci.eecs.specCompiler.specExtraction;
+
+import java.util.ArrayList;
+
+public class ActionSubConstruct {
+       public static class DefineVar {
+               public final String varType;
+               public final String varName;
+               public final String varExpr;
+               
+               public DefineVar(String varType, String varName, String varExpr) {
+                       this.varType = varType;
+                       this.varName = varName;
+                       this.varExpr = varExpr;
+               }
+               
+               public String toString() {
+                       return varType + " " + varName + " = " + varExpr;
+               }
+       }
+       
+       public final ArrayList<DefineVar> defineVars;
+       public final String code;
+       
+       public ActionSubConstruct(ArrayList<DefineVar> defineVars, String code) {
+               this.code = code;
+               this.defineVars = defineVars;
+       }
+       
+       public void addDefineVar(DefineVar defineVar) {
+               defineVars.add(defineVar);
+       }
+       
+       public String toString() {
+               StringBuilder sb = new StringBuilder();
+               sb.append("@Action:\n");
+               for (DefineVar defineVar : defineVars) {
+                       sb.append("\t@DefineVar: " + defineVar + "\n");
+               }
+               sb.append("\t@Code: " + code);
+               return sb.toString();
+       }
+}
index c301c4e926ae02893a24f76f6092bf7b852a2261..6af7197d000e4f48a8e3198b20b5da23d5c37bcc 100644 (file)
@@ -10,13 +10,13 @@ public class InterfaceConstruct extends Construct {
        public final HashMap<String, String> hbConditions;
        public final String idCode;
        public final String check;
-       public final String action;
+       public final ActionSubConstruct action;
        public final String postAction;
        public final String postCheck;
 
        public InterfaceConstruct(String name, ArrayList<String> commitPointSet,
                        String condition, HashMap<String, String> hbConditions, String idCode,
-                       String check, String action, String postAction, String postCheck) {
+                       String check, ActionSubConstruct action, String postAction, String postCheck) {
                this.name = name;
                this.commitPointSet = commitPointSet;
                this.condition = condition;
@@ -46,7 +46,6 @@ public class InterfaceConstruct extends Construct {
                sb.append("@ID: ");
                sb.append(idCode + "\n");
                sb.append("@Check: " + check + "\n");
-               sb.append("@Action:\n");
                sb.append(action + "\n");
                sb.append("@Post_action:\n");
                sb.append(postAction + "\n");
index dc24b28167d0f2c63adb875d0ec348af7dd30e8e..e1fae7ef35081ecd04c4d1744303b315b32bc586 100644 (file)
@@ -61,6 +61,7 @@ public class SpecExtractor {
                                                if (trimedLine.endsWith("*/")) {
                                                        _endLineNum = reader.getLineNumber();
                                                        foundHead = false;
+                                                       //Constrcut inst = SpecParser
                                                        
                                                        System.out.println("Spec<" + specIndex + "> Begin: "
                                                                        + _beginLine + "  End: " + _endLineNum);
@@ -83,7 +84,7 @@ public class SpecExtractor {
                                                specText = new StringBuilder();
                                        }
                                }
-                       }
+                       } 
                        // At the end we can only find the head "/**" but no tail found
                        if (foundHead) {
                                String msg = "In file \"" + file.getAbsolutePath() + "\", line: "
@@ -97,6 +98,19 @@ public class SpecExtractor {
                }
        }
        
+       private String readInterfaceDecl(LineNumberReader reader) throws IOException {
+               String res = "", curLine;
+               while ((curLine = reader.readLine()) != null) {
+                       int braceIdx = curLine.indexOf(')');
+                       if (braceIdx == -1) {
+                               res = res + " " + curLine;
+                       } else {
+                               res = res + curLine.substring(0, braceIdx + 1);
+                       }
+               }
+               return res;
+       }
+       
        private String trimSpace(String line) {
                int i, j;
                char ch;