From 191eb4ff08c73d4c8403c2633918cf17cd73634b Mon Sep 17 00:00:00 2001
From: Johannes Mey <johannes.mey@tu-dresden.de>
Date: Sun, 24 Jan 2021 21:15:44 +0100
Subject: [PATCH] WIP

---
 src/main/grammar/JastAddAspect.bnf            | 137 ++++++----
 src/main/grammar/JastAddAspect.flex           | 247 +++++++++++++-----
 .../aspect/JavaBlockLanguageInjector.java     |   4 +-
 3 files changed, 272 insertions(+), 116 deletions(-)

diff --git a/src/main/grammar/JastAddAspect.bnf b/src/main/grammar/JastAddAspect.bnf
index 8611058..256965b 100644
--- a/src/main/grammar/JastAddAspect.bnf
+++ b/src/main/grammar/JastAddAspect.bnf
@@ -11,11 +11,23 @@
   elementTypeHolderClass="org.jastadd.tooling.aspect.psi.JastAddAspectTypes"
   elementTypeClass="org.jastadd.tooling.aspect.JastAddAspectElementType"
   tokenTypeClass="org.jastadd.tooling.aspect.JastAddAspectTokenType"
+
+  tokens = [
+        WhiteSpace          = 'regexp:[ \t\n\r\f]'
+        SingleLineComment   = 'regexp:[/][/] [^\n\r]* (\n | \r | \r\n)'
+        FormalComment       = 'regexp:[/][*][*] [^*]* [*]+([^*/][^*]*[*]+)*[/]'
+        MultiLineComment    = 'regexp:[/][*] [^*]+ [*]+([^*/][^*]*[*]+)*[/]'
+
+        NotParenthesis      = 'regexp:[^{}]+'
+
+        MULTI_LINE_COMMENT  = 'regexp:[/][*] [^*]+ [*]+([^*/][^*]*[*]+)*[/]'
+        FORMAL_COMMENT      = 'regexp:[/][*][*] [^*]* [*]+([^*/][^*]*[*]+)*[/]'
+        SINGLE_LINE_COMMENT = 'regexp:[/][/] [^\n\r]* (\n | \r | \r\n)'
+      ]
 }
 
-jastaddAspectFile ::= (aspect_declaration|comment)*
 
-comment ::= (WHITESPACE | MULTILINECOMMENT | DOCCOMMENT | SINGLELINECOMMENT)
+
 
 //attribute_equation ::= EQ java_block
 //
@@ -25,7 +37,22 @@ comment ::= (WHITESPACE | MULTILINECOMMENT | DOCCOMMENT | SINGLELINECOMMENT)
 //  extends="org.jastadd.tooling.aspect.psi.impl.JastAddAspectJavaBlockImplExtension"
 //}
 
-aspect_declaration ::= ASPECT aspect_body
+// aspect_body_declarations_eof ::= aspect_body_declaration* EOF
+
+
+jastaddAspectFile ::= ( aspect_declaration | comment )*
+
+comment ::= (MULTILINECOMMENT | DOCCOMMENT | SINGLELINECOMMENT)
+
+compilation_unit ::= import_declaration* type_declaration*
+
+import_declaration ::= IMPORT STATIC? name (DOT STAR)? SEMICOLON
+
+modifiers ::= (PUBLIC | STATIC  | PROTECTED | PRIVATE | FINAL | ABSTRACT | SYNCHRONIZED | NATIVE | TRANSIENT | VOLATILE | STRICTFP)*
+
+type_declaration ::= SEMICOLON | (modifiers ( class_declaration | interface_declaration | unmodified_enum_declaration | annotation_type_declaration | aspect_declaration ) )
+
+aspect_declaration ::= ASPECT IDENTIFIER aspect_body
 
 aspect_body ::= LBRACE aspect_body_declaration* RBRACE
 
@@ -50,13 +77,11 @@ aspect_body_declaration ::= ( aspect_refine_inh_equation
                             | aspect_field_declaration
                             | aspect_cache_declaration )
 
-aspect_body_declarations_eof ::= aspect_body_declaration* EOF
+aspect_class_declaration ::= modifiers CLASS IDENTIFIER type_parameters (EXTENDS class_or_interface_type)? (IMPLEMENTS type_name_list)? aspect_class_body
 
-aspect_class_declaration ::= modifiers CLASS id type_parameters (EXTENDS class_or_interface_type)? (IMPLEMENTS type_name_list)? aspect_class_body
+aspect_class_body ::= class_body_declaration_in_paren // including curly braces
 
