b) Interface construct
@Begin
- @Interface: ...
+ @Interface_decl: ...
@Commit_point_set:
IDENTIFIER | IDENTIFIER ...
@Condition: ... (Optional)
@Label: ...
@End
+ // Commit point clear (just as a normal commit point, but it is used to
+ // clear all commit points)
+ @Begin
+ @Commit_point_clear: ...
+ @Label: ...
+ @End
+
e) Entry point construct
@Begin
@Entry_point
@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
+
*/
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.Arrays;
import edu.uci.eecs.specCompiler.specExtraction.Construct;
import edu.uci.eecs.specCompiler.specExtraction.GlobalConstruct;
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.CPClearConstruct;
import edu.uci.eecs.specCompiler.specExtraction.ConditionalInterface;
import edu.uci.eecs.specCompiler.specExtraction.SequentialDefineSubConstruct;
import edu.uci.eecs.specCompiler.specExtraction.InterfaceDefineConstruct;
public static void main(String[] argvs)
throws ParseException, TokenMgrError {
try {
- File f = new File("./grammer/spec.txt");
+ File f = new File("./grammer/spec1.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>();
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();
return null;
}
- public static ArrayList<String> getTemplateArg(String line)
+
+ private static ArrayList<String> breakLines(String all) {
+ String lines[] = all.split("[\\r\\n]+");
+ return new ArrayList<String>(Arrays.asList(lines));
+ }
+
+
+ public static ArrayList<VariableDeclaration> getTemplateArg(String line)
throws ParseException {
InputStream input = new ByteArrayInputStream(line.getBytes());
SpecParser parser = new SpecParser(input);
return sb.toString();
}
+ /**
+ boolean spaceSeparator(Token t) {
+ switch (t.image) {
+ case "[":
+ case "]":
+ case "=":
+ case "(":
+ case ")":
+ case ",":
+ case ".":
+ case "*":
+ case "~":
+ case "!":
+ case "&":
+ case "|":
+ case "%":
+ case "+":
+ case "-":
+ case "/":
+ case "<":
+ case ">":
+ case "<=":
+ case ">=":
+ case "==":
+ case "!=":
+ case "&&":
+ case "||":
+ case "^":
+ case "?":
+ case ":":
+ case "::":
+ case "<<":
+ case ">>":
+ case ">>>":
+ case "+=":
+ case "-=":
+ case "*=":
+ case "/=":
+ case "%=":
+ case "^=":
+ case "&=":
+ case ";":
+ return false;
+ default:
+ return true;
+ }
+ }
+ */
+
}
PARSER_END(SpecParser)
-<*> SKIP :
+<IN_POTENTIAL_SPEC, IN_SPEC> SKIP :
{
" "
|
"/*": IN_COMMENT
}
+<DEFAULT> TOKEN: {
+ <ANY: ~[]>
+}
+
<*> SKIP : {
// "//" comment for the specification
<"//" (~["\n", "\r"])* (["\n", "\r"])>
<COMMIT_POINT_DEFINE_CHECK: "@Commit_point_define_check:">
|
<COMMIT_POINT_DEFINE: "@Commit_point_define:">
+|
+ <COMMIT_POINT_CLEAR: "@Commit_point_clear:">
|
<POTENTIAL_COMMIT_POINT_LABEL: "@Potential_commit_point_label:">
}
-<IN_SPEC, DEFAULT> TOKEN :
+<IN_SPEC> TOKEN :
{
/* Specification & C/C++ shared tokens */
// Reserved keywords
<INLINE: "inline">
|
<STATIC: "static">
+|
+ <FOR: "for">
|
<#DIGIT: ["0"-"9"]>
|
|
/* C/C++ only token*/
<DOT: ".">
+|
+ <DOLLAR: "$">
|
<STAR: "*">
|
<OR_EQUALS: "|=">
|
<AND_EQUALS: "&=">
-
|
<SEMI_COLON: ";">
|
}
{
{ type = ""; }
- ("const"
+ (<CONST>
{ type = "const"; }
)?
(((str = <STRUCT>.image | str = <CLASS>.image | str = <UNSIGNED>.image) { type = type + " " + str; })?
type = name.fullName;
})
)
- ((str = "const".image {
+ ((str = <CONST>.image {
if (!type.equals(""))
type = type + " " + str;
else
}
}
-void Test() :
-{
- String str;
- FunctionHeader func;
-}
-{
- /*
- str = Type()
- {
- System.out.println(str);
- }
- */
- func = FuncDecl()
- {
- System.out.println(func);
- }
-
-}
String ParameterizedName() :
{
}
{
(str = <IDENTIFIER>.image {res = str;})
- ("<" str = Type() { res = res + "<" + str; }
- ("," str = Type() { res = res + ", " + str; })* ">"
+ (<OPEN_BRACKET> str = Type() { res = res + "<" + str; }
+ (<COMMA> str = Type() { res = res + ", " + str; })* <CLOSE_BRACKET>
{ res = res + ">"; }
)?
{
}
}
-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);})
+ <OPEN_BRACKET>
+ (type = <IDENTIFIER>.image
+ name = <IDENTIFIER>.image
+ {
+ params.add(new VariableDeclaration(type, name));
+ }
+ )
- ("," str = <IDENTIFIER>.image
- str = <IDENTIFIER>.image {params.add(str);})*
- ">"
+ (<COMMA> type = <IDENTIFIER>.image
+ name = <IDENTIFIER>.image
+ {
+ params.add(new VariableDeclaration(type, name));
+ }
+ )*
+ <CLOSE_BRACKET>
{
//System.out.println(params);
return params;
{
typeParams = new ArrayList<VariableDeclaration >();
}
- "("
+ <OPEN_PAREN>
((varDecl = TypeParam() {typeParams.add(varDecl);})
((<COMMA> varDecl = TypeParam() {typeParams.add(varDecl);}))*)?
- ")"
+ <CLOSE_PAREN>
{
return typeParams;
}
}
}
+
+
ArrayList<String> C_CPP_CODE(ArrayList<String> headers) :
{
String text;
Token t;
boolean newLine = false;
+ boolean newSpace = true;
boolean inTemplate = false;
+ boolean inForLoop = false;
ArrayList<String> content;
String header;
}
t = <CONST> | t = <STRUCT> | t = <CLASS> | t = <UNSIGNED> |
(t = <TEMPLATE> { inTemplate = true; })|
t = <STATIC> | t = <INLINE> |
+ (t = <FOR> { inForLoop = true; })|
(t = <INCLUDE>
{
header = t.image;
})
| t = <IDENTIFIER> | t = <POUND> |
(t = <OPEN_BRACE> { newLine = true; } ) |
- (t = <CLOSE_BRACE> { newLine = true; } ) |
+ (t = <CLOSE_BRACE> { newLine = true; inForLoop = false;} ) |
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 = <EXCLAMATION> | t = <AND> | t = <OR> | t = <MOD> | t = <PLUS> |
+ t = <DOT> | t = <STAR> | t = <DOLLAR> | 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> { if (inTemplate) newLine = true; }) |
t = <OR_EQUALS> |
t = <AND_EQUALS> |
- (t = <SEMI_COLON> { newLine = true; } )
+ (t = <SEMI_COLON> { if (!inForLoop) newLine = true; } )
| t = <STRING_LITERAL> | t = <CHARACTER_LITERAL> |
t = <INTEGER_LITERAL> | t = <FLOATING_POINT_LITERAL> |
(t = <DEFINE> { newLine = true; } )
{
if (text.equals("")) {
text = t.image;
+ newSpace = true;
} else {
text = text + " " + t.image;
+ /*
+ if (newSpace && spaceSeparator(t)) {
+ text = text + " " + t.image;
+ } else {
+ text = text + t.image;
+ if (spaceSeparator(t))
+ newSpace = true;
+ }*/
}
if (newLine) {
content.add(text);
void Parse(File f, ArrayList<String> content, ArrayList<Construct> constructs, ArrayList<String> headers) :
{
Construct inst;
- ArrayList<String> code;
+ StringBuilder sb;
+ boolean flushSB;
}
{
{
_file = f;
_content = content;
_constructs = constructs;
+ sb = new StringBuilder();
+ }
+ (
+ (inst = ParseSpec()
+ {
+ _constructs.add(inst);
+ }
+ ) |
+ //((code = C_CPP_CODE(headers)) { _content.addAll(code); })
+ (
+ flushSB = OriginalCode(sb)
+ {
+ if (flushSB) {
+ sb = new StringBuilder();
+ }
+ }
+ )
+ )*
+ // For the last piece of code
+ {
+ _content.add(sb.toString());
+ }
+ <EOF>
+}
+
+// If true, there's a new line and sb should be flushed
+boolean OriginalCode(StringBuilder sb) :
+{
+ String str;
+}
+{
+ str = <ANY>.image
+ {
+ if (!str.equals("\n")) {
+ sb.append(str);
+ return false;
+ } else {
+ _content.add(sb.toString());
+ return true;
+ }
}
- ((inst = ParseSpec() { _constructs.add(inst); }) |
- ((code = C_CPP_CODE(headers)) { _content.addAll(code); })
- )* <EOF>
}
Construct ParseSpec() :
LOOKAHEAD(2) res = Potential_commit_point_define() |
LOOKAHEAD(2) res = Commit_point_define() |
LOOKAHEAD(2) res = Commit_point_define_check() |
+ LOOKAHEAD(2) res = Commit_point_clear() |
LOOKAHEAD(2) res = Entry_point() |
LOOKAHEAD(2) res = Class_begin() |
LOOKAHEAD(2) res = Class_end() |
<GLOBAL_DEFINE>
(<DECLARE_STRUCT> (declareStruct = C_CPP_CODE(null) {
declareStructs.add(declareStruct); }))*
- (<DECLARE_VAR> ((declareVar = TypeParam() ";" {
+ (<DECLARE_VAR> ((declareVar = TypeParam() <SEMI_COLON> {
declareVars.add(declareVar); } )*))?
(<INIT_VAR> (code = C_CPP_CODE(null) { initVar = code; } ))?
(<DEFINE_FUNC> (defineFunc = C_CPP_CODE(null) { defineFuncs.add(defineFunc); }))*
}
}
+CPClearConstruct Commit_point_clear() :
+{
+ CPClearConstruct res;
+ String label, condition;
+ ArrayList<String> content;
+}
+{
+
+ { res = null; }
+ <BEGIN>
+ <COMMIT_POINT_CLEAR> (content = C_CPP_CODE(null) { condition = stringArray2String(content); })
+ <LABEL> (label = <IDENTIFIER>.image)
+ <END>
+ {
+ res = new CPClearConstruct(_file, _content.size(), label, condition);
+ return res;
+ }
+}
+
CPDefineCheckConstruct Commit_point_define_check() :
{