more
[cdsspec-compiler.git] / grammer / spec_compiler.jj
index 22fada84bf025aaee801daa7da9d01569a3f9729..cbe2e28d6240ab8a6853df36d0c68c7d647ce15a 100644 (file)
@@ -16,6 +16,7 @@
                # entry point.
                LANG = C;
        @Global_define:
+               @DeclareStruct:
                @DeclareVar:
                @InitVar:
                @DefineFunc:
@@ -29,7 +30,7 @@
        
        b) Interface construct
        @Begin
-       @Interface: ...
+       @Interface_decl: ...
        @Commit_point_set:
                IDENTIFIER | IDENTIFIER ...
        @Condition: ... (Optional)
        @Begin
        @Interface_define: <Interface_Name>
        @End
+
+       g) Interface declare & define construct
+       @Begin
+       @Interface_decl_define: <Interface_Name>
+       @Commit_point_set:
+               IDENTIFIER | IDENTIFIER ...
+       @Condition: ... (Optional)
+       @HB_Condition:
+               IDENTIFIER :: <C_CPP_Condition>
+       @HB_Condition: ...
+       @ID: ... (Optional, use default ID)
+       @Check: (Optional)
+               ...
+       @Action: (Optional)
+               ...
+       @Post_action: (Optional)
+       @Post_check: (Optional)
+       @End
+
 */
 
 
@@ -124,7 +144,7 @@ import edu.uci.eecs.specCompiler.specExtraction.VariableDeclaration;
                                File f = new File("./grammer/spec.txt");
                                FileInputStream fis = new FileInputStream(f);
                                SpecParser parser = new SpecParser(fis);
-                               
+                               /*
                                ArrayList<String> content = new ArrayList<String>();
                                ArrayList<Construct> constructs = new ArrayList<Construct>();
                                ArrayList<String> headers = new ArrayList<String>();
@@ -136,8 +156,9 @@ import edu.uci.eecs.specCompiler.specExtraction.VariableDeclaration;
                                for (int i = 0; i < constructs.size(); i++) {
                                        System.out.println(constructs.get(i));
                                }
+                               */
                                