-aspect_class_body ::= JAVA_CLASS_BODY_DECLARATION // including curly braces
-
-aspect_interface_declaration ::= modifiers INTERFACE id type_parameters? (EXTENDS type_name_list)? LBRACE aspect_interface_member_declaration* RBRACE
+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
                                         | aspect_nested_interface_declaration
@@ -65,62 +90,61 @@ 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 ID (COMMA type ID)* )? RPAREN (CIRCULAR LBRACKET JAVA_EXPRESSION RBRACKET)? SCOL
+aspect_interface_syn_attribute_declaration ::= annotation* SYN LAZY? FINAL? aspect_type attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)* )? RPAREN (CIRCULAR LBRACKET JAVA_EXPRESSION RBRACKET)? SEMICOLON
 
-aspect_interface_inh_attribute_declaration ::= annotation* INH LAZY? FINAL? aspect_type attribute_name LPAREN (type ID (COMMA type ID)* )? RPAREN (CIRCULAR LBRACKET JAVA_EXPRESSION RBRACKET)? SCOL
+aspect_interface_inh_attribute_declaration ::= annotation* INH LAZY? FINAL? aspect_type attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)* )? RPAREN (CIRCULAR LBRACKET JAVA_EXPRESSION RBRACKET)? SEMICOLON
 
-aspect_interface_method_declaration ::= (PUBLIC | PROTECTED | PRIVATE | STATIC | ABSTRACT | FINAL | NATIVE | SYNCHRONIZED )* aspect_result_type method_declarator (THROWS name_list ) SCOL
+aspect_interface_method_declaration ::= (PUBLIC | PROTECTED | PRIVATE | STATIC | ABSTRACT | FINAL | NATIVE | SYNCHRONIZED )* aspect_result_type method_declarator (THROWS name_list ) SEMICOLON
 
-aspect_interface_field_declaration ::= modifiers aspect_type variable_declarator (COMMA variable_declarator)* SCOL
+aspect_interface_field_declaration ::= modifiers aspect_type variable_declarator (COMMA variable_declarator)* SEMICOLON
 
-aspect_nested_interface_declaration ::= modifiers INTERFACE ID type_parameters? EXTENDS? LBRACE JAVA_INTERFACE_MEMBER_DECLARATIONS RBRACE
+aspect_nested_interface_declaration ::= modifiers INTERFACE IDENTIFIER type_parameters? EXTENDS? LBRACE JAVA_INTERFACE_MEMBER_DECLARATIONS RBRACE
 
-aspect_nested_class_declaration ::= modifiers CLASS ID type_parameters? (EXTENDS class_or_interface_type)? (IMPLEMENTS type_name_list)? JAVA_CLASS_BODY_DECLARATION
+aspect_nested_class_declaration ::= modifiers CLASS IDENTIFIER type_parameters? (EXTENDS class_or_interface_type)? (IMPLEMENTS type_name_list)? java_class_body_declaration
 
-aspect_method_declaration ::= modifiers type_parameters? aspect_result_type ID DOT method_declarator (THROWS name_list)? (block | SCOL)
+aspect_method_declaration ::= modifiers type_parameters? aspect_result_type IDENTIFIER DOT method_declarator (THROWS name_list)? (block | SEMICOLON)
 
-aspect_refine_method_declaration ::= REFINE [ID] modifers type_parameters? aspect_result_type ID DOT method_declarator (THROWS name_list)? (block | SCOL)
+aspect_refine_method_declaration ::= REFINE [IDENTIFIER] modifers type_parameters? aspect_result_type IDENTIFIER DOT method_declarator (THROWS name_list)? (block | SEMICOLON)
 
-aspect_constructor_declaration ::= modifiers ID DOT ID formal_parameters (THROWS name_list)? LBRACE JAVA_EXPLICIT_CONSTRUCTUR_BLOCK RBRACE
+aspect_constructor_declaration ::= modifiers IDENTIFIER DOT IDENTIFIER formal_parameters (THROWS name_list)? LBRACE JAVA_EXPLICIT_CONSTRUCTUR_BLOCK RBRACE
 
-aspect_refine_constructor_declaration ::= REFINE ID (PUBLIC | PROTECTED | PRIVATE) ID DOT ID formal_parameters (THROWS name_list)? LBRACE block_statement* RBRACE
+aspect_refine_constructor_declaration ::= REFINE IDENTIFIER (PUBLIC | PROTECTED | PRIVATE) IDENTIFIER DOT IDENTIFIER formal_parameters (THROWS name_list)? LBRACE block_statement* RBRACE
 
