Skip to content
Snippets Groups Projects
Select Git revision
  • support-for-intellij-25.1
  • develop default protected
  • chore/support-for-intellijj-2024.3
  • feature/references
  • feature/commenter-for-aspect-files
  • feature/link-generated-code-and-definition
  • main
  • legacy
  • v0.3.5 protected
  • v0.3.4 protected
  • v0.3.3 protected
  • v0.3.2 protected
  • v0.3.1 protected
  • v0.3.0 protected
  • v0.2.0 protected
15 results

Aspect.flex

Blame
  • Aspect.flex 10.73 KiB
    package org.jastadd.tooling.aspect.lexer;
    
    import com.intellij.lexer.FlexLexer;
    import com.intellij.psi.tree.IElementType;
    import org.jastadd.tooling.aspect.psi.AspectTypes;
    import com.intellij.psi.TokenType;
    
    %%
    
    %class AspectLexer
    %implements FlexLexer
    %unicode
    %function advance
    %type IElementType
    %eof{
    %eof}
    
    %{
      private int counter = 0;
      private int totalBraceLevel = 0;
      private java.util.Stack<Integer> modeStack = new java.util.Stack<>();
    
      private void enterState(int state) {
        modeStack.push(yystate());
        yybegin(state);
      }
    
      private void exitState() {
        yybegin(modeStack.pop());
      }
    %}
    
    WhiteSpace          = [ \t\n\r\f]
    
    // TODO what is /**/ in Java? Is this caputered here?
    SingleLineComment   = "//"  [^\n\r]*
    FormalComment       = "/**" [^*]* [*]+([^*/][^*]*[*]+)*[/]
    MultiLineComment    = "/*"  [^*]+ [*]+([^*/][^*]*[*]+)*[/]
    
    // 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 IN_ASPECT
    %state COLLECTION_DECL
    %state 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; }
    }
    
    <YYINITIAL,IN_ASPECT,COLLECTION_DECL,ATTRIBUTE_DEFINITION> {
      "abstract"                    { return AspectTypes.ABSTRACT; }
      "assert"                      { return AspectTypes.ASSERT; }
      "boolean"                     { return AspectTypes.BOOLEAN; }
      "break"                       { return AspectTypes.BREAK; }
      "byte"                        { return AspectTypes.BYTE; }
      "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; }
      "double"                      { return AspectTypes.DOUBLE; }
      "else"                        { return AspectTypes.ELSE; }
      "enum"                        { return AspectTypes.ENUM; }
      "extends"                     { return AspectTypes.EXTENDS; }
      "false"                       { return AspectTypes.FALSE; }
      "final"                       { return AspectTypes.FINAL; }
      "finally"                     { return AspectTypes.FINALLY; }
      "float"                       { return AspectTypes.FLOAT; }
      "for"                         { return AspectTypes.FOR; }
      "goto"                        { return AspectTypes.GOTO; }
      "if"                          { return AspectTypes.IF; }
      "implements"                  { return AspectTypes.IMPLEMENTS; }
      "import"                      { return AspectTypes.IMPORT; }
      "instanceof"                  { return AspectTypes.INSTANCEOF; }
      "int"                         { return AspectTypes.INT; }
      "interface"                   { return AspectTypes.INTERFACE; }
      "long"                        { return AspectTypes.LONG; }
      "native"                      { return AspectTypes.NATIVE; }
      "new"                         { return AspectTypes.NEW; }
      "null"                        { return AspectTypes.NULL; }
      "package"                     { return AspectTypes.PACKAGE; }
      "private"                     { return AspectTypes.PRIVATE; }
      "protected"                   { return AspectTypes.PROTECTED; }
      "public"                      { return AspectTypes.PUBLIC; }
      "return"                      { return AspectTypes.RETURN; }
      "short"                       { return AspectTypes.SHORT; }
      "static"                      { return AspectTypes.STATIC; }
      "strictfp"                    { return AspectTypes.STRICTFP; }
      "super"                       { return AspectTypes.SUPER; }
      "switch"                      { return AspectTypes.SWITCH; }
      "synchronized"                { return AspectTypes.SYNCHRONIZED; }
      "this"                        { return AspectTypes.THIS; }
      "throw"                       { return AspectTypes.THROW; }
      "throws"                      { return AspectTypes.THROWS; }
      "transient"                   { return AspectTypes.TRANSIENT; }
      "true"                        { return AspectTypes.TRUE; }
      "try"                         { return AspectTypes.TRY; }
      "void"                        { return AspectTypes.VOID; }
      "volatile"                    { return AspectTypes.VOLATILE; }
      "while"                       { return AspectTypes.WHILE; }
    
      // the only jastadd-specific keyword here is aspect
      "aspect"                      { enterState(IN_ASPECT); return AspectTypes.ASPECT; }
    }
    
    <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; }
      "eq"                          { enterState(ATTRIBUTE_DEFINITION); return AspectTypes.EQUATION; }
      "circular"                    { return AspectTypes.CIRCULAR; }
      "refine"                      { return AspectTypes.REFINE; }
      "contributes"                 { return AspectTypes.CONTRIBUTES; }
      "each"                        { return AspectTypes.EACH; }
      "nta"                         { return AspectTypes.NTA; }
      "cache"                       { return AspectTypes.CACHE; }
      "uncache"                     { return AspectTypes.UNCACHE; }
    
      // TODO this is strangely split in another Token block, check semantics of JJTree file!
      "coll"                        { enterState(COLLECTION_DECL); return AspectTypes.COLL; }
    
    }
    
    <COLLECTION_DECL> {
      "with"                        { return AspectTypes.WITH; }
      "root"                        { return AspectTypes.ROOT; }
      "["                           { return AspectTypes.LBRACKET; }
    }
    
    <ATTRIBUTE_DEFINITION> {
      "{"                           { ++totalBraceLevel; return AspectTypes.LBRACE; }
    }
    
    // a semicolon exits the COLLECTION_DECL (because we ignore semicolons in expressions)
    <COLLECTION_DECL, ATTRIBUTE_DEFINITION> {
      ";"                           { exitState(); return AspectTypes.SEMICOLON; }
    }
    
    <YYINITIAL,IN_ASPECT,COLLECTION_DECL,ATTRIBUTE_DEFINITION> {
      // LITERALS
      {IntegerLiteral}              { return AspectTypes.INTEGER_LITERAL; }
      {FloatingPointLiteral}        { return AspectTypes.FLOATING_POINT_LITERAL; }
      {CharacterLiteral}            { return AspectTypes.CHARACTER_LITERAL; }
      {StringLiteral}               { return AspectTypes.STRING_LITERAL; }
    
      // IDENTIFIERS
      {Identifier}                  { return AspectTypes.IDENTIFIER; }
    
      // SEPARATORS
    
      "("                           { return AspectTypes.LPAREN; }
      ")"                           { return AspectTypes.RPAREN; }
      "{"                           { ++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; }
    
      // OPERATORS
      "="                           { return AspectTypes.ASSIGN; }
      "<"                           { return AspectTypes.LT; }
      "!"                           { return AspectTypes.BANG; }
      "~"                           { return AspectTypes.TILDE; }
      "?"                           { return AspectTypes.QUESTIONMARK; }
      ":"                           { return AspectTypes.COLON; }
      "=="                          { return AspectTypes.EQ; }
      "<="                          { return AspectTypes.LE; }
      ">="                          { return AspectTypes.GE; }
      "!="                          { return AspectTypes.NE; }
      "||"                          { return AspectTypes.SC_OR; }
      "&&"                          { return AspectTypes.SC_AND; }
      "++"                          { return AspectTypes.INCR; }
      "--"                          { return AspectTypes.DECR; }
      "+"                           { return AspectTypes.PLUS; }
      "-"                           { return AspectTypes.MINUS; }
      "*"                           { return AspectTypes.STAR; }
      "/"                           { return AspectTypes.SLASH; }
      "&"                           { return AspectTypes.BIT_AND; }
      "|"                           { return AspectTypes.BIT_OR; }
      "^"                           { return AspectTypes.XOR; }
      "%"                           { return AspectTypes.REM; }
      "<<"                          { return AspectTypes.LSHIFT; }
      "+="                          { return AspectTypes.PLUSASSIGN; }
      "-="                          { return AspectTypes.MINUSASSIGN; }
      "*="                          { return AspectTypes.STARASSIGN; }
      "/="                          { return AspectTypes.SLASHASSIGN; }
      "&="                          { return AspectTypes.ANDASSIGN; }
      "|="                          { return AspectTypes.ORASSIGN; }
      "^="                          { return AspectTypes.XORASSIGN; }
      "%="                          { return AspectTypes.REMASSIGN; }
      "<<="                         { return AspectTypes.LSHIFTASSIGN; }
      ">>="                         { return AspectTypes.RSIGNEDSHIFTASSIGN; }
      ">>>="                        { return AspectTypes.RUNSIGNEDSHIFTASSIGN; }
      "..."                         { return AspectTypes.ELLIPSIS; }
      "->"                          { return AspectTypes.ARROW; }
      "::"                          { return AspectTypes.DOUBLECOLON; }
    
      // TODO RUNSIGNEDSHIFT >>> and RSIGNEDSHIFT >> are not parsed
    
      ">"                           { return AspectTypes.GT; }
    }