/* 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 :: @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; import java.io.FileInputStream; import java.io.FileNotFoundException; 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(); System.out.println("Parsing finished!"); } catch (FileNotFoundException e) { e.printStackTrace(); } } } PARSER_END(SpecParser) SKIP : { " " | "\n" | "\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 */ | | | | | | | | | | | | | | | | | | | | /* Specification & C/C++ shared tokens */ | <#DIGIT: ["0"-"9"]> | <#LETTER: ["a"-"z", "A"-"Z"]> | | "_") ( | | "_")*> | | | | | "> | | /* C/C++ only token*/ | | | | | | | | | | | | | "> | ="> | | | | | | | | | | < INTEGER_LITERAL: (["l","L"])? | (["l","L"])? | (["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: (["0"-"9"])+ "." (["0"-"9"])* ()? (["f","F","d","D"])? | "." (["0"-"9"])+ ()? (["f","F","d","D"])? | (["0"-"9"])+ (["f","F","d","D"])? | (["0"-"9"])+ ()? ["f","F","d","D"]> | < #DECIMAL_EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ > | < #HEXADECIMAL_FLOATING_POINT_LITERAL: "0" ["x", "X"] (["0"-"9","a"-"f","A"-"F"])+ (".")? (["f","F","d","D"])? | "0" ["x", "X"] (["0"-"9","a"-"f","A"-"F"])* "." (["0"-"9","a"-"f","A"-"F"])+ (["f","F","d","D"])?> | < #HEXADECIMAL_EXPONENT: ["p","P"] (["+","-"])? (["0"-"9"])+ > } void Start() : {} { ( LOOKAHEAD(3) Global_construct() | LOOKAHEAD(3) Interface() | LOOKAHEAD(3) Potential_commit_point_define() | LOOKAHEAD(3) Commit_point_define() | LOOKAHEAD(3) Commit_point_define_check() ) } void Global_construct() : { } { Global_define() (Interface_clusters())? (Happens_before())? } String C_CPP_CODE() : { StringBuilder text; Token t; } { { text = new StringBuilder(); t = new Token(); } (( t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = t = | t = | t = | t = | t = | t = | t = | t = ) { 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(); } } void Global_define() : {} { C_CPP_CODE() } void Conditional_interface() : {} { ( )* } void Interface_cluster() : {} { Conditional_interface() ( Conditional_interface())* } void Interface_clusters() : {} { (Interface_cluster())+ } void Happens_before() : {} { (Conditional_interface() Conditional_interface())+ } void Interface() : {} { ( )* ( C_CPP_CODE())? ( C_CPP_CODE())* ( C_CPP_CODE())? ( C_CPP_CODE())? ( C_CPP_CODE())? ( C_CPP_CODE())? ( C_CPP_CODE())? } void Potential_commit_point_define() : {} { C_CPP_CODE()