-aspect_field_declaration ::= modifiers aspect_type ID DOT variable_declarator (COMMA variable_declarator)* SCOL
+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 ID DOT attribute_name LPAREN type ID (COMMA type ID)* RPAREN (CIRCULAR LBRACKET JAVA_EXPRESSION RBRACKET)? ( EQ JAVA_EXPRESSION SCOL | block | SCOL )
+aspect_syn_attribute_declaration ::= annotation* SYN NTA? LAZY? FINAL? aspect_type IDENTIFIER DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)* )? RPAREN (CIRCULAR LBRACKET JAVA_EXPRESSION RBRACKET)? ( ASSIGN JAVA_EXPRESSION SEMICOLON | block | SEMICOLON )
 
-aspect_inh_attribute_declaration ::= annotation* INH NTA? LAZY? FINAL? aspect_type ID DOT attribute_name LPAREN (type ID (COMMA type ID)* )? (CIRCULAR LBRACKET JAVA_EXPRESSION RBRACKET)? SCOL
+aspect_inh_attribute_declaration ::= annotation* INH NTA? LAZY? FINAL? aspect_type IDENTIFIER DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)* )? (CIRCULAR LBRACKET JAVA_EXPRESSION RBRACKET)? SEMICOLON
 
-aspect_rewrite ::= REWRITE ID (ID DOT ID LPAREN RPAREN)? LBRACE ((WHEN LPAREN JAVA_EXPRESSION RPAREN)? TO aspect_type ( JAVA_EXPRESSION SCOL | block ))+ RBRACE
+aspect_rewrite ::= REWRITE IDENTIFIER (IDENTIFIER DOT IDENTIFIER LPAREN RPAREN)? LBRACE ((WHEN LPAREN JAVA_EXPRESSION RPAREN)? TO aspect_type ( JAVA_EXPRESSION SEMICOLON | block ))+ RBRACE
 
-aspect_syn_equation ::= annotation* ID DOT attribute_name LPAREN (type ID (COMMA type ID)*)? RPAREN ( EQ JAVA_EXPRESSION SCOL | block )
+aspect_syn_equation ::= annotation* EQUATION IDENTIFIER DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)*)? RPAREN ( ASSIGN JAVA_EXPRESSION SEMICOLON | block )
 
-aspect_refine_syn_equation ::= REFINE ID EQ ID attribute_name LPAREN (type ID (COMMA type ID)*)? RPAREN (EQ JAVA_EXPRESSION SCOL | block)
+aspect_refine_syn_equation ::= REFINE IDENTIFIER EQUATION IDENTIFIER attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)*)? RPAREN (ASSIGN JAVA_EXPRESSION SEMICOLON | block)
 
-aspect_inh_equation ::= annotation* EQ ID DOT ID LPAREN (INT ID)? DOT attribute_name LPAREN (type ID (COMMA type ID)*)? RPAREN (EQ 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 JAVA_EXPRESSION | block)
 
-aspect_refine_inh_equation ::= REFINE ID EQ ID DOT ID LPAREN (INT ID)? RPAREN DOT attribute_name LPAREN (type ID (COMMA type ID)*)? RPAREN (EQ 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 JAVA_EXPRESSION | block)
 
-collection_attribute ::= annotation* COLL aspect_type ID DOT attribute_name LPAREN RPAREN CIRCULAR? (LBRACKET JAVA_EXPRESSION RBRACKET)? (WITH ID)? (ROOT ID)? SCOL
+collection_attribute ::= annotation* COLL aspect_type IDENTIFIER DOT attribute_name LPAREN RPAREN CIRCULAR? (LBRACKET JAVA_EXPRESSION RBRACKET)? (WITH IDENTIFIER)? (ROOT IDENTIFIER)? SEMICOLON
 
-collection_contribution ::= annotation* CONTRIBUTES ( NTA JAVA_EXPRESSION TO ID DOT attribute_name LPAREN RPAREN | EACH? JAVA_EXPRESSION (WHEN JAVA_EXPRESSION)? TO ID DOT attribute_name LPAREN RPAREN (FOR  EACH? JAVA_EXPRESSION)? | block TO ID DOT attribute_name LPAREN RPAREN ) SCOL
+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
 
-aspect_add_interface ::= IO IMPLEMENTS type_name_list SCOL
+aspect_add_interface ::= IO IMPLEMENTS type_name_list SEMICOLON
 
-aspect_extend_interface ::= ID EXTENDS type_name_list SCOL
+aspect_extend_interface ::= IDENTIFIER EXTENDS type_name_list SEMICOLON
 
 // added
 
 type_name_list ::= class_or_interface_type (COMMA class_or_interface_type)*
 
