/* spec-compiler.jj Grammer definition for the specification */
+
+/*
+ SPEC constructs:
+ Each construct should be embraced by /DOUBLE_STAR ... STAR/ annotation.
+ Within there, any line beginning with a "#" is a comment of the annotation.
+ Each constrcut should begin with @Begin and end with @End. Otherwise, the
+ annotation would be considered as normal comments of the source.
+
+ a) Global construct
+ @Begin
+ @Global_define:
+ ...
+ @Interface_cluster:
+ ...
+ @Happens-before:
+ ...
+ @End
+
+ b) Interface construct
+ @Begin
+ @Interface: ...
+ @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
+
+ c) Potential commit construct
+ @Begin
+ @Potential_commit_point_define: ...
+ @Label: ...
+ @End
+
+ d) Commit point define construct
+ @Begin
+ @Commit_point_define_check: ...
+ @Label: ...
+ @End
+
+ OR
+
+ @Begin
+ @Commit_point_define: ...
+ @Potential_commit_point_label: ...
+ @Label: ...
+ @End
+*/
+
+
+
options {
STATIC = false;
JAVA_UNICODE_ESCAPE = true;
PARSER_BEGIN(SpecParser)
package edu.uci.eecs.specCompiler.grammerParser;
- class SpecParser {
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+
+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;
+
+ public class SpecParser {
public static void main(String[] argvs)
throws ParseException, TokenMgrError {
- SpecParser parser = new SpecParser(System.in);
- parser.Start();
- System.out.println("Parsing finished!");
+ try {
+ FileInputStream fis = new FileInputStream("./grammer/spec.txt");
+ SpecParser parser = new SpecParser(fis);
+ parser.Start();
+ System.out.println("Parsing finished!");
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ }
}
}
PARSER_END(SpecParser)
-SKIP : {" " | "\n" | "\r" | "\r\n" | <COMMENT>}
-
-TOKEN :
+SKIP :
{
- <SPACE: (" " | "\t")+>
+ " "
+|
+ "\n"
|
- <COMMENT: <SPACE> "#" (~["\n", "\r"])* ["\n", "\r"]>
+ "\r"
|
+ "\r\n"
+|
+ "\t"
+|
+ // "#" comment for the specification
+ <"#" (~["\n", "\r"])* (["\n", "\r"])>
+|
+ // "//" comment for the specification
+ <"//" (~["\n", "\r"])* (["\n", "\r"])>
+}
+
+TOKEN :
+{
+/* Above are specification-only tokens */
<HEAD: "/**">
|
<TAIL: "*/">
|
<END: "@End">
|
-
+ <GLOBAL_DEFINE: "@Global_define:">
+|
+ <INTERFACE_CLUSTER: "@Interface_cluster:">
+|
+ <HAPPENS_BEFORE: "@Happens_before:">
+|
+ <INTERFACE: "@Interface:">
+|
+ <COMMIT_POINT_SET: "@Commit_point_set:">
+|
+ <CONDITION: "@Condition:">
+|
+ <HB_CONDITION: "@HB_condition:">
+|
+ <ID: "@ID:">
+|
+ <CHECK: "@Check:">
+|
+ <ACTION: "@Action:">
+|
+ <POST_ACTION: "@Post_action:">
+|
+ <POST_CHECK: "@Post_check:">
+|
+ <POTENTIAL_COMMIT_POINT_DEFINE: "@Potential_commit_point_define:">
+|
+ <LABEL: "@Label:">
+|
+ <COMMIT_POINT_DEFINE_CHECK: "@Commit_point_define_check:">
+|
+ <COMMIT_POINT_DEFINE: "@Commit_point_define:">
+|
+ <POTENTIAL_COMMIT_POINT_LABEL: "@Potential_commit_point_label:">
+
+
+/* Specification & C/C++ shared tokens */
+|
+ <#DIGIT: ["0"-"9"]>
+|
+ <#LETTER: ["a"-"z", "A"-"Z"]>
+|
+ <IDENTIFIER: (<LETTER> | "_") (<LETTER> | <DIGIT> | "_")*>
+|
+ <EQUALS: "=">
+|
+ <OPEN_PAREN: "{">
+|
+ <CLOSE_PAREN: "}">
+|
+ <OPEN_BRACKET: "(">
+|
+ <CLOSE_BRACKET: ")">
+|
+ <HB_SYMBOL: "->">
+|
+ <COMMA: ",">
+
+|
+/* C/C++ only token*/
+ <DOT: ".">
+|
+ <STAR: "*">
+|
+ <NEGATE: "~">
+|
+ <AND: "&">
+|
+ <OR: "|">
+|
+ <MOD: "%">
+|
+ <PLUS: "+">
+|
+ <PLUSPLUS: "++">
+|
+ <MINUS: "-">
+|
+ <MINUSMINUS: "--">
+|
+ <DIVIDE: "/">
+|
+ <BACKSLASH: "\\">
+|
+ <LESS_THAN: "<">
+|
+ <GREATER_THAN: ">">
+|
+ <GREATER_EQUALS: ">=">
+|
+ <LESS_EQUALS: "<=">
+|
+ <LOGICAL_EQUALS: "==">
+|
+ <NOT_EQUALS: "!=">
+|
+ <LOGICAL_AND: "&&">
+|
+ <LOGICAL_OR: "||">
+|
+ <XOR: "^">
+|
+ <QUESTION_MARK: "?">
+|
+ <COLON: ":">
+|
+ <DOUBLECOLON: "::">
+|
+ <SEMI_COLON: ";">
+|
+ <STRING_LITERAL:
+ "\""
+ ((~["\"","\\","\n","\r"])
+ | ("\\"
+ ( ["n","t","b","r","f","\\","'","\""]
+ | ["0"-"7"] ( ["0"-"7"] )?
+ | ["0"-"3"] ["0"-"7"]
+ ["0"-"7"]
+ )
+ )
+ )*
+ "\"">
+|
+ <CHARACTER_LITERAL:
+ "'"
+ ((~["'","\\","\n","\r"])
+ | ("\\"
+ (["n","t","b","r","f","\\","'","\""]
+ | ["0"-"7"] ( ["0"-"7"] )?
+ | ["0"-"3"] ["0"-"7"]
+ ["0"-"7"]
+ )
+ )
+ )
+ "'">
+|
+ < INTEGER_LITERAL:
+ <DECIMAL_LITERAL> (["l","L"])?
+ | <HEX_LITERAL> (["l","L"])?
+ | <OCTAL_LITERAL> (["l","L"])?>
+|
+ < #DECIMAL_LITERAL: ["1"-"9"] (["0"-"9"])* >
+|
+ < #HEX_LITERAL: "0" ["x","X"] (["0"-"9","a"-"f","A"-"F"])+ >
+|
+ < #OCTAL_LITERAL: "0" (["0"-"7"])* >
+|
+ < FLOATING_POINT_LITERAL:
+ <DECIMAL_FLOATING_POINT_LITERAL>
+ | <HEXADECIMAL_FLOATING_POINT_LITERAL> >
+|
+ < #DECIMAL_FLOATING_POINT_LITERAL:
+ (["0"-"9"])+ "." (["0"-"9"])* (<DECIMAL_EXPONENT>)? (["f","F","d","D"])?
+ | "." (["0"-"9"])+ (<DECIMAL_EXPONENT>)? (["f","F","d","D"])?
+ | (["0"-"9"])+ <DECIMAL_EXPONENT> (["f","F","d","D"])?
+ | (["0"-"9"])+ (<DECIMAL_EXPONENT>)? ["f","F","d","D"]>
+|
+ < #DECIMAL_EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ >
+|
+ < #HEXADECIMAL_FLOATING_POINT_LITERAL:
+ "0" ["x", "X"] (["0"-"9","a"-"f","A"-"F"])+ (".")? <HEXADECIMAL_EXPONENT> (["f","F","d","D"])?
+ | "0" ["x", "X"] (["0"-"9","a"-"f","A"-"F"])* "." (["0"-"9","a"-"f","A"-"F"])+ <HEXADECIMAL_EXPONENT> (["f","F","d","D"])?>
+|
+ < #HEXADECIMAL_EXPONENT: ["p","P"] (["+","-"])? (["0"-"9"])+ >
}
-void Start() :
+Construct Start() :
+{
+ Construct res;
+}
+{
+ (
+ 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>
+ { return res; }
+}
+
+GlobalConstruct Global_construct() :
+{
+ GlobalConstruct res;
+ String code;
+}
+{
+ { res = null; }
+ <HEAD>
+ <BEGIN>
+ (code = Global_define())
+ { res = new GlobalConstruct(code); }
+ (Interface_clusters(res))?
+ (Happens_before(res))?
+ <END>
+ <TAIL>
+ {
+ res.unfoldInterfaceCluster();
+ System.out.println(res);
+ return res;
+ }
+}
+
+String C_CPP_CODE() :
+{
+ StringBuilder text;
+ Token t;
+}
+{
+ {
+ text = new StringBuilder();
+ t = new Token();
+ }
+ ((
+ 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 = <QUESTION_MARK> | t = <COLON> | t = <DOUBLECOLON> |
+ t = <SEMI_COLON> | t = <STRING_LITERAL> | t = <CHARACTER_LITERAL> |
+ t = <INTEGER_LITERAL> | t = <FLOATING_POINT_LITERAL>
+ )
+ {
+ text.append(t.image);
+ if (t.image.equals(";") || t.image.equals("\\")
+ || t.image.equals("{") || t.image.equals("}"))
+ text.append("\n");
+ else
+ text.append(" ");
+ }
+ )+
+ {
+ //System.out.println(text);
+ return text.toString();
+ }
+}
+
+String Global_define() :
+{
+ String code;
+}
+{
+ <GLOBAL_DEFINE> (code = C_CPP_CODE())
+ {
+ return code;
+ }
+}
+
+ConditionalInterface Conditional_interface() :
+{
+ String interfaceName, hbConditionLabel;
+}
+{
+ {
+ hbConditionLabel = "";
+ }
+ interfaceName = <IDENTIFIER>.image (<OPEN_BRACKET> hbConditionLabel =
+ <IDENTIFIER>.image <CLOSE_BRACKET>)?
+ {
+ return new ConditionalInterface(interfaceName, hbConditionLabel);
+ }
+}
+
+void Interface_cluster(GlobalConstruct inst) :
+{
+ String clusterName;
+ ConditionalInterface condInterface;
+}
+{
+ (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(GlobalConstruct inst) :
{}
{
- <HEAD> <BEGIN> <END> <TAIL> <EOF>
+ <INTERFACE_CLUSTER> (Interface_cluster(inst))+
+}
+
+void Happens_before(GlobalConstruct inst) :
+{
+ ConditionalInterface left, right;
+}
+{
+ <HAPPENS_BEFORE>
+ (
+ left = Conditional_interface() <HB_SYMBOL> right = Conditional_interface()
+ { inst.addHBCondition(left, right); }
+ )+
+}
+
+InterfaceConstruct Interface() :
+{
+ InterfaceConstruct res;
+}
+{
+ { res = null; }
+ <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())?
+ <END>
+ <TAIL>
+ { return res; }
+}
+
+PotentialCPDefineConstruct Potential_commit_point_define() :
+{
+ PotentialCPDefineConstruct res;
+}
+{
+
+ { res = null; }
+ <HEAD>
+ <BEGIN>
+ <POTENTIAL_COMMIT_POINT_DEFINE> C_CPP_CODE()
+ <LABEL> <IDENTIFIER>
+ <END>
+ <TAIL>
+ { return res; }
+}
+
+
+CPDefineConstruct Commit_point_define() :
+{
+ CPDefineConstruct res;
+}
+{
+
+ { res = null; }
+ <HEAD>
+ <BEGIN>
+ <COMMIT_POINT_DEFINE> C_CPP_CODE()
+ <POTENTIAL_COMMIT_POINT_LABEL> <IDENTIFIER>
+ <LABEL> <IDENTIFIER>
+ <END>
+ <TAIL>
+ { return res; }
+}
+
+
+CPDefineCheckConstruct Commit_point_define_check() :
+{
+ CPDefineCheckConstruct res;
+}
+{
+
+ { res = null; }
+ <HEAD>
+ <BEGIN>
+ <COMMIT_POINT_DEFINE_CHECK> C_CPP_CODE()
+ <LABEL> <IDENTIFIER>
+ <END>
+ <TAIL>
+ { return res; }
}