-                               //parser.Test();
+                               parser.Test();
                                System.out.println("Parsing finished!");
                        } catch (FileNotFoundException e) {
                                e.printStackTrace();
@@ -177,6 +198,8 @@ import edu.uci.eecs.specCompiler.specExtraction.VariableDeclaration;
 
                public static String stringArray2String(ArrayList<String> content) {
                        StringBuilder sb = new StringBuilder();
+                       if (content.size() == 1)
+                               return content.get(0);
                        for (int i = 0; i < content.size(); i++) {
                                sb.append(content.get(i) + "\n");
                        }
@@ -241,6 +264,8 @@ SKIP : {
        <OPTIONS: "@Options:">
 |
        <GLOBAL_DEFINE: "@Global_define:">
+|
+       <DECLARE_STRUCT: "@DeclareStruct:">
 |
        <DECLARE_VAR: "@DeclareVar:">
 |
@@ -301,8 +326,14 @@ SKIP : {
        <STRUCT: "struct">
 |
        <CLASS: "class">
+|
+       <UNSIGNED: "unsigned">
 |
        <TEMPLATE: "template">
+|
+       <INLINE: "inline">
+|
+       <STATIC: "static">
 |
        <#DIGIT: ["0"-"9"]>
 |
@@ -380,6 +411,29 @@ SKIP : {
        <COLON: ":">
 |
        <DOUBLECOLON: "::">
+|
+       <DOUBLELESSTHAN: "<<">
+|
+       <DOUBLEGREATERTHAN: ">>">
+|
+       <TRIPLEGREATERTHAN: ">>>">
+|
+       <PLUS_EQUALS: "+=">
+|
+       <MINUS_EQUALS: "-=">
+|
+       <TIMES_EQUALS: "*=">
+|
+       <DIVIDE_EQUALS: "/=">
+|
+       <MOD_EQUALS: "%=">
+|
+       <XOR_EQUALS: "^=">
+|
+       <OR_EQUALS: "|=">
+|
+       <AND_EQUALS: "&=">
+
 |
        <SEMI_COLON: ";">
 |
@@ -459,7 +513,7 @@ String Type() :
        ("const"
        { type = "const"; }
        )?
-       (((str = <STRUCT>.image | str = <CLASS>.image) { type = type + " " + str; })? 
+       (((str = <STRUCT>.image | str = <CLASS>.image | str = <UNSIGNED>.image) { type = type + " " + str; })? 
        (
        name = ParseQualifiedName() {
                if (!type.equals(""))
@@ -508,6 +562,7 @@ void Test() :
        {
                System.out.println(func);
        }
+       
 }
 
 String ParameterizedName() :
@@ -517,8 +572,8 @@ String ParameterizedName() :
 }
 {
        (str = <IDENTIFIER>.image {res = str;})
-       ("<" str = <IDENTIFIER>.image { res = res + "<" + str; }
-       ("," str = <IDENTIFIER>.image { res = res + ", " + str; })* ">"
+       ("<" str = Type() { res = res + "<" + str; }
+       ("," str = Type() { res = res + ", " + str; })* ">"
        { res = res + ">"; }
        )?
        {
@@ -528,11 +583,14 @@ String ParameterizedName() :
 
 FunctionHeader FuncDecl() :
 {
+       ArrayList<VariableDeclaration> templateList;
        String ret;
        QualifiedName funcName;
        ArrayList<VariableDeclaration> args;
 }
 {
+aa
+       (<STATIC> | <INLINE>)*
        ret = Type() 
        funcName = ParseQualifiedName() 
        args = FormalParamList() 
@@ -559,22 +617,31 @@ QualifiedName ParseQualifiedName() :
        }
 }
 
-ArrayList<String> TemplateParamList() :
+ArrayList<VariableDeclaration> TemplateParamList() :
 {
-       ArrayList<String> params;
-       String str;
+       ArrayList<VariableDeclaration> params;
+       String type;
+       String name;
 }
 {
        {
-               params = new ArrayList<String>();
+               params = new ArrayList<VariableDeclaration>();
        }
        <TEMPLATE>
        "<"
-       (str = <IDENTIFIER>.image 
-       str = <IDENTIFIER>.image {params.add(str);})
+       (type = <IDENTIFIER>.image 
+       name = <IDENTIFIER>.image
+       {
+               params.add(new VariableDeclaration(type, name));
+       }
+       )
 
-       ("," str = <IDENTIFIER>.image 
-       str = <IDENTIFIER>.image {params.add(str);})*
+       ("," type = <IDENTIFIER>.image 
+       name = <IDENTIFIER>.image
+       {
+               params.add(new VariableDeclaration(type, name));
+       }
+       )*
        ">"
        {
                //System.out.println(params);
@@ -629,9 +696,13 @@ ArrayList<String> C_CPP_CODE(ArrayList<String> headers) :
        (
        LOOKAHEAD(2)
        (
-       t = <CONST> | t = <STRUCT> | t = <CLASS> |
+       t = <CONST> | t = <STRUCT> | t = <CLASS> | t = <UNSIGNED> |
        (t = <TEMPLATE> { inTemplate = true;  })|
-       (header = <INCLUDE>.image {
+       t = <STATIC> | t = <INLINE> |
+       (t = <INCLUDE>
+       {
+               header = t.image;
+               newLine = true;
                if (headers != null) {
                        headers.add(header.substring(header.lastIndexOf(' ') + 1));
                }
@@ -649,22 +720,43 @@ ArrayList<String> C_CPP_CODE(ArrayList<String> headers) :
        t = <GREATER_EQUALS>    | t = <LESS_EQUALS> |
        t = <LOGICAL_EQUALS> | t = <NOT_EQUALS> | t = <LOGICAL_AND> | t = <LOGICAL_OR> | t = <XOR> |
        t = <QUESTION_MARK> | t = <COLON> | t = <DOUBLECOLON> |
+       t = <DOUBLELESSTHAN> | 
+       t = <DOUBLEGREATERTHAN> |
+       t = <TRIPLEGREATERTHAN> | 
+
+       t = <PLUS_EQUALS> |
+       t = <MINUS_EQUALS> |
+       t = <TIMES_EQUALS> |
+       t = <DIVIDE_EQUALS> |
+       t = <MOD_EQUALS> |
+       t = <XOR_EQUALS> |
+       t = <OR_EQUALS> |
+       t = <AND_EQUALS> |
+
        (t = <SEMI_COLON> { newLine = true; } )
        | t = <STRING_LITERAL> | t = <CHARACTER_LITERAL> |
        t = <INTEGER_LITERAL> | t = <FLOATING_POINT_LITERAL> |
        (t = <DEFINE> { newLine = true; } )
        )
        {
-               text = text + " " + t.image;
+               if (text.equals("")) {
+                       text = t.image;
+               } else {
+                       text = text + " " + t.image;
+               }
                if (newLine) {
                        content.add(text);
                        text = "";
                        newLine = false;
+                       inTemplate = false;
                }
        }
        )+
 
        {
+               if (content.size() == 0) {
+                       content.add(text);
+               }
                return content;
        }
 }
@@ -747,26 +839,30 @@ GlobalConstruct Global_construct() :
 
 SequentialDefineSubConstruct Global_define() :
 {
-       ArrayList<String> initVar, defineFunc, code;
+       ArrayList<String> initVar, defineFunc, code, declareStruct;
        ArrayList<ArrayList<String>> defineFuncs;
        ArrayList<VariableDeclaration> declareVars;
+       ArrayList<ArrayList<String>> declareStructs;
        VariableDeclaration declareVar;
 
 }
 {
        {
-               declareVars = null;
+               declareVars = new ArrayList<VariableDeclaration>();
                initVar = null;
                defineFuncs = new ArrayList<ArrayList<String>>();
+               declareStructs = new ArrayList<ArrayList<String>>();
        }
        <GLOBAL_DEFINE>
+       (<DECLARE_STRUCT> (declareStruct = C_CPP_CODE(null) {
+               declareStructs.add(declareStruct); }))*
                (<DECLARE_VAR> ((declareVar = TypeParam() ";" {
                        declareVars.add(declareVar); } )*))?
        (<INIT_VAR> (code = C_CPP_CODE(null) { initVar = code; } ))?
        (<DEFINE_FUNC> (defineFunc = C_CPP_CODE(null) { defineFuncs.add(defineFunc); }))*
        {
                SequentialDefineSubConstruct res = new
-                       SequentialDefineSubConstruct(declareVars, initVar, defineFuncs);
+                       SequentialDefineSubConstruct(declareStructs, declareVars, initVar, defineFuncs);
                //System.out.println(res);
                return res;
        }
@@ -780,8 +876,8 @@ ConditionalInterface Conditional_interface() :
        {
                hbConditionLabel = "";
        }
-       interfaceName = <IDENTIFIER>.image (<OPEN_BRACKET> hbConditionLabel =
-       <IDENTIFIER>.image <CLOSE_BRACKET>)?
+       interfaceName = <IDENTIFIER>.image (<OPEN_PAREN> hbConditionLabel =
+       <IDENTIFIER>.image <CLOSE_PAREN>)?
        {
                return new ConditionalInterface(interfaceName, hbConditionLabel);
        }
@@ -794,14 +890,14 @@ void Interface_cluster(GlobalConstruct inst) :
 }
 {
        (clusterName= <IDENTIFIER>.image)
-       <EQUALS> <OPEN_PAREN>
+       <EQUALS> <OPEN_BRACE>
                (condInterface = Conditional_interface()
                { inst.addInterface2Cluster(clusterName, condInterface); } 
                )
                (<COMMA> condInterface = Conditional_interface()
                { inst.addInterface2Cluster(clusterName, condInterface); } 
                )*
-       <CLOSE_PAREN>
+       <CLOSE_BRACE>
 }
 
 void Interface_clusters(GlobalConstruct inst) :
@@ -835,16 +931,14 @@ InterfaceConstruct Interface() :
 {
        {
                res = null;
-               action = null;
+               action = new ArrayList<String>();
                condition = "";
                idCode = "";
                check = "";
                postCheck = "";
                commitPointSet = new ArrayList<String>();
                hbConditions = new HashMap<String, String>();
-
-               action = null;
-               postAction = null;
+               postAction = new ArrayList<String>();
        }
                <BEGIN>
                        <INTERFACE> (interfaceName = <IDENTIFIER>.image)
@@ -866,7 +960,7 @@ InterfaceConstruct Interface() :
                        (<CONDITION> (content = C_CPP_CODE(null) { condition = stringArray2String(content); }))?
                        (
                                <HB_CONDITION>
-                               (hbLabel = <IDENTIFIER>.image)
+                               (hbLabel = <IDENTIFIER>.image) <DOUBLECOLON>
                                (content = C_CPP_CODE(null) { hbCondition = stringArray2String(content); })
                                {
                                        if (hbConditions.containsKey(hbLabel)) {