-attribute_name ::= ID
+attribute_name ::= IDENTIFIER
 
 // TODO | UnmodifiedClassDeclaration("")
-block_statement ::= (FINAL? type java_identifier local_variable_declaration SCOL) | statement
+block_statement ::= (FINAL? type java_identifier local_variable_declaration SEMICOLON) | statement
 
-aspect_cache_declaration ::= (CACHE | UNCACHE) ID DOT attribute_name LPAREN (type ID? (type ID?)* )? RPAREN SCOL
+aspect_cache_declaration ::= (CACHE | UNCACHE) IDENTIFIER DOT attribute_name LPAREN (type IDENTIFIER? (type IDENTIFIER?)* )? RPAREN SEMICOLON
 
-modifiers ::= (PUBLIC | STATIC  | PROTECTED | PRIVATE | FINAL | ABSTRACT | SYNCHRONIZED | NATIVE | TRANSIENT | VOLATILE | STRICTFP)*
 
 // Attribute type names can not start with JastAdd reserved words such as 'syn', 'eq', etc.
 aspect_type ::= aspect_reference_type | ( primitive_type (LBRACKET RBRACKET)? )
@@ -133,35 +157,37 @@ formal_parameter ::= FINAL? type DOTS? variable_declarator_id
 
 variable_declarator_id ::= java_identifier ( LBRACKET RBRACKET )*
 
-java_identifier ::= ID | INH | SYN | LAZY | REWRITE | TO | WHEN | ASPECT | EQUATION | CIRCULAR | REFINE | COLL | CONTRIBUTES | EACH | NTA | CACHE | UNCACHE
+java_identifier ::= IDENTIFIER | INH | SYN | LAZY | REWRITE | TO | WHEN | ASPECT | EQUATION | CIRCULAR | REFINE | COLL | CONTRIBUTES | EACH | NTA | CACHE | UNCACHE
 
-aspect_enum_declaration ::= modifiers ENUM ID (IMPLEMENTS type_name_list)? JAVA_ENUM_BODY
+aspect_enum_declaration ::= modifiers ENUM IDENTIFIER (IMPLEMENTS type_name_list)? JAVA_ENUM_BODY
 
-variable_declarator ::= variable_declarator_id ( EQ variable_initializer )?
+variable_declarator ::= variable_declarator_id ( ASSIGN variable_initializer )?
 
 variable_initializer ::= array_initializer | expression
 
 array_initializer ::= LBRACE ( variable_initializer (COMMA variable_initializer)* )? RBRACE
 
-primitive_type ::= boolean | char | byte | short | int | long | float | double
+aspect_reference_type ::= aspect_class_or_interface_type (LBRACKET RBRACKET)*
+
+aspect_class_or_interface_type ::= IDENTIFIER type_arguments? (DOT java_identifier type_arguments? )*
+
+type ::= reference_type | primitive_type
+
+reference_type ::= ( primitive_type (LBRACKET RBRACKET)+ ) | ( class_or_interface_type (LBRACKET RBRACKET)* )
 
 class_or_interface_type ::= java_identifier type_arguments? (DOT java_identifier type_arguments? )*
 
-type_arguments ::= LESSTHAN (type_argument (COMMA type_argument)* )? MORETHAN
+type_arguments ::= LT (type_argument (COMMA type_argument)* )? GT
 
 type_argument ::= reference_type | (QUESTIONMARK wildcard_bounds?)
 
 wildcard_bounds ::= (EXTENDS reference_type) | SUPER reference_type
 
-reference_type ::= ( primitive_type (LBRACKET RBRACKET)+ ) | ( class_or_interface_type (LBRACKET RBRACKET)* )
-
-aspect_reference_type ::= aspect_class_or_interface_type (LBRACKET RBRACKET)*
-
-aspect_class_or_interface_type ::= ID type_arguments? (DOT java_identifier type_arguments? )*
+primitive_type ::= boolean | char | byte | short | int | long | float | double
 
 local_variable_declaration ::= FINAL? type variable_declarator (COMMA variable_declarator)*
 
-type_parameters ::= LESSTHAN type_parameter (COMMA type_parameter)* GREATERTHAN
+type_parameters ::= LT type_parameter (COMMA type_parameter)* GT
 
 type_parameter ::= java_identifier type_bound?
 
@@ -171,3 +197,24 @@ aspect_result_type ::= VOID | aspect_type
 
 method_declarator ::= java_identifier formal_parameters (LBRACKET RBRACKET)*
 
