diff --git a/src/main/grammar/JastAddAspect.bnf b/src/main/grammar/JastAddAspect.bnf index d967e0e51bf9d7992b01310ec78f7025b4b1ad3f..4fa13c65044f060688e8f338c8a259415ed8871c 100644 --- a/src/main/grammar/JastAddAspect.bnf +++ b/src/main/grammar/JastAddAspect.bnf @@ -110,23 +110,23 @@ aspect_refine_constructor_declaration ::= REFINE IDENTIFIER (PUBLIC | PROTECTED aspect_field_declaration ::= modifiers aspect_type IDENTIFIER DOT variable_declarator (COMMA variable_declarator)* SEMICOLON -aspect_syn_attribute_declaration ::= annotation* SYN NTA? LAZY? FINAL? aspect_type IDENTIFIER DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)* )? RPAREN (CIRCULAR expression_in_brackets)? ( ASSIGN JAVA_EXPRESSION SEMICOLON | block | SEMICOLON ) +aspect_syn_attribute_declaration ::= annotation* SYN NTA? LAZY? FINAL? aspect_type IDENTIFIER DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)* )? RPAREN (CIRCULAR expression_in_brackets)? ( ASSIGN expression SEMICOLON | block | SEMICOLON ) aspect_inh_attribute_declaration ::= annotation* INH NTA? LAZY? FINAL? aspect_type IDENTIFIER DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)* )? (CIRCULAR expression_in_brackets)? SEMICOLON -aspect_rewrite ::= REWRITE IDENTIFIER (IDENTIFIER DOT IDENTIFIER LPAREN RPAREN)? LBRACE ((WHEN LPAREN JAVA_EXPRESSION RPAREN)? TO aspect_type ( JAVA_EXPRESSION SEMICOLON | block ))+ RBRACE +aspect_rewrite ::= REWRITE IDENTIFIER (IDENTIFIER DOT IDENTIFIER LPAREN RPAREN)? LBRACE ((WHEN LPAREN expression RPAREN)? TO aspect_type ( expression SEMICOLON | block ))+ RBRACE -aspect_syn_equation ::= annotation* EQUATION IDENTIFIER DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)*)? RPAREN ( ASSIGN JAVA_EXPRESSION SEMICOLON | block ) +aspect_syn_equation ::= annotation* EQUATION IDENTIFIER DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)*)? RPAREN ( ASSIGN expression SEMICOLON | block ) -aspect_refine_syn_equation ::= REFINE IDENTIFIER EQUATION IDENTIFIER attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)*)? RPAREN (ASSIGN JAVA_EXPRESSION SEMICOLON | block) +aspect_refine_syn_equation ::= REFINE IDENTIFIER EQUATION IDENTIFIER attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)*)? RPAREN (ASSIGN expression SEMICOLON | block) -aspect_inh_equation ::= annotation* EQUATION IDENTIFIER DOT IDENTIFIER LPAREN (INT IDENTIFIER)? DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)*)? RPAREN (ASSIGN JAVA_EXPRESSION | block) +aspect_inh_equation ::= annotation* EQUATION IDENTIFIER DOT IDENTIFIER LPAREN (INT IDENTIFIER)? DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)*)? RPAREN (ASSIGN expression | block) -aspect_refine_inh_equation ::= REFINE IDENTIFIER EQUATION IDENTIFIER DOT IDENTIFIER LPAREN (INT IDENTIFIER)? RPAREN DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)*)? RPAREN (ASSIGN JAVA_EXPRESSION | block) +aspect_refine_inh_equation ::= REFINE IDENTIFIER EQUATION IDENTIFIER DOT IDENTIFIER LPAREN (INT IDENTIFIER)? RPAREN DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)*)? RPAREN (ASSIGN expression | block) collection_attribute ::= annotation* COLL aspect_type IDENTIFIER DOT attribute_name LPAREN RPAREN CIRCULAR? (expression_in_brackets)? (WITH IDENTIFIER)? (ROOT IDENTIFIER)? SEMICOLON -collection_contribution ::= annotation* CONTRIBUTES ( NTA JAVA_EXPRESSION TO IDENTIFIER DOT attribute_name LPAREN RPAREN | EACH? JAVA_EXPRESSION (WHEN JAVA_EXPRESSION)? TO IDENTIFIER DOT attribute_name LPAREN RPAREN (FOR EACH? JAVA_EXPRESSION)? | block TO IDENTIFIER DOT attribute_name LPAREN RPAREN ) SEMICOLON +collection_contribution ::= annotation* CONTRIBUTES ( NTA expression TO IDENTIFIER DOT attribute_name LPAREN RPAREN | EACH? expression (WHEN expression)? TO IDENTIFIER DOT attribute_name LPAREN RPAREN (FOR EACH? expression)? | block TO IDENTIFIER DOT attribute_name LPAREN RPAREN ) SEMICOLON aspect_add_interface ::= IO IMPLEMENTS type_name_list SEMICOLON @@ -228,7 +228,7 @@ cast_expression ::= LPAREN type RPAREN unary_expression_not_plus_minus primary_expression ::= primary_prefix (primary_suffix)* -primary_prefix ::= literal | THIS | (SUPER DOT java_identifier) | (LPAREN expression RPAREN) | allocation_expression | (result_type DOT CLASS) | name_name +primary_prefix ::= literal | THIS | (SUPER DOT java_identifier) | (LPAREN expression RPAREN) | allocation_expression | (result_type DOT_CLASS) | name_name primary_suffix ::= (DOT THIS) | (DOT allocation_expression) | (DOT type_arguments java_identifier) | (LBRACKET expression RBRACKET) | (DOT java_identifier) | arguments | DOUBLECOLON NEW | DOUBLECOLON java_identifier @@ -299,9 +299,10 @@ class_declaration ::= CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE // CLASS IDENTIFIER interface_declaration ::= INTERFACE_ANYTHING_LBRACE_ANYTHING_RBRACE // INTERFACE java_indentifier LBRACE interface_member_declaration RBRACE // can be anywhere -enum_declaration ::= ENUM_ANYTHING_LPAREN_ANYTHING_RPAREN // ENUM java_identifier (implements type_name_list)? LBRACE enum_constant (COMMA enum_constant)* (SEMICOLON class_body_declaration* )? RBRACE - +enum_declaration ::= ENUM_ANYTHING_LBRACE_ANYTHING_RBRACE // ENUM java_identifier (implements type_name_list)? LBRACE enum_constant (COMMA enum_constant)* (SEMICOLON class_body_declaration* )? RBRACE +// only within attribute equations +block ::= LBRACE_ANYTHING_RBRACE // TODO unsupported diff --git a/src/main/grammar/JastAddAspect.flex b/src/main/grammar/JastAddAspect.flex index 07135a56e8ba0861a53ef315c810c47862aedb76..a8b0b39c46ff8a828f81d8f7eee3b4d53130fc35 100644 --- a/src/main/grammar/JastAddAspect.flex +++ b/src/main/grammar/JastAddAspect.flex @@ -27,7 +27,7 @@ FormalComment = "/**" [^*]* [*]+([^*/][^*]*[*]+)*[/] MultiLineComment = "/*" [^*]+ [*]+([^*/][^*]*[*]+)*[/] -NotParenthesis = [^{}]+ +NotBrace = ( [^{}/]+ | [/][^{}/*] )* // from jjt DecimalLiteral = [1-9] [0-9]* @@ -47,37 +47,54 @@ StringLiteral = \" ( [^\"\\\n\r] | ( \\ ( [ntbrf\\'\"] | [0-7][0-7?] | [0 Identifier = [:jletter:] [:jletterdigit:]* %state JASTADD -%state EXPECT_JAVA_IN_PAREN +%state EXPECT_CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE +%state CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE +%state LBRACE_ANYTHING_RBRACE %state JAVA_IN_PAREN %state COLLECTION_DECL +%state ATTRIBUTE_DEFINITION +%state LPAREN_ANYTHING_RPAREN %% -<YYINITIAL> { - {WhiteSpace}+ { return TokenType.WHITE_SPACE; } - {SingleLineComment} { return JastAddAspectTypes.SINGLE_LINE_COMMENT; } - {FormalComment} { return JastAddAspectTypes.FORMAL_COMMENT; } - {MultiLineComment} { return JastAddAspectTypes.MULTI_LINE_COMMENT; } -// "EQ" { yybegin(YYINITIAL); return JastAddAspectTypes.EQ; } -// "{" { yybegin(JAVA); counter = 1; } +<YYINITIAL,COLLECTION_DECL,ATTRIBUTE_DEFINITION> { + {WhiteSpace}+ { return TokenType.WHITE_SPACE; } + {SingleLineComment} { return JastAddAspectTypes.SINGLE_LINE_COMMENT; } + {FormalComment} { return JastAddAspectTypes.FORMAL_COMMENT; } + {MultiLineComment} { return JastAddAspectTypes.MULTI_LINE_COMMENT; } +// "EQ" { yybegin(YYINITIAL); return JastAddAspectTypes.EQ; } +// "{" { yybegin(JAVA); counter = 1; } + "class" { yybegin(EXPECT_CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE); } } -<EXPECT_JAVA_IN_PAREN> { - "{" { yybegin(JAVA_IN_PAREN); counter = 1; } +<EXPECT_CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE> { + "{" { yybegin(CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE); counter = 1; } + {NotBrace} {} // skip over everything } -<JAVA_IN_PAREN> { - {SingleLineComment} {} - {FormalComment} {} - {MultiLineComment} {} - {CharacterLiteral} {} - {StringLiteral} {} - {NotParenthesis} {} - "{" { counter++; } - "}" { counter--; if (counter==0) { yybegin(YYINITIAL); return JastAddAspectTypes.JAVA_IN_PAREN; } } +<CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE> { + {SingleLineComment} {} + {FormalComment} {} + {MultiLineComment} {} + {CharacterLiteral} {} + {StringLiteral} {} + "{" { counter++; } + "}" { counter--; if (counter==0) { yybegin(YYINITIAL); return JastAddAspectTypes.CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE; } } + {NotBrace} {} } -<YYINITIAL,COLLECTION_DECL> { +<LBRACE_ANYTHING_RBRACE> { + {SingleLineComment} {} + {FormalComment} {} + {MultiLineComment} {} + {CharacterLiteral} {} + {StringLiteral} {} + "{" { counter++; } + "}" { counter--; if (counter==0) { yybegin(YYINITIAL); return JastAddAspectTypes.LBRACE_ANYTHING_RBRACE; } } + {NotBrace} {} +} + +<YYINITIAL,COLLECTION_DECL,ATTRIBUTE_DEFINITION> { "abstract" { return JastAddAspectTypes.ABSTRACT; } //"assert" { return JastAddAspectTypes.ASSERT; } "boolean" { return JastAddAspectTypes.BOOLEAN; } @@ -86,7 +103,7 @@ Identifier = [:jletter:] [:jletterdigit:]* //"case" { return JastAddAspectTypes.CASE; } //"catch" { return JastAddAspectTypes.CATCH; } "char" { return JastAddAspectTypes.CHAR; } - "class" { return JastAddAspectTypes.CLASS; } +//"class" { return JastAddAspectTypes.CLASS; } //"const" { return JastAddAspectTypes.CONST; } //"continue" { return JastAddAspectTypes.CONTINUE; } //"default" { return JastAddAspectTypes._DEFAULT; } @@ -133,14 +150,14 @@ Identifier = [:jletter:] [:jletterdigit:]* //"while" { return JastAddAspectTypes.WHILE; } // JastAdd - "inh" { return JastAddAspectTypes.INH; } - "syn" { return JastAddAspectTypes.SYN; } + "inh" { yybegin(ATTRIBUTE_DEFINITION); return JastAddAspectTypes.INH; } + "syn" { yybegin(ATTRIBUTE_DEFINITION); return JastAddAspectTypes.SYN; } "lazy" { return JastAddAspectTypes.LAZY; } "rewrite" { return JastAddAspectTypes.REWRITE; } "to" { return JastAddAspectTypes.TO; } "when" { return JastAddAspectTypes.WHEN; } "aspect" { return JastAddAspectTypes.ASPECT; } - "eq" { return JastAddAspectTypes.EQUATION; } + "eq" { yybegin(ATTRIBUTE_DEFINITION); return JastAddAspectTypes.EQUATION; } "circular" { return JastAddAspectTypes.CIRCULAR; } "refine" { return JastAddAspectTypes.REFINE; } "contributes" { return JastAddAspectTypes.CONTRIBUTES; } @@ -159,7 +176,16 @@ Identifier = [:jletter:] [:jletterdigit:]* "root" { return JastAddAspectTypes.ROOT; } } -<YYINITIAL, COLLECTION_DECL> { +<ATTRIBUTE_DEFINITION> { + "{" { yybegin(LBRACE_ANYTHING_RBRACE); counter = 1; } +} + +// a semicolon exits the COLLECTION_DECL (because we ignore semicolons in expressions) +<COLLECTION_DECL, ATTRIBUTE_DEFINITION> { + ";" { yybegin(YYINITIAL); return JastAddAspectTypes.SEMICOLON; } +} + +<YYINITIAL,COLLECTION_DECL,ATTRIBUTE_DEFINITION> { // LITERALS {IntegerLiteral} { return JastAddAspectTypes.INTEGER_LITERAL; } {FloatingPointLiteral} { return JastAddAspectTypes.FLOATING_POINT_LITERAL; } @@ -169,17 +195,22 @@ Identifier = [:jletter:] [:jletterdigit:]* // IDENTIFIERS {Identifier} { return JastAddAspectTypes.IDENTIFIER; } + // COMBINED TOKENS + ".class" { return JastAddAspectTypes.DOT_CLASS; } + // SEPARATORS + "(" { return JastAddAspectTypes.LPAREN; } ")" { return JastAddAspectTypes.RPAREN; } "{" { return JastAddAspectTypes.LBRACE; } "}" { return JastAddAspectTypes.RBRACE; } "[" { return JastAddAspectTypes.LBRACKET; } "]" { return JastAddAspectTypes.RBRACKET; } + ";" { return JastAddAspectTypes.SEMICOLON; } "," { return JastAddAspectTypes.COMMA; } "." { return JastAddAspectTypes.DOT; } - "@" { return JastAddAspectTypes.AT; } +//"@" { return JastAddAspectTypes.AT; } // OPERATORS "=" { return JastAddAspectTypes.ASSIGN; }