@@ -26,6 +26,11 @@ import static org.ton.intellij.tact.psi.TactElementTypes.*;
2626 * Dedicated nested-comment level counter
2727 */
2828 private int zzNestedCommentLevel = 0 ;
29+
30+ private int zzBlockDepth = 0 ;
31+ private int zzParenDepth = 0 ;
32+ private boolean zzStructScope = false ;
33+ private boolean zzContractScope = false ;
2934%}
3035
3136%{
@@ -55,27 +60,47 @@ import static org.ton.intellij.tact.psi.TactElementTypes.*;
5560%type IElementType
5661
5762%s IN_BLOCK_COMMENT
63+ %s IN_NAME_ATTRIBUTE
5864
5965%unicode
6066
6167EOL =\R
6268WHITE_SPACE =\s+
6369
6470WHITE_SPACE = [ \t\n \x0B \f\r] +
65- INTEGER_LITERAL =( 0[ xX][ 0- 9a- fA- F][ 0- 9a- fA- F_] *)|( [ 0- 9] +)
71+ NON_ZERO_DIGIT = [ 1- 9]
72+ HEX_DIGIT = [ 0- 9a- fA- F]
73+ DIGIT = [ 0- 9]
74+ BIN_DIGIT = [ 01]
75+ OCT_DIGIT = [ 0- 7]
76+ INTEGER_LITERAL_DEC = ( {NON_ZERO_DIGIT} ( _? {DIGIT} )*) | 0{DIGIT} *
77+ INTEGER_LITERAL_HEX = 0[ xX] {HEX_DIGIT} ( _? {HEX_DIGIT} )*
78+ INTEGER_LITERAL_BIN = 0[ bB] {BIN_DIGIT} ( _? {BIN_DIGIT} )*
79+ INTEGER_LITERAL_OCT = 0[ oO] {OCT_DIGIT} ( _? {OCT_DIGIT} )*
80+ INTEGER_LITERAL = {INTEGER_LITERAL_HEX} | {INTEGER_LITERAL_BIN} | {INTEGER_LITERAL_OCT} | {INTEGER_LITERAL_DEC}
6681STRING_LITERAL =( \" ( [^ \" \r\n \\ ] | \\ .)* \" )
67- IDENTIFIER =[:letter:]\w*
82+ IDENTIFIER = [ a- zA- Z_][ a- zA- Z0- 9_] *
83+ FUNC_IDENTIFIER = [ a- zA- Z_][ a- zA- Z0- 9_?!:&'] *
6884
6985%%
7086<YYINITIAL> {
7187 {WHITE_SPACE} { return WHITE_SPACE ; }
7288
73- "{" { return LBRACE ; }
74- "}" { return RBRACE ; }
89+ "/*" { yybegin(IN_BLOCK_COMMENT ); yypushback(2 ); }
90+ "//" .* { return LINE_COMMENT ; }
91+
92+ "{" { zzBlockDepth++ ; return LBRACE ; }
93+ "}" {
94+ if (zzBlockDepth-- == 0 ) {
95+ zzStructScope = false ;
96+ zzContractScope = false ;
97+ }
98+ return RBRACE ;
99+ }
75100 "[" { return LBRACK ; }
76101 "]" { return RBRACK ; }
77- "(" { return LPAREN ; }
78- ")" { return RPAREN ; }
102+ "(" { zzParenDepth ++ ; return LPAREN ; }
103+ ")" { zzParenDepth -- ; return RPAREN ; }
79104 ":" { return COLON ; }
80105 ";" { return SEMICOLON ; }
81106 "," { return COMMA ; }
@@ -93,6 +118,11 @@ IDENTIFIER=[:letter:]\w*
93118 "=" { return EQ ; }
94119 "?" { return Q ; }
95120 "!" { return EXCL ; }
121+ "+=" { return PLUSLET ; }
122+ "-=" { return MINUSLET ; }
123+ "*=" { return TIMESLET ; }
124+ "/=" { return DIVLET ; }
125+ "%=" { return MODLET ; }
96126 "==" { return EQEQ ; }
97127 "!=" { return EXCLEQ ; }
98128 ">=" { return GTEQ ; }
@@ -119,29 +149,27 @@ IDENTIFIER=[:letter:]\w*
119149 "const" { return CONST_KEYWORD ; }
120150 "fun" { return FUN_KEYWORD ; }
121151 "initOf" { return INIT_OF_KEYWORD ; }
122- "get" { return GET_KEYWORD ; }
123152 "as" { return AS_KEYWORD ; }
124153 "abstract" { return ABSTRACT_KEYWORD ; }
125154 "import" { return IMPORT_KEYWORD ; }
126- "struct" { return STRUCT_KEYWORD ; }
127- "message" { return MESSAGE_KEYWORD ; }
128- "contract" { return CONTRACT_KEYWORD ; }
155+ "struct" { zzStructScope = true ; return STRUCT_KEYWORD ; }
156+ "message" { return zzBlockDepth == 0 ? MESSAGE_KEYWORD : IDENTIFIER ; }
157+ "contract" { zzContractScope = true ; return CONTRACT_KEYWORD ; }
129158 "trait" { return TRAIT_KEYWORD ; }
130159 "with" { return WITH_KEYWORD ; }
131- "init" { return INIT_KEYWORD ; }
132160 "receive" { return RECEIVE_KEYWORD ; }
133- "bounced" { return BOUNCED_KEYWORD ; }
134161 "external" { return EXTERNAL_KEYWORD ; }
135162 "true" { return BOOLEAN_LITERAL ; }
136163 "false" { return BOOLEAN_LITERAL ; }
137164 "null" { return NULL_LITERAL ; }
138- "intOf" { return INT_OF_KEYWORD ; }
165+ "primitive" { return PRIMITIVE_KEYWORD ; }
166+ "self" { return SELF_KEYWORD ; }
167+ "map" { return MAP_KEYWORD ; }
168+ "bounced" { return zzBlockDepth == 1 && zzContractScope ? BOUNCED_KEYWORD : IDENTIFIER ; }
169+ "init" { return zzBlockDepth == 1 && zzParenDepth == 0 ? INIT_KEYWORD : IDENTIFIER ; }
170+ "get" { return zzBlockDepth <= 1 ? GET_KEYWORD : IDENTIFIER ; }
139171 "@interface" { return INTERFACE_MACRO ; }
140- "@name" { return NAME_MACRO ; }
141-
142- "/*" { yybegin(IN_BLOCK_COMMENT ); yypushback(2 ); }
143- "////" .* { return LINE_COMMENT ; }
144- "//" .* { return LINE_COMMENT ; }
172+ "@name" { yybegin(IN_NAME_ATTRIBUTE ); yypushback(5 ); }
145173
146174 {INTEGER_LITERAL} { return INTEGER_LITERAL ; }
147175 {STRING_LITERAL} { return STRING_LITERAL ; }
@@ -162,4 +190,12 @@ IDENTIFIER=[:letter:]\w*
162190 [^] { }
163191}
164192
193+ <IN_NAME_ATTRIBUTE> {
194+ "@name" { return NAME_MACRO ; }
195+ "(" { zzParenDepth++ ; return LPAREN ; }
196+ ")" { zzParenDepth-- ; yybegin(YYINITIAL ); return RPAREN ; }
197+ {FUNC_IDENTIFIER} { yybegin(YYINITIAL ); return FUNC_IDENTIFIER ; }
198+ [^] { yybegin(YYINITIAL ); yypushback(1 ); }
199+ }
200+
165201[^] { return BAD_CHARACTER ; }
0 commit comments