+annotation ::= ( normal_annotation | single_member_annotation | marker_annotation )
+
+normal_annotation ::= AT name java_member_value_pairs_in_paren
+
+marker_annotation ::= AT name
+
+single_member_annotation ::= AT name java_member_value_in_paren
+
+
+
+// island things
+
+class_body_declaration_in_paren ::= JAVA_IN_PAREN
+//{
+//  implements="org.jastadd.tooling.aspect.psi.JastAddAspectJavaBlockExtension"
+//  extends="org.jastadd.tooling.aspect.psi.impl.JastAddAspectJavaBlockImplExtension"
+//}
+
+java_member_value_in_paren ::= JAVA_IN_PAREN // LPAREN member_value RPAREN
+
+java_member_value_pairs_in_paren ::= JAVA_IN_PAREN // LPAREN member_value_pairs? RPAREN
diff --git a/src/main/grammar/JastAddAspect.flex b/src/main/grammar/JastAddAspect.flex
index 9f12d97..2120cab 100644
--- a/src/main/grammar/JastAddAspect.flex
+++ b/src/main/grammar/JastAddAspect.flex
@@ -19,87 +19,120 @@ import com.intellij.psi.TokenType;
   private int counter = 0;
 %}
 
+WhiteSpace          = [ \t\n\r\f]
 
-WhiteSpace        = [ ] | \t | \f | \n | \r | \r\n
-//ID                = [a-zA-Z$_][a-zA-Z0-9$_]*
-//MultiLineComment  = [/][*][^*]+[*]+([^*/][^*]*[*]+)*[/]
-//DocComment        = [/][*][*][^*]*[*]+([^*/][^*]*[*]+)*[/]
-//SingleLineComment = [/][/] [^\n\r]* (\n | \r | \r\n)
-NotParenthesis    = [^{}]*
+// TODO what is /**/ in Java? Is this caputered here?
+SingleLineComment   = "//"  [^\n\r]* (\n | \r | \r\n)
+FormalComment       = "/**" [^*]* [*]+([^*/][^*]*[*]+)*[/]
+MultiLineComment    = "/*"  [^*]+ [*]+([^*/][^*]*[*]+)*[/]
 
-%state JAVA
+
+NotParenthesis    = [^{}]+
+
+// from jjt
+// DecimalLiteral    = [1-9] [0-9]*
+// HexLiteral        = 0 [xX] [0-9a-fA-F]+
+// OctalLiteral      = 0 [0-7]*
+// IntegerLiteral    = ( {DecimalLiteral} | {HexLiteral} | {OctalLiteral} ) [lL]?
+
+Exponent             = [eE] [+-]? [0-9]+
+FloatingPointLiteral = [0-9]+ "." [0-9]* {Exponent}? [fFdD]?
+                     |        "." [0-9]+ {Exponent}? [fFdD]?
+                     |            [0-9]+ {Exponent}  [fFdD]?
+                     |            [0-9]+ {Exponent}? [fFdD]
+
+CharacterLiteral     = '  ( [^'\\\n\r]  | ( \\ ( [ntbrf\\'\"] | [0-7][0-7?] | [0-3][0-7][0-7] ) ) ) '
+StringLiteral        = \" ( [^\"\\\n\r] | ( \\ ( [ntbrf\\'\"] | [0-7][0-7?] | [0-3][0-7][0-7] ) ) )* \"
+
+Identifier           = [:jletter:] [:jletterdigit:]*
+
+%state JASTADD
+%state EXPECT_JAVA_IN_PAREN
+%state JAVA_IN_PAREN
+%state COLLECTION_DECL
 
 %%
 
 <YYINITIAL> {
- {WhiteSpace}+                  {}
- "EQ"                           { yybegin(YYINITIAL); return JastAddAspectTypes.EQ; }
- "{"                            { yybegin(JAVA); counter = 1;  }
+ {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;  }
+}
+
+<EXPECT_JAVA_IN_PAREN> {
+ "{"                            { yybegin(JAVA_IN_PAREN); counter = 1;  }
 }
 
-<JAVA_PARENTHESIS_BLOCK> {
+<JAVA_IN_PAREN> {
+ {SingleLineComment}            {}
+ {FormalComment}                {}
+ {MultiLineComment}             {}
+ {CharacterLiteral}             {}
+ {StringLiteral}                {}
  {NotParenthesis}               {}
- "{"                            { counter++; yybegin(JAVA); }
- "}"                            { counter--; if (counter==0) { yybegin(YYINITIAL); return JastAddAspectTypes.JAVABLOCK; } }
+ "{"                            { counter++; }
+ "}"                            { counter--; if (counter==0) { yybegin(YYINITIAL); return JastAddAspectTypes.JAVA_IN_PAREN; } }
 }
 
-<JAVATOKENS> {
- "abstract"                     { return JastAddAspectTypes.ABSTRACT; }
- "assert"                       { return JastAddAspectTypes.ASSERT; }
- "boolean"                      { return JastAddAspectTypes.BOOLEAN; }
- "break"                        { return JastAddAspectTypes.BREAK; }
- "byte"                         { return JastAddAspectTypes.BYTE; }
- "case"                         { return JastAddAspectTypes.CASE; }
- "catch"                        { return JastAddAspectTypes.CATCH; }
- "char"                         { return JastAddAspectTypes.CHAR; }
- "class"                        { return JastAddAspectTypes.CLASS; }
- "const"                        { return JastAddAspectTypes.CONST; }
- "continue"                     { return JastAddAspectTypes.CONTINUE; }
- "default"                      { return JastAddAspectTypes._DEFAULT; }
- "do"                           { return JastAddAspectTypes.DO; }
- "double"                       { return JastAddAspectTypes.DOUBLE; }
- "else"                         { return JastAddAspectTypes.ELSE; }
- "enum"                         { return JastAddAspectTypes.ENUM; }
- "extends"                      { return JastAddAspectTypes.EXTENDS; }
- "false"                        { return JastAddAspectTypes.FALSE; }
- "final"                        { return JastAddAspectTypes.FINAL; }
- "finally"                      { return JastAddAspectTypes.FINALLY; }
- "float"                        { return JastAddAspectTypes.FLOAT; }
- "for"                          { return JastAddAspectTypes.FOR; }
- "goto"                         { return JastAddAspectTypes.GOTO; }
- "if"                           { return JastAddAspectTypes.IF; }
- "implements"                   { return JastAddAspectTypes.IMPLEMENTS; }
- "import"                       { return JastAddAspectTypes.IMPORT; }
- "instanceof"                   { return JastAddAspectTypes.INSTANCEOF; }
- "int"                          { return JastAddAspectTypes.INT; }
- "interface"                    { return JastAddAspectTypes.INTERFACE; }
- "long"                         { return JastAddAspectTypes.LONG; }
- "native"                       { return JastAddAspectTypes.NATIVE; }
- "new"                          { return JastAddAspectTypes.NEW; }
- "null"                         { return JastAddAspectTypes.NULL; }
- "package"                      { return JastAddAspectTypes.PACKAGE; }
- "private"                      { return JastAddAspectTypes.PRIVATE; }
- "protected"                    { return JastAddAspectTypes.PROTECTED; }
- "public"                       { return JastAddAspectTypes.PUBLIC; }
- "return"                       { return JastAddAspectTypes.RETURN; }
- "short"                        { return JastAddAspectTypes.SHORT; }
- "static"                       { return JastAddAspectTypes.STATIC; }
- "strictfp"                     { return JastAddAspectTypes.STRICTFP; }
- "super"                        { return JastAddAspectTypes.SUPER; }
- "switch"                       { return JastAddAspectTypes.SWITCH; }
- "synchronized"                 { return JastAddAspectTypes.SYNCHRONIZED; }
- "this"                         { return JastAddAspectTypes.THIS; }
- "throw"                        { return JastAddAspectTypes.THROW; }
- "throws"                       { return JastAddAspectTypes.THROWS; }
- "transient"                    { return JastAddAspectTypes.TRANSIENT; }
- "true"                         { return JastAddAspectTypes.TRUE; }
- "try"                          { return JastAddAspectTypes.TRY; }
- "void"                         { return JastAddAspectTypes.VOID; }
- "volatile"                     { return JastAddAspectTypes.VOLATILE; }
- "while"                        { return JastAddAspectTypes.WHILE; }
-
- // JastAdd
+<YYINITIAL,COLLECTION_DECL> {
+  "abstract"                    { return JastAddAspectTypes.ABSTRACT; }
+//"assert"                      { return JastAddAspectTypes.ASSERT; }
+  "boolean"                     { return JastAddAspectTypes.BOOLEAN; }
+//"break"                       { return JastAddAspectTypes.BREAK; }
+  "byte"                        { return JastAddAspectTypes.BYTE; }
+//"case"                        { return JastAddAspectTypes.CASE; }
+//"catch"                       { return JastAddAspectTypes.CATCH; }
+  "char"                        { return JastAddAspectTypes.CHAR; }
+  "class"                       { return JastAddAspectTypes.CLASS; }
+//"const"                       { return JastAddAspectTypes.CONST; }
+//"continue"                    { return JastAddAspectTypes.CONTINUE; }
+//"default"                     { return JastAddAspectTypes._DEFAULT; }
+//"do"                          { return JastAddAspectTypes.DO; }
+  "double"                      { return JastAddAspectTypes.DOUBLE; }
+//"else"                        { return JastAddAspectTypes.ELSE; }
+  "enum"                        { return JastAddAspectTypes.ENUM; }
+  "extends"                     { return JastAddAspectTypes.EXTENDS; }
+//"false"                       { return JastAddAspectTypes.FALSE; }
+  "final"                       { return JastAddAspectTypes.FINAL; }
+//"finally"                     { return JastAddAspectTypes.FINALLY; }
+  "float"                       { return JastAddAspectTypes.FLOAT; }
+  "for"                         { return JastAddAspectTypes.FOR; }
+//"goto"                        { return JastAddAspectTypes.GOTO; }
+//"if"                          { return JastAddAspectTypes.IF; }
+  "implements"                  { return JastAddAspectTypes.IMPLEMENTS; }
+  "import"                      { return JastAddAspectTypes.IMPORT; }
+//"instanceof"                  { return JastAddAspectTypes.INSTANCEOF; }
+  "int"                         { return JastAddAspectTypes.INT; }
+  "interface"                   { return JastAddAspectTypes.INTERFACE; }
+  "long"                        { return JastAddAspectTypes.LONG; }
+  "native"                      { return JastAddAspectTypes.NATIVE; }
+//"new"                         { return JastAddAspectTypes.NEW; }
+//"null"                        { return JastAddAspectTypes.NULL; }
+//"package"                     { return JastAddAspectTypes.PACKAGE; }
+  "private"                     { return JastAddAspectTypes.PRIVATE; }
+  "protected"                   { return JastAddAspectTypes.PROTECTED; }
+  "public"                      { return JastAddAspectTypes.PUBLIC; }
+//"return"                      { return JastAddAspectTypes.RETURN; }
+  "short"                       { return JastAddAspectTypes.SHORT; }
+  "static"                      { return JastAddAspectTypes.STATIC; }
+  "strictfp"                    { return JastAddAspectTypes.STRICTFP; }
+  "super"                       { return JastAddAspectTypes.SUPER; }
+//"switch"                      { return JastAddAspectTypes.SWITCH; }
+  "synchronized"                { return JastAddAspectTypes.SYNCHRONIZED; }
+//"this"                        { return JastAddAspectTypes.THIS; }
+//"throw"                       { return JastAddAspectTypes.THROW; }
+  "throws"                      { return JastAddAspectTypes.THROWS; }
+  "transient"                   { return JastAddAspectTypes.TRANSIENT; }
+//"true"                        { return JastAddAspectTypes.TRUE; }
+//"try"                         { return JastAddAspectTypes.TRY; }
+  "void"                        { return JastAddAspectTypes.VOID; }
+  "volatile"                    { return JastAddAspectTypes.VOLATILE; }
+//"while"                       { return JastAddAspectTypes.WHILE; }
 
+  // JastAdd
   "inh"                         { return JastAddAspectTypes.INH; }
   "syn"                         { return JastAddAspectTypes.SYN; }
   "lazy"                        { return JastAddAspectTypes.LAZY; }
@@ -115,4 +148,80 @@ NotParenthesis    = [^{}]*
   "nta"                         { return JastAddAspectTypes.NTA; }
   "cache"                       { return JastAddAspectTypes.CACHE; }
   "uncache"                     { return JastAddAspectTypes.UNCACHE; }
+
+  // TODO this is strangely split in another Token block, check semantics of JJTree file!
+  "coll"                        { yybegin(COLLECTION_DECL); return JastAddAspectTypes.COLL; }
+
 }
+
+<COLLECTION_DECL> {
+  "with"                        { return JastAddAspectTypes.WITH; }
+  "root"                        { return JastAddAspectTypes.ROOT; }
+}
+
+<YYINITIAL, COLLECTION_DECL> {
+  // LITERALS
+//{IntegerLiteral}              { return JastAddAspectTypes.INTEGER_LITERAL; }
+//{FloatingPointLiteral}        { return JastAddAspectTypes.FLOATING_POINT_LITERAL; }
+//{CharacterLiteral}            { return JastAddAspectTypes.CHARACTER_LITERAL; }
+//{StringLiteral}               { return JastAddAspectTypes.STRING_LITERAL; }
+
+  // IDENTIFIERS
+  {Identifier}                  { return JastAddAspectTypes.IDENTIFIER; }
+
+  // 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; }
+
+  // OPERATORS
+//"="                           { return JastAddAspectTypes.ASSIGN; }
+  "<"                           { return JastAddAspectTypes.LT; }
+//"!"                           { return JastAddAspectTypes.BANG; }
+//"~"                           { return JastAddAspectTypes.TILDE; }
+//"?"                           { return JastAddAspectTypes.HOOK; }
+//":"                           { return JastAddAspectTypes.COLON; }
+//"=="                          { return JastAddAspectTypes.EQ; }
+//"<="                          { return JastAddAspectTypes.LE; }
+//">="                          { return JastAddAspectTypes.GE; }
+//"!="                          { return JastAddAspectTypes.NE; }
+//"||"                          { return JastAddAspectTypes.SC_OR; }
+//"&&"                          { return JastAddAspectTypes.SC_AND; }
+//"++"                          { return JastAddAspectTypes.INCR; }
+//"--"                          { return JastAddAspectTypes.DECR; }
+//"+"                           { return JastAddAspectTypes.PLUS; }
+//"-"                           { return JastAddAspectTypes.MINUS; }
+  "*"                           { return JastAddAspectTypes.STAR; }
+//"/"                           { return JastAddAspectTypes.SLASH; }
+//"&"                           { return JastAddAspectTypes.BIT_AND; }
+//"|"                           { return JastAddAspectTypes.BIT_OR; }
+//"^"                           { return JastAddAspectTypes.XOR; }
+//"%"                           { return JastAddAspectTypes.REM; }
+//"<<"                          { return JastAddAspectTypes.LSHIFT; }
+//"+="                          { return JastAddAspectTypes.PLUSASSIGN; }
+//"-="                          { return JastAddAspectTypes.MINUSASSIGN; }
+//"*="                          { return JastAddAspectTypes.STARASSIGN; }
+//"/="                          { return JastAddAspectTypes.SLASHASSIGN; }
+//"&="                          { return JastAddAspectTypes.ANDASSIGN; }
+//"|="                          { return JastAddAspectTypes.ORASSIGN; }
+//"^="                          { return JastAddAspectTypes.XORASSIGN; }
+//"%="                          { return JastAddAspectTypes.REMASSIGN; }
+//"<<="                         { return JastAddAspectTypes.LSHIFTASSIGN; }
+//">>="                         { return JastAddAspectTypes.RSIGNEDSHIFTASSIGN; }
+//">>>="                        { return JastAddAspectTypes.RUNSIGNEDSHIFTASSIGN; }
+//"..."                         { return JastAddAspectTypes.ELLIPSIS; }
+//"->"                          { return JastAddAspectTypes.ARROW; }
+//"::"                          { return JastAddAspectTypes.DOUBLECOLON; }
+
+  // TODO RUNSIGNEDSHIFT >>> and RSIGNEDSHIFT >> are not parsed
+
+  ">"                           { return JastAddAspectTypes.GT; }
+}
+
diff --git a/src/main/java/org/jastadd/tooling/aspect/JavaBlockLanguageInjector.java b/src/main/java/org/jastadd/tooling/aspect/JavaBlockLanguageInjector.java
index 57c7317..c2a7cb9 100644
--- a/src/main/java/org/jastadd/tooling/aspect/JavaBlockLanguageInjector.java
+++ b/src/main/java/org/jastadd/tooling/aspect/JavaBlockLanguageInjector.java
@@ -6,7 +6,7 @@ import com.intellij.openapi.util.TextRange;
 import com.intellij.psi.InjectedLanguagePlaces;
 import com.intellij.psi.LanguageInjector;
 import com.intellij.psi.PsiLanguageInjectionHost;
-import org.jastadd.tooling.aspect.psi.JastAddAspectJavaBlock;
+import org.jastadd.tooling.aspect.psi.JastAddAspectClassBodyDeclarationInParen;
 import org.jetbrains.annotations.NotNull;
 
 public class JavaBlockLanguageInjector implements LanguageInjector {
@@ -21,7 +21,7 @@ public class JavaBlockLanguageInjector implements LanguageInjector {
    */
   @Override
   public void getLanguagesToInject(@NotNull PsiLanguageInjectionHost host, @NotNull InjectedLanguagePlaces injectionPlacesRegistrar) {
-    if (host.isValidHost() && host instanceof JastAddAspectJavaBlock) {
+    if (host.isValidHost() && host instanceof JastAddAspectClassBodyDeclarationInParen) {
       System.out.println(host.getText());
       injectionPlacesRegistrar.addPlace(JavaLanguage.INSTANCE, new TextRange(0, host.getTextLength()), "class X { public void m(){", "}");
     }
-- 
GitLab