parser checked
[cdsspec-compiler.git] / grammer / spec-compiler.jj
index 4a7d11a871df83c963082c303ce71424f3ec624e..2238268a43ac644a62e490703ea226c6d3060f2f 100644 (file)
@@ -31,6 +31,8 @@
        @Check: (Optional)
                ...
        @Action: (Optional)
+               @DefineVar: Type var1 = SomeExpression (Optional)
+               @Code (Optional)
                ...
        @Post_action: (Optional)
        @Post_check: (Optional)
@@ -69,19 +71,43 @@ package edu.uci.eecs.specCompiler.grammerParser;
 
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.io.ByteArrayInputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
 
-       class SpecParser {
+import edu.uci.eecs.specCompiler.specExtraction.Construct;
+import edu.uci.eecs.specCompiler.specExtraction.GlobalConstruct;
+import edu.uci.eecs.specCompiler.specExtraction.InterfaceConstruct;
+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)
                throws ParseException, TokenMgrError {
                        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();
                        }
                }
+       
+               public static Construct parseSpec(String text)
+               throws ParseException, TokenMgrError {
+                       InputStream input = new ByteArrayInputStream(text.getBytes());
+                       SpecParser parser = new SpecParser(input);
+                       return parser.Parse();
+               }
+
+
        }
 PARSER_END(SpecParser)
 
@@ -134,6 +160,10 @@ TOKEN :
        <CHECK: "@Check:">
 |
        <ACTION: "@Action:">
+|
+       <DEFINEVAR: "@DefineVar:">
+|
+       <CODE: "@Code:">
 |
        <POST_ACTION: "@Post_action:">
 |
@@ -179,6 +209,8 @@ TOKEN :
        <STAR: "*">
 |
        <NEGATE: "~">
+|
+       <EXCLAMATION: "!">
 |
        <AND: "&">
 |
@@ -280,28 +312,44 @@ TOKEN :
        < #HEXADECIMAL_EXPONENT: ["p","P"] (["+","-"])? (["0"-"9"])+ >
 }
 
-void Start() :
-{}
+Construct Parse() :
+{
+       Construct res;  
+}
 {
        (
-       LOOKAHEAD(3) Global_construct() |
-       LOOKAHEAD(3) Interface() |
-       LOOKAHEAD(3) Potential_commit_point_define() |
-       LOOKAHEAD(3) Commit_point_define() |
-       LOOKAHEAD(3) Commit_point_define_check()
+       LOOKAHEAD(3) res = Global_construct() |
+       LOOKAHEAD(3) res = Interface() |
+       LOOKAHEAD(3) res = Potential_commit_point_define() |
+       LOOKAHEAD(3) res = Commit_point_define() |
+       LOOKAHEAD(3) res = Commit_point_define_check()
        )
        <EOF>
+       {
+               //System.out.println(res);
+               return res;
+       }
 }
 
-void Global_construct() :
+GlobalConstruct Global_construct() :
 {
+       GlobalConstruct res;
+       String code;
 }
 {
+       { res = null; }
        <HEAD>
                <BEGIN> 
-                       Global_define() (Interface_clusters())? (Happens_before())?
+                       (code = Global_define())
+                       { res = new GlobalConstruct(code); }
+                       (Interface_clusters(res))?
+                       (Happens_before(res))?
                <END>
        <TAIL>
+       {
+               res.unfoldInterfaceCluster();
+               return res;
+       }
 }
 
 String C_CPP_CODE() :
@@ -314,13 +362,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 = <DOT> | t = <STAR> | t = <NEGATE> | t = <EXCLAMATION> | 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>
@@ -335,93 +385,228 @@ String C_CPP_CODE() :
        }
        )+
        {
-               System.out.println(text);
+               //System.out.println(text);
                return text.toString();
        }
 }
 
-void Global_define() :
-{}
+String Global_define() :
 {
-       <GLOBAL_DEFINE> C_CPP_CODE()
+       String code;    
+}
+{
+       <GLOBAL_DEFINE> (code = C_CPP_CODE())
+       {
+               return code;
+       }
 }
 
-void Conditional_interface() :
-{}
+ConditionalInterface Conditional_interface() :
+{
+       String interfaceName, hbConditionLabel;
+}
 {
-       <IDENTIFIER> (<OPEN_BRACKET> <IDENTIFIER> <CLOSE_BRACKET>)*
+       {
+               hbConditionLabel = "";
+       }
+       interfaceName = <IDENTIFIER>.image (<OPEN_BRACKET> hbConditionLabel =
+       <IDENTIFIER>.image <CLOSE_BRACKET>)?
+       {
+               return new ConditionalInterface(interfaceName, hbConditionLabel);
+       }
 }
 
-void Interface_cluster() :
-{}
+void Interface_cluster(GlobalConstruct inst) :
+{
+       String clusterName;
+       ConditionalInterface condInterface;
+}
 {
-       <IDENTIFIER> <EQUALS> <OPEN_PAREN>
-               Conditional_interface() (<COMMA> Conditional_interface())*
+       (clusterName= <IDENTIFIER>.image)
+       <EQUALS> <OPEN_PAREN>
+               (condInterface = Conditional_interface()
+               { inst.addInterface2Cluster(clusterName, condInterface); } 
+               )
+               (<COMMA> condInterface = Conditional_interface()
+               { inst.addInterface2Cluster(clusterName, condInterface); } 
+               )*
        <CLOSE_PAREN>
 }
 
-void Interface_clusters() :
+void Interface_clusters(GlobalConstruct inst) :
 {}
 {
-       <INTERFACE_CLUSTER> (Interface_cluster())+
+       <INTERFACE_CLUSTER> (Interface_cluster(inst))+
 }
 
-void Happens_before() :
-{}
+void Happens_before(GlobalConstruct inst) :
 {
-       <HAPPENS_BEFORE> (Conditional_interface() <HB_SYMBOL> Conditional_interface())+
+       ConditionalInterface left, right;       
+}
+{
+       <HAPPENS_BEFORE> 
+       (
+       left = Conditional_interface() <HB_SYMBOL> right = Conditional_interface()
+       { inst.addHBCondition(left, right); }
+       )+
 }
 
-void Interface() :
-{}
+InterfaceConstruct Interface() :
+{
+       InterfaceConstruct res;
+       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 = "";
+               postAction = "";
+               postCheck = "";
+               commitPointSet = new ArrayList<String>();
+               hbConditions = new HashMap<String, String>();
+       }
        <HEAD> 
                <BEGIN>
-                       <INTERFACE> <IDENTIFIER>
-                       <COMMIT_POINT_SET> <IDENTIFIER> (<OR> <IDENTIFIER>)*
-                       (<CONDITION> C_CPP_CODE())?
-                       (<HB_CONDITION> <IDENTIFIER> C_CPP_CODE())*
-                       (<ID> C_CPP_CODE())?
-                       (<CHECK> C_CPP_CODE())?
-                       (<ACTION> C_CPP_CODE())?
-                       (<POST_ACTION> C_CPP_CODE())?
-                       (<POST_CHECK> C_CPP_CODE())?
+                       <INTERFACE> (interfaceName = <IDENTIFIER>.image)
+                       <COMMIT_POINT_SET>
+                               (commitPoint = <IDENTIFIER>.image
+                               { commitPointSet.add(commitPoint); }
+                               )
+                               (<OR>
+                                       (commitPoint = <IDENTIFIER>.image)
+                                       {
+                                               if (commitPointSet.contains(commitPoint)) {
+                                                       throw new ParseException(interfaceName + " has" +
+                                                               "duplicate commit point labels");
+                                               }
+                                               commitPointSet.add(commitPoint);
+                                       }
+                               )*
+
+                       (<CONDITION> (condition = C_CPP_CODE()))?
+                       (
+                               <HB_CONDITION>
+                               (hbLabel = <IDENTIFIER>.image)
+                               (hbCondition = C_CPP_CODE())
+                               {
+                                       if (hbConditions.containsKey(hbLabel)) {
+                                               throw new ParseException(interfaceName + " has" +
+                                                       "duplicate happens-before condtion labels");
+                                       }
+                                       hbConditions.put(hbLabel, hbCondition);
+                               }
+                       )*
+                       (<ID> (idCode = C_CPP_CODE()))?
+                       (<CHECK> (check = C_CPP_CODE()))?
+                       (action = Action())?
+                       (<POST_ACTION> (postAction = C_CPP_CODE()))?
+                       (<POST_CHECK> (postCheck = C_CPP_CODE()))?
                <END>
        <TAIL>
+       {
+               res = new InterfaceConstruct(interfaceName, commitPointSet, condition,
+                       hbConditions, idCode, check, action, postAction, postCheck);
+               return res;
+       }
 }
 
-void Potential_commit_point_define() :
-{}
+ActionSubConstruct Action() :
+{
+       String type, name, expr, defineVarStr, code;
+       ArrayList<DefineVar> defineVars;
+}
+{
+       {
+               defineVars = new ArrayList<DefineVar>();
+               code = "";
+       }
+       <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;
+       String label, condition;
+}
+{
+
+       { res = null; }
        <HEAD> 
                <BEGIN>
-                       <POTENTIAL_COMMIT_POINT_DEFINE> C_CPP_CODE()
-                       <LABEL> <IDENTIFIER>
+                       <POTENTIAL_COMMIT_POINT_DEFINE> (condition = C_CPP_CODE())
+                       <LABEL> (label = <IDENTIFIER>.image)
                <END>
        <TAIL>
+       {
+               res = new PotentialCPDefineConstruct(label, condition); 
+               return res;
+       }
 }
 
 
-void Commit_point_define() :
-{}
+CPDefineConstruct Commit_point_define() :
+{
+       CPDefineConstruct res;
+       String label, potentialCPLabel, condition;
+}
 {
+
+       { res = null; }
        <HEAD> 
                <BEGIN>
-                       <COMMIT_POINT_DEFINE> C_CPP_CODE()
-                       <POTENTIAL_COMMIT_POINT_LABEL> <IDENTIFIER>
-                       <LABEL> <IDENTIFIER>
+                       <COMMIT_POINT_DEFINE> (condition = C_CPP_CODE())
+                       <POTENTIAL_COMMIT_POINT_LABEL> (potentialCPLabel = <IDENTIFIER>.image)
+                       <LABEL> (label = <IDENTIFIER>.image)
                <END>
        <TAIL>
+       {
+               res = new CPDefineConstruct(label, potentialCPLabel, condition);
+               return res;
+       }
 }
 
 
-void Commit_point_define_check() :
-{}
+CPDefineCheckConstruct Commit_point_define_check() :
 {
+       CPDefineCheckConstruct res;     
+       String label, condition;
+}
+{
+
+       { res = null; }
        <HEAD> 
                <BEGIN> 
-                       <COMMIT_POINT_DEFINE_CHECK> C_CPP_CODE()
-                       <LABEL> <IDENTIFIER>
+                       <COMMIT_POINT_DEFINE_CHECK> (condition = C_CPP_CODE())
+                       <LABEL> (label = <IDENTIFIER>.image)
                <END>
        <TAIL>
+       {
+               res = new CPDefineCheckConstruct(label, condition);
+               return res;
+       }
 }