From 93ca3ced4a081ed5946f44d93e9c1813667ad75c Mon Sep 17 00:00:00 2001 From: Johannes Mey <johannes.mey@tu-dresden.de> Date: Wed, 17 Nov 2021 01:01:30 +0100 Subject: [PATCH] move from island to full parsing --- src/main/grammar/Aspect.bnf | 186 ++++++++++++------ src/main/grammar/Aspect.flex | 140 +++++-------- .../tooling/aspect/JavaLanguageInjector.java | 15 +- 3 files changed, 185 insertions(+), 156 deletions(-) diff --git a/src/main/grammar/Aspect.bnf b/src/main/grammar/Aspect.bnf index 45f4a3c..f978dde 100644 --- a/src/main/grammar/Aspect.bnf +++ b/src/main/grammar/Aspect.bnf @@ -50,7 +50,7 @@ import_declaration ::= IMPORT STATIC? name_name (DOT STAR)? SEMICOLON modifiers ::= (PUBLIC | STATIC | PROTECTED | PRIVATE | FINAL | ABSTRACT | SYNCHRONIZED | NATIVE | TRANSIENT | VOLATILE | STRICTFP)* -type_declaration ::= SEMICOLON | (modifiers ( class_declaration | interface_declaration | enum_declaration | annotation_type_declaration | aspect_declaration ) ) +type_declaration ::= SEMICOLON | (modifiers ( class_declaration | interface_declaration | unmodified_enum_declaration | annotation_type_declaration | aspect_declaration ) ) aspect_declaration ::= ASPECT IDENTIFIER aspect_body @@ -77,12 +77,17 @@ aspect_body_declaration ::= ( aspect_refine_inh_equation | aspect_field_declaration | aspect_cache_declaration ) +// aspect_body_declarations_eof omitted because they cannot be parsed + +// simplified, because syntax is exactly the same as normal class declaration aspect_class_declaration ::= modifiers class_declaration { implements="org.jastadd.tooling.aspect.psi.JastAddAspectJavaExtension" extends="org.jastadd.tooling.aspect.psi.impl.JastAddAspectJavaImplExtension" } +// aspect_class_body unused + aspect_interface_declaration ::= modifiers INTERFACE IDENTIFIER type_parameters? (EXTENDS type_name_list)? LBRACE aspect_interface_member_declaration* RBRACE aspect_interface_member_declaration ::= ( aspect_nested_class_declaration @@ -92,13 +97,13 @@ aspect_interface_member_declaration ::= ( aspect_nested_class_declaration | aspect_interface_method_declaration | aspect_interface_field_declaration ) -aspect_interface_syn_attribute_declaration ::= annotation* SYN LAZY? FINAL? aspect_type attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)* )? RPAREN (CIRCULAR expression_in_brackets)? SEMICOLON +aspect_interface_syn_attribute_declaration ::= annotation* SYN LAZY? FINAL? aspect_type attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)* )? RPAREN (CIRCULAR LBRACKET expression RBRACKET)? SEMICOLON { implements="org.jastadd.tooling.aspect.psi.JastAddAspectAttribute" extends="org.jastadd.tooling.aspect.psi.impl.JastAddAspectSynAttributeImpl" } -aspect_interface_inh_attribute_declaration ::= annotation* INH LAZY? FINAL? aspect_type attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)* )? RPAREN (CIRCULAR expression_in_brackets)? SEMICOLON +aspect_interface_inh_attribute_declaration ::= annotation* INH LAZY? FINAL? aspect_type attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)* )? RPAREN (CIRCULAR LBRACKET expression RBRACKET)? SEMICOLON { implements="org.jastadd.tooling.aspect.psi.JastAddAspectAttribute" extends="org.jastadd.tooling.aspect.psi.impl.JastAddAspectInhAttributeImpl" @@ -108,8 +113,10 @@ aspect_interface_method_declaration ::= (PUBLIC | PROTECTED | PRIVATE | STATIC | aspect_interface_field_declaration ::= modifiers aspect_type variable_declarator (COMMA variable_declarator)* SEMICOLON +// TODO check if simplification is okay aspect_nested_interface_declaration ::= modifiers interface_declaration +// TODO check if simplification is okay aspect_nested_class_declaration ::= modifiers class_declaration aspect_method_declaration ::= modifiers type_parameters? aspect_result_type IDENTIFIER DOT method_declarator (THROWS name_list)? (block | SEMICOLON) @@ -122,13 +129,13 @@ 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 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 LBRACKET expression RBRACKET)? ( ASSIGN expression SEMICOLON | block | SEMICOLON ) { implements="org.jastadd.tooling.aspect.psi.JastAddAspectAttribute" extends="org.jastadd.tooling.aspect.psi.impl.JastAddAspectSynAttributeImpl" } -aspect_inh_attribute_declaration ::= annotation* INH NTA? LAZY? FINAL? aspect_type IDENTIFIER DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)* )? RPAREN (CIRCULAR expression_in_brackets)? SEMICOLON +aspect_inh_attribute_declaration ::= annotation* INH NTA? LAZY? FINAL? aspect_type IDENTIFIER DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)* )? RPAREN (CIRCULAR LBRACKET expression RBRACKET)? SEMICOLON { implements="org.jastadd.tooling.aspect.psi.JastAddAspectAttribute" extends="org.jastadd.tooling.aspect.psi.impl.JastAddAspectInhAttributeImpl" @@ -145,7 +152,7 @@ aspect_inh_equation ::= annotation* EQUATION IDENTIFIER DOT IDENTIFIER LPAREN (I 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 SEMICOLON | block) -collection_attribute ::= annotation* COLL aspect_type IDENTIFIER DOT attribute_name LPAREN RPAREN CIRCULAR? (expression_in_brackets)? (WITH IDENTIFIER)? (ROOT IDENTIFIER)? SEMICOLON +collection_attribute ::= annotation* COLL aspect_type IDENTIFIER DOT attribute_name LPAREN RPAREN CIRCULAR? (LBRACKET expression RBRACKET)? (WITH IDENTIFIER)? (ROOT IDENTIFIER)? SEMICOLON { implements="org.jastadd.tooling.aspect.psi.JastAddAspectAttribute" extends="org.jastadd.tooling.aspect.psi.impl.JastAddAspectCollAttributeImpl" @@ -153,40 +160,70 @@ collection_attribute ::= annotation* COLL aspect_type IDENTIFIER DOT attribute_n collection_contribution ::= annotation* IDENTIFIER 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 +aspect_add_interface ::= IDENTIFIER IMPLEMENTS type_name_list SEMICOLON aspect_extend_interface ::= IDENTIFIER EXTENDS type_name_list SEMICOLON -// added +class_declaration ::= CLASS IDENTIFIER type_parameters? (EXTENDS class_or_interface_type)? (implements type_name_list)? class_body type_name_list ::= class_or_interface_type (COMMA class_or_interface_type)* -attribute_name ::= IDENTIFIER +unmodified_class_declaration ::= CLASS IDENTIFIER type_parameters? (EXTENDS class_or_interface_type)? (IMPLEMENTS type_name_list)? class_body -// TODO | UnmodifiedClassDeclaration("") -block_statement ::= (FINAL? type java_identifier local_variable_declaration SEMICOLON) | statement +// TODO check simplification +aspect_enum_declaration ::= modifiers ENUM IDENTIFIER (IMPLEMENTS type_name_list)? enum_body -aspect_cache_declaration ::= (CACHE | UNCACHE) IDENTIFIER DOT attribute_name LPAREN (type IDENTIFIER? (type IDENTIFIER?)* )? RPAREN SEMICOLON +unmodified_enum_declaration ::= ENUM java_identifier (IMPLEMENTS type_name_list)? enum_body -java_identifier ::= IDENTIFIER | INH | SYN | LAZY | REWRITE | TO | WHEN | ASPECT | EQUATION | CIRCULAR | REFINE | COLL | CONTRIBUTES | EACH | NTA | CACHE | UNCACHE +enum_body ::= LBRACE enum_constant (COMMA enum_constant)* (SEMICOLON class_body_declaration*)? RBRACE -// Attribute type names can not start with JastAdd reserved words such as 'syn', 'eq', etc. -aspect_type ::= aspect_reference_type | ( primitive_type (LBRACKET RBRACKET)? ) +enum_constant ::= java_identifier arguments? class_body? -formal_parameters ::= LPAREN ( formal_parameter ( COMMA formal_parameter )* )? RPAREN + type_parameters ::= LT type_parameter (COMMA type_parameter)* GT -formal_parameter ::= FINAL? type DOTS? variable_declarator_id + type_parameter ::= java_identifier type_bound? -variable_declarator_id ::= java_identifier ( LBRACKET RBRACKET )* + type_bound ::= EXTENDS class_or_interface_type (AMPERSAND class_or_interface_type)* -aspect_enum_declaration ::= modifiers enum_declaration +class_body ::= LBRACE class_body_declaration* RBRACE + +class_body_declaration ::= initializer | modifiers ( unmodified_class_declaration | unmodified_interface_declaration | annotation_type_declaration | unmodified_enum_declaration | constructor_declaration | field_declaration | method_declaration ) | SEMICOLON + +interface_declaration ::= unmodified_interface_declaration + +unmodified_interface_declaration ::= INTERFACE IDENTIFIER type_parameters? (EXTENDS type_name_list)? LBRACE interface_member_declaration RBRACE + +interface_member_declaration ::= modifiers (unmodified_class_declaration | unmodified_interface_declaration | field_declaration | method_declaration) | SEMICOLON + +field_declaration ::= aspect_type variable_declarator (COMMA variable_declarator)* SEMICOLON variable_declarator ::= variable_declarator_id ( ASSIGN variable_initializer )? +variable_declarator_id ::= java_identifier ( LBRACKET RBRACKET )* + variable_initializer ::= array_initializer | expression array_initializer ::= LBRACE ( variable_initializer (COMMA variable_initializer)* )? RBRACE +method_declaration ::= type_parameters? aspect_result_type method_declarator (THROWS name_list)? (block | SEMICOLON) + +method_declarator ::= java_identifier formal_parameters (LBRACKET RBRACKET)* + +formal_parameters ::= LPAREN ( formal_parameter ( COMMA formal_parameter )* )? RPAREN + +formal_parameter ::= FINAL? type DOTS? variable_declarator_id + +constructor_declaration ::= type_parameters? java_identifier formal_parameters (THROWS name_list)? LBRACE explicit_constructor_invocation? block_statement* RBRACE + +explicit_constructor_invocation ::= (THIS | SUPER) arguments SEMICOLON + +initializer ::= STATIC? block + +// Attribute type names can not start with JastAdd reserved words such as 'syn', 'eq', etc. +aspect_type ::= aspect_reference_type | ( primitive_type (LBRACKET RBRACKET)? ) + +aspect_result_type ::= VOID | aspect_type + aspect_reference_type ::= aspect_class_or_interface_type (LBRACKET RBRACKET)* aspect_class_or_interface_type ::= IDENTIFIER type_arguments? (DOT java_identifier type_arguments? )* @@ -257,7 +294,9 @@ 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 +// member_selector unused! + +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 @@ -283,64 +322,99 @@ typed_lambda_parameter ::= type name_name (COMMA type name_name)* untyped_lambda_parameter ::= name_name (COMMA name_name)* +statement ::= labeled_statement | assert_statement | block | empty_statement | statement_expression SEMICOLON | switch_statement | if_statement | while_statement | do_statement | for_statement | break_statement | continue_statement | return_statement | throw_statement | synchronized_statement | try_statement + +assert_statement ::= ASSERT expression ( COLON expression )? SEMICOLON + +labeled_statement ::= java_identifier COLON statement + +block ::= LBRACE block_statement* RBRACE +{ + implements="org.jastadd.tooling.aspect.psi.JastAddAspectJavaExtension" + extends="org.jastadd.tooling.aspect.psi.impl.JastAddAspectJavaImplExtension" +} + +// TODO | UnmodifiedClassDeclaration("") +block_statement ::= (local_variable_declaration SEMICOLON) | statement + local_variable_declaration ::= FINAL? type variable_declarator (COMMA variable_declarator)* -type_parameters ::= LT type_parameter (COMMA type_parameter)* GT +empty_statement ::= SEMICOLON -type_parameter ::= java_identifier type_bound? +statement_expression ::= pre_increment_expression | pre_decrement_expression | ( primary_expression ( INCR | DECR | assignment_operator expression )? ) -type_bound ::= EXTENDS class_or_interface_type (AMPERSAND class_or_interface_type)* +switch_statement ::= SWITCH LPAREN expression RPAREN LBRACE ( switch_label block_statement* )* RBRACE -aspect_result_type ::= VOID | aspect_type +switch_label ::= CASE expression COLON | DEFAULT COLON -method_declarator ::= java_identifier formal_parameters (LBRACKET RBRACKET)* +if_statement ::= IF LPAREN expression RPAREN statement ( ELSE statement )? + +while_statement ::= WHILE LPAREN expression RPAREN statement + +do_statement ::= DO statement WHILE LPAREN expression RPAREN SEMICOLON + +for_statement ::= FOR LPAREN ( type java_identifier COLON expression | for_init? SEMICOLON expression? SEMICOLON for_update? ) RPAREN statement + +for_init ::= local_variable_declaration | statement_expression_list + +statement_expression_list ::= statement_expression ( COMMA statement_expression )* + +for_update ::= statement_expression_list + +break_statement ::= BREAK java_identifier? SEMICOLON + +continue_statement ::= CONTINUE java_identifier? SEMICOLON + +return_statement ::= RETURN expression? SEMICOLON + +throw_statement ::= THROW expression SEMICOLON + +synchronized_statement ::= SYNCHRONIZED LPAREN expression RPAREN block + +try_statement ::= TRY ( LPAREN local_variable_declaration ( SEMICOLON local_variable_declaration )* SEMICOLON? RPAREN )? block ( CATCH LPAREN FINAL? type ( BIT_OR FINAL type )* variable_declarator_id RPAREN block )* ( FINALLY block )? // TODO maybe change order! annotation ::= ( normal_annotation | single_member_annotation | marker_annotation ) +normal_annotation ::= AT name LPAREN member_value_pairs? RPAREN +marker_annotation ::= AT name +single_member_annotation ::= AT name LPAREN member_value RPAREN +member_value_pairs ::= member_value_pair (COMMA member_value_pair)* +member_value_pair ::= java_identifier ASSIGN member_value -// island things +member_value ::= annotation | member_value_array_initializer | conditional_expression -//class_body_declaration_in_paren ::= JAVA_IN_PAREN -//{ -// implements="org.jastadd.tooling.aspect.psi.JastAddAspectJavaExtension" -// extends="org.jastadd.tooling.aspect.psi.impl.JastAddAspectJavaImplExtension" -//} +member_value_array_initializer ::= LBRACE member_value ( COMMA member_value )* COMMA? RBRACE -// should be parsed after circular and in collection attributes -expression_in_brackets ::= LBRACKET_ANYTHING_RBRACKET // LBRACKET expression RBRACKET -{ - implements="org.jastadd.tooling.aspect.psi.JastAddAspectJavaExtension" - extends="org.jastadd.tooling.aspect.psi.impl.JastAddAspectJavaImplExtension" -} +annotation_type_declaration ::= AT INTERFACE java_identifier annotation_type_body -// at symbol only in these rules -marker_annotation ::= AT_NAME -normal_annotation ::= AT_NAME_LPAREN_ANYTHING_RPAREN // TODO! -single_member_annotation ::= AT_NAME_LPAREN_ANYTHING_RPAREN // TODO! -annotation_type_declaration ::= AT_INTERFACE_ANYTHING_LBRACE_ANYTHING_RBRACE // AT INTERFACE java_indentifier LBRACE annotation_type_member_declaration RBRACE +annotation_type_body ::= LBRACE annotation_type_member_declaration* RBRACE +annotation_type_member_declaration ::= ( modifiers (aspect_type java_identifier LPAREN RPAREN default_value? SEMICOLON | unmodified_class_declaration | unmodified_interface_declaration | unmodified_enum_declaration | annotation_type_declaration | field_declaration ) ) | SEMICOLON -// previous token must not be DOT! -class_declaration ::= CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE // CLASS IDENTIFIER (EXTENDS class_or_type_interface)? (implements type_name_list)? LBRACE class_body_declaration RBRACE +default_value ::= DEFAULT member_value -// must not be directly in an aspect, but can be in a class or interface (or enum?) in an aspect -interface_declaration ::= INTERFACE_ANYTHING_LBRACE_ANYTHING_RBRACE // INTERFACE java_indentifier LBRACE interface_member_declaration RBRACE +aspect_cache_declaration ::= (CACHE | UNCACHE) IDENTIFIER DOT attribute_name LPAREN (type IDENTIFIER? (type IDENTIFIER?)* )? RPAREN SEMICOLON -// can be anywhere -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 +java_identifier ::= IDENTIFIER | INH | SYN | LAZY | REWRITE | TO | WHEN | ASPECT | EQUATION | CIRCULAR | REFINE | COLL | CONTRIBUTES | EACH | NTA | CACHE | UNCACHE -// only within attribute equations -block ::= LBRACE_ANYTHING_RBRACE -{ - implements="org.jastadd.tooling.aspect.psi.JastAddAspectJavaExtension" - extends="org.jastadd.tooling.aspect.psi.impl.JastAddAspectJavaImplExtension" -} +attribute_name ::= IDENTIFIER + +// EOF + +// unused keywords + +unused_keywords ::= GOTO | CONST ELLIPSIS | PACKAGE -// TODO unsupported +// island things -class_body ::= CLASS_BODY_UNSUPPORTED +//// should be parsed after circular and in collection attributes +//expression_in_brackets ::= LBRACKET_ANYTHING_RBRACKET // LBRACKET expression RBRACKET +//{ +// implements="org.jastadd.tooling.aspect.psi.JastAddAspectJavaExtension" +// extends="org.jastadd.tooling.aspect.psi.impl.JastAddAspectJavaImplExtension" +//} diff --git a/src/main/grammar/Aspect.flex b/src/main/grammar/Aspect.flex index a99a55c..46713fa 100644 --- a/src/main/grammar/Aspect.flex +++ b/src/main/grammar/Aspect.flex @@ -17,6 +17,19 @@ import com.intellij.psi.TokenType; %{ private int counter = 0; + private int totalBraceLevel = 0; + private java.util.Stack<Integer> modeStack = new java.util.Stack<>(); + + private void enterState(int state) { + System.out.println("in state" + yystate() + ", entering state " + state); + modeStack.push(yystate()); + yybegin(state); + } + + private void exitState() { + System.out.println("in state" + yystate() + ", exiting to state " + modeStack.peek()); + yybegin(modeStack.pop()); + } %} WhiteSpace = [ \t\n\r\f] @@ -47,91 +60,44 @@ StringLiteral = \" ( [^\"\\\n\r] | ( \\ ( [ntbrf\\'\"] | [0-7][0-7?] | [0 Identifier = [:jletter:] [:jletterdigit:]* -%state JASTADD -%state EXPECT_CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE -%state CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE -%state LBRACE_ANYTHING_RBRACE -%state LBRACKET_ANYTHING_RBRACKET -%state JAVA_IN_PAREN +%state IN_ASPECT %state COLLECTION_DECL %state ATTRIBUTE_DEFINITION -%state LPAREN_ANYTHING_RPAREN %% -<YYINITIAL,COLLECTION_DECL,ATTRIBUTE_DEFINITION> { +<YYINITIAL,IN_ASPECT,COLLECTION_DECL,ATTRIBUTE_DEFINITION> { {WhiteSpace}+ { return TokenType.WHITE_SPACE; } {SingleLineComment} { return AspectTypes.SINGLE_LINE_COMMENT; } {FormalComment} { return AspectTypes.FORMAL_COMMENT; } {MultiLineComment} { return AspectTypes.MULTI_LINE_COMMENT; } -// "EQ" { yybegin(YYINITIAL); return AspectTypes.EQ; } -// "{" { yybegin(JAVA); counter = 1; } - "class" { yybegin(EXPECT_CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE); } } -<EXPECT_CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE> { - "{" { yybegin(CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE); counter = 1; } - {NotBrace} {} // skip over everything -} - -<CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE> { - {SingleLineComment} {} - {FormalComment} {} - {MultiLineComment} {} - {CharacterLiteral} {} - {StringLiteral} {} - "{" { counter++; } - "}" { counter--; if (counter==0) { yybegin(YYINITIAL); return AspectTypes.CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE; } } - {NotBrace} {} -} - -<LBRACE_ANYTHING_RBRACE> { - {SingleLineComment} {} - {FormalComment} {} - {MultiLineComment} {} - {CharacterLiteral} {} - {StringLiteral} {} - "{" { counter++; } - "}" { counter--; if (counter==0) { yybegin(YYINITIAL); return AspectTypes.LBRACE_ANYTHING_RBRACE; } } - {NotBrace} {} -} - -<LBRACKET_ANYTHING_RBRACKET> { - {SingleLineComment} {} - {FormalComment} {} - {MultiLineComment} {} - {CharacterLiteral} {} - {StringLiteral} {} - "[" { counter++; System.out.println("<INC>"); } - "]" { System.out.println("<DEC>"); counter--; if (counter==0) { System.out.println("<EXIT>"); yybegin(COLLECTION_DECL); return AspectTypes.LBRACKET_ANYTHING_RBRACKET; } } - {NotBracket} {System.out.println("<NB>" + yytext());} -} - -<YYINITIAL,COLLECTION_DECL,ATTRIBUTE_DEFINITION> { +<YYINITIAL,IN_ASPECT,COLLECTION_DECL,ATTRIBUTE_DEFINITION> { "abstract" { return AspectTypes.ABSTRACT; } -//"assert" { return AspectTypes.ASSERT; } + "assert" { return AspectTypes.ASSERT; } "boolean" { return AspectTypes.BOOLEAN; } -//"break" { return AspectTypes.BREAK; } + "break" { return AspectTypes.BREAK; } "byte" { return AspectTypes.BYTE; } -//"case" { return AspectTypes.CASE; } -//"catch" { return AspectTypes.CATCH; } + "case" { return AspectTypes.CASE; } + "catch" { return AspectTypes.CATCH; } "char" { return AspectTypes.CHAR; } -//"class" { return AspectTypes.CLASS; } -//"const" { return AspectTypes.CONST; } -//"continue" { return AspectTypes.CONTINUE; } -//"default" { return AspectTypes._DEFAULT; } -//"do" { return AspectTypes.DO; } + "class" { return AspectTypes.CLASS; } + "const" { return AspectTypes.CONST; } + "continue" { return AspectTypes.CONTINUE; } + "default" { return AspectTypes.DEFAULT; } + "do" { return AspectTypes.DO; } "double" { return AspectTypes.DOUBLE; } -//"else" { return AspectTypes.ELSE; } -//"enum" { return AspectTypes.ENUM; } + "else" { return AspectTypes.ELSE; } + "enum" { return AspectTypes.ENUM; } "extends" { return AspectTypes.EXTENDS; } "false" { return AspectTypes.FALSE; } "final" { return AspectTypes.FINAL; } -//"finally" { return AspectTypes.FINALLY; } + "finally" { return AspectTypes.FINALLY; } "float" { return AspectTypes.FLOAT; } "for" { return AspectTypes.FOR; } -//"goto" { return AspectTypes.GOTO; } -//"if" { return AspectTypes.IF; } + "goto" { return AspectTypes.GOTO; } + "if" { return AspectTypes.IF; } "implements" { return AspectTypes.IMPLEMENTS; } "import" { return AspectTypes.IMPORT; } "instanceof" { return AspectTypes.INSTANCEOF; } @@ -141,36 +107,39 @@ Identifier = [:jletter:] [:jletterdigit:]* "native" { return AspectTypes.NATIVE; } "new" { return AspectTypes.NEW; } "null" { return AspectTypes.NULL; } -//"package" { return AspectTypes.PACKAGE; } + "package" { return AspectTypes.PACKAGE; } "private" { return AspectTypes.PRIVATE; } "protected" { return AspectTypes.PROTECTED; } "public" { return AspectTypes.PUBLIC; } -//"return" { return AspectTypes.RETURN; } + "return" { return AspectTypes.RETURN; } "short" { return AspectTypes.SHORT; } "static" { return AspectTypes.STATIC; } "strictfp" { return AspectTypes.STRICTFP; } "super" { return AspectTypes.SUPER; } -//"switch" { return AspectTypes.SWITCH; } + "switch" { return AspectTypes.SWITCH; } "synchronized" { return AspectTypes.SYNCHRONIZED; } "this" { return AspectTypes.THIS; } -//"throw" { return AspectTypes.THROW; } + "throw" { return AspectTypes.THROW; } "throws" { return AspectTypes.THROWS; } "transient" { return AspectTypes.TRANSIENT; } "true" { return AspectTypes.TRUE; } -//"try" { return AspectTypes.TRY; } + "try" { return AspectTypes.TRY; } "void" { return AspectTypes.VOID; } "volatile" { return AspectTypes.VOLATILE; } -//"while" { return AspectTypes.WHILE; } + "while" { return AspectTypes.WHILE; } + + // the only jastadd-specific keyword here is aspect + "aspect" { enterState(IN_ASPECT); return AspectTypes.ASPECT; } +} - // JastAdd - "inh" { yybegin(ATTRIBUTE_DEFINITION); return AspectTypes.INH; } - "syn" { yybegin(ATTRIBUTE_DEFINITION); return AspectTypes.SYN; } +<IN_ASPECT,COLLECTION_DECL,ATTRIBUTE_DEFINITION> { + "inh" { enterState(ATTRIBUTE_DEFINITION); return AspectTypes.INH; } + "syn" { enterState(ATTRIBUTE_DEFINITION); return AspectTypes.SYN; } "lazy" { return AspectTypes.LAZY; } "rewrite" { return AspectTypes.REWRITE; } "to" { return AspectTypes.TO; } "when" { return AspectTypes.WHEN; } - "aspect" { return AspectTypes.ASPECT; } - "eq" { yybegin(ATTRIBUTE_DEFINITION); return AspectTypes.EQUATION; } + "eq" { enterState(ATTRIBUTE_DEFINITION); return AspectTypes.EQUATION; } "circular" { return AspectTypes.CIRCULAR; } "refine" { return AspectTypes.REFINE; } "contributes" { return AspectTypes.CONTRIBUTES; } @@ -180,26 +149,26 @@ Identifier = [:jletter:] [:jletterdigit:]* "uncache" { return AspectTypes.UNCACHE; } // TODO this is strangely split in another Token block, check semantics of JJTree file! - "coll" { yybegin(COLLECTION_DECL); return AspectTypes.COLL; } + "coll" { enterState(COLLECTION_DECL); return AspectTypes.COLL; } } <COLLECTION_DECL> { "with" { return AspectTypes.WITH; } "root" { return AspectTypes.ROOT; } - "[" { yybegin(LBRACKET_ANYTHING_RBRACKET); System.out.println("<ENTER>"); counter = 1; } + "[" { return AspectTypes.LBRACKET; } } <ATTRIBUTE_DEFINITION> { - "{" { yybegin(LBRACE_ANYTHING_RBRACE); counter = 1; } + "{" { ++totalBraceLevel; return AspectTypes.LBRACE; } } // a semicolon exits the COLLECTION_DECL (because we ignore semicolons in expressions) <COLLECTION_DECL, ATTRIBUTE_DEFINITION> { - ";" { yybegin(YYINITIAL); return AspectTypes.SEMICOLON; } + ";" { exitState(); return AspectTypes.SEMICOLON; } } -<YYINITIAL,COLLECTION_DECL,ATTRIBUTE_DEFINITION> { +<YYINITIAL,IN_ASPECT,COLLECTION_DECL,ATTRIBUTE_DEFINITION> { // LITERALS {IntegerLiteral} { return AspectTypes.INTEGER_LITERAL; } {FloatingPointLiteral} { return AspectTypes.FLOATING_POINT_LITERAL; } @@ -209,22 +178,19 @@ Identifier = [:jletter:] [:jletterdigit:]* // IDENTIFIERS {Identifier} { return AspectTypes.IDENTIFIER; } - // COMBINED TOKENS - ".class" { return AspectTypes.DOT_CLASS; } - // SEPARATORS "(" { return AspectTypes.LPAREN; } ")" { return AspectTypes.RPAREN; } - "{" { return AspectTypes.LBRACE; } - "}" { return AspectTypes.RBRACE; } + "{" { ++totalBraceLevel; return AspectTypes.LBRACE; } + "}" { --totalBraceLevel; if (totalBraceLevel == 0) { exitState(); } return AspectTypes.RBRACE; } "[" { return AspectTypes.LBRACKET; } "]" { return AspectTypes.RBRACKET; } ";" { return AspectTypes.SEMICOLON; } "," { return AspectTypes.COMMA; } "." { return AspectTypes.DOT; } -//"@" { return AspectTypes.AT; } + "@" { return AspectTypes.AT; } // OPERATORS "=" { return AspectTypes.ASSIGN; } @@ -261,7 +227,7 @@ Identifier = [:jletter:] [:jletterdigit:]* "<<=" { return AspectTypes.LSHIFTASSIGN; } ">>=" { return AspectTypes.RSIGNEDSHIFTASSIGN; } ">>>=" { return AspectTypes.RUNSIGNEDSHIFTASSIGN; } -//"..." { return AspectTypes.ELLIPSIS; } + "..." { return AspectTypes.ELLIPSIS; } "->" { return AspectTypes.ARROW; } "::" { return AspectTypes.DOUBLECOLON; } diff --git a/src/main/java/org/jastadd/tooling/aspect/JavaLanguageInjector.java b/src/main/java/org/jastadd/tooling/aspect/JavaLanguageInjector.java index 13770ce..58036e3 100644 --- a/src/main/java/org/jastadd/tooling/aspect/JavaLanguageInjector.java +++ b/src/main/java/org/jastadd/tooling/aspect/JavaLanguageInjector.java @@ -22,22 +22,11 @@ public class JavaLanguageInjector implements LanguageInjector { @Override public void getLanguagesToInject(@NotNull PsiLanguageInjectionHost host, @NotNull InjectedLanguagePlaces injectionPlacesRegistrar) { if (host.isValidHost()) { - if (host instanceof JastAddAspectNormalAnnotation) { - // TODO - } else if (host instanceof JastAddAspectSingleMemberAnnotation) { - // TODO - } else if (host instanceof JastAddAspectInterfaceDeclaration) { - // TODO - } else if (host instanceof JastAddAspectEnumDeclaration) { - // TODO - } else if (host instanceof JastAddAspectAnnotationTypeDeclaration) { - // TODO - } else if (host instanceof JastAddAspectBlock) { + // TODO more injections + if (host instanceof JastAddAspectBlock) { injectionPlacesRegistrar.addPlace(JavaLanguage.INSTANCE, new TextRange(1, host.getTextLength() - 1), "class X { public void m() {", "}}"); } else if (host instanceof JastAddAspectExpression) { injectionPlacesRegistrar.addPlace(JavaLanguage.INSTANCE, new TextRange(0, host.getTextLength()), "class X { public void m() {Object x = ", ";}}"); - } else if (host instanceof JastAddAspectExpressionInBrackets) { - injectionPlacesRegistrar.addPlace(JavaLanguage.INSTANCE, new TextRange(1, host.getTextLength() - 1), "class X { public void m() {Object x = ", ";}}"); } else if (host instanceof JastAddAspectAspectClassDeclaration) { injectionPlacesRegistrar.addPlace(JavaLanguage.INSTANCE, new TextRange(0, host.getTextLength()), "", ""); } -- GitLab