@@ -2,6 +2,7 @@ package org.ton.intellij.tact.parser;
2
2
3
3
import com.intellij.lexer.FlexLexer ;
4
4
import com.intellij.psi.tree.IElementType ;
5
+ import com.intellij.util.containers.Stack ;
5
6
6
7
import static com.intellij.psi.TokenType.BAD_CHARACTER ;
7
8
import static com.intellij.psi.TokenType.WHITE_SPACE ;
@@ -31,12 +32,13 @@ import static org.ton.intellij.tact.psi.TactElementTypes.*;
31
32
private int zzParenDepth = 0 ;
32
33
private boolean zzStructScope = false ;
33
34
private boolean zzContractScope = false ;
35
+ private boolean zzStructIdentifierExpected = false ;
34
36
%}
35
37
36
38
%{
37
39
IElementType imbueBlockComment() {
38
40
assert(zzNestedCommentLevel == 0 );
39
- yybegin( YYINITIAL );
41
+ popState( );
40
42
41
43
zzStartRead = zzPostponedMarkedPos;
42
44
zzPostponedMarkedPos = - 1 ;
@@ -59,8 +61,45 @@ import static org.ton.intellij.tact.psi.TactElementTypes.*;
59
61
%function advance
60
62
%type IElementType
61
63
64
+ %{
65
+ private static final class State {
66
+ final int lBraceCount;
67
+ final int state;
68
+
69
+ public State (int state , int lBraceCount ) {
70
+ this . state = state;
71
+ this . lBraceCount = lBraceCount;
72
+ }
73
+
74
+ @Override
75
+ public String toString () {
76
+ return " yystate = " + state + (lBraceCount == 0 ? " " : " lBraceCount = " + lBraceCount);
77
+ }
78
+ }
79
+
80
+ private final Stack<State > states = new Stack<State > ();
81
+ private int lBraceCount;
82
+
83
+ private int commentStart;
84
+ private int commentDepth;
85
+
86
+ private void pushState(int state) {
87
+ states. push(new State (yystate(), lBraceCount));
88
+ lBraceCount = 0 ;
89
+ yybegin(state);
90
+ }
91
+
92
+ private void popState() {
93
+ State state = states. pop();
94
+ lBraceCount = state. lBraceCount;
95
+ yybegin(state. state);
96
+ }
97
+ %}
98
+
62
99
%s IN_BLOCK_COMMENT
63
100
%s IN_NAME_ATTRIBUTE
101
+ %s STRING
102
+ %s STRUCT
64
103
65
104
%unicode
66
105
@@ -78,103 +117,24 @@ INTEGER_LITERAL_HEX = 0[xX] {HEX_DIGIT} (_?{HEX_DIGIT})*
78
117
INTEGER_LITERAL_BIN = 0[ bB] {BIN_DIGIT} ( _? {BIN_DIGIT} )*
79
118
INTEGER_LITERAL_OCT = 0[ oO] {OCT_DIGIT} ( _? {OCT_DIGIT} )*
80
119
INTEGER_LITERAL = {INTEGER_LITERAL_HEX} | {INTEGER_LITERAL_BIN} | {INTEGER_LITERAL_OCT} | {INTEGER_LITERAL_DEC}
81
- STRING_LITERAL =( \" ( [^ \" \r\n \\ ] | \\ .)* \" )
82
120
IDENTIFIER = [ a- zA- Z_][ a- zA- Z0- 9_] *
83
121
FUNC_IDENTIFIER = [ a- zA- Z_][ a- zA- Z0- 9_?!:&'] *
84
122
85
- %%
86
- <YYINITIAL> {
87
- {WHITE_SPACE} { return WHITE_SPACE ; }
88
-
89
- "/*" { yybegin(IN_BLOCK_COMMENT ); yypushback(2 ); }
90
- "//" .* { return LINE_COMMENT ; }
123
+ REGULAR_STRING_PART = [^ \\\" ] +
124
+ ESCAPE_SEQUENCE = \\\\ // backslash
125
+ | \\\" // double quote
126
+ | \\ n // newline
127
+ | \\ r // carriage return
128
+ | \\ t // tab
129
+ | \\ v // vertical tab
130
+ | \\ b // backspace
131
+ | \\ f // form feed
132
+ | \\ u\{ {HEX_DIGIT} {HEX_DIGIT} ? {HEX_DIGIT} ? {HEX_DIGIT} ? {HEX_DIGIT} ? {HEX_DIGIT} ? \} // unicode escape
133
+ | \\ u {HEX_DIGIT} {HEX_DIGIT} {HEX_DIGIT} {HEX_DIGIT} // hex escape
134
+ | \\ x {HEX_DIGIT} {HEX_DIGIT} // hex escape
135
+ | \\ [^\n] // any other character
91
136
92
- "{" { zzBlockDepth++ ; return LBRACE ; }
93
- "}" {
94
- if (zzBlockDepth-- == 0 ) {
95
- zzStructScope = false ;
96
- zzContractScope = false ;
97
- }
98
- return RBRACE ;
99
- }
100
- "[" { return LBRACK ; }
101
- "]" { return RBRACK ; }
102
- "(" { zzParenDepth++ ; return LPAREN ; }
103
- ")" { zzParenDepth-- ; return RPAREN ; }
104
- ":" { return COLON ; }
105
- ";" { return SEMICOLON ; }
106
- "," { return COMMA ; }
107
- "." { return DOT ; }
108
- "+" { return PLUS ; }
109
- "-" { return MINUS ; }
110
- "*" { return MUL ; }
111
- "/" { return DIV ; }
112
- "%" { return REM ; }
113
- "&" { return AND ; }
114
- "|" { return OR ; }
115
- "^" { return XOR ; }
116
- "<" { return LT ; }
117
- ">" { return GT ; }
118
- "=" { return EQ ; }
119
- "?" { return Q ; }
120
- "!" { return EXCL ; }
121
- "+=" { return PLUSLET ; }
122
- "-=" { return MINUSLET ; }
123
- "*=" { return TIMESLET ; }
124
- "/=" { return DIVLET ; }
125
- "%=" { return MODLET ; }
126
- "==" { return EQEQ ; }
127
- "!=" { return EXCLEQ ; }
128
- ">=" { return GTEQ ; }
129
- "<=" { return LTEQ ; }
130
- ">>" { return GTGT ; }
131
- "<<" { return LTLT ; }
132
- "||" { return OROR ; }
133
- "&&" { return ANDAND ; }
134
- "!!" { return EXCLEXCL ; }
135
- "if" { return IF_KEYWORD ; }
136
- "else" { return ELSE_KEYWORD ; }
137
- "while" { return WHILE_KEYWORD ; }
138
- "do" { return DO_KEYWORD ; }
139
- "until" { return UNTIL_KEYWORD ; }
140
- "repeat" { return REPEAT_KEYWORD ; }
141
- "return" { return RETURN_KEYWORD ; }
142
- "extends" { return EXTENDS_KEYWORD ; }
143
- "mutates" { return MUTATES_KEYWORD ; }
144
- "virtual" { return VIRTUAL_KEYWORD ; }
145
- "override" { return OVERRIDE_KEYWORD ; }
146
- "inline" { return INLINE_KEYWORD ; }
147
- "native" { return NATIVE_KEYWORD ; }
148
- "let" { return LET_KEYWORD ; }
149
- "const" { return CONST_KEYWORD ; }
150
- "fun" { return FUN_KEYWORD ; }
151
- "initOf" { return INIT_OF_KEYWORD ; }
152
- "as" { return AS_KEYWORD ; }
153
- "abstract" { return ABSTRACT_KEYWORD ; }
154
- "import" { return IMPORT_KEYWORD ; }
155
- "struct" { zzStructScope = true ; return STRUCT_KEYWORD ; }
156
- "message" { return zzBlockDepth == 0 ? MESSAGE_KEYWORD : IDENTIFIER ; }
157
- "contract" { zzContractScope = true ; return CONTRACT_KEYWORD ; }
158
- "trait" { return TRAIT_KEYWORD ; }
159
- "with" { return WITH_KEYWORD ; }
160
- "receive" { return RECEIVE_KEYWORD ; }
161
- "external" { return EXTERNAL_KEYWORD ; }
162
- "true" { return BOOLEAN_LITERAL ; }
163
- "false" { return BOOLEAN_LITERAL ; }
164
- "null" { return NULL_LITERAL ; }
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 ; }
171
- "@interface" { return INTERFACE_MACRO ; }
172
- "@name" { yybegin(IN_NAME_ATTRIBUTE ); yypushback(5 ); }
173
-
174
- {INTEGER_LITERAL} { return INTEGER_LITERAL ; }
175
- {STRING_LITERAL} { return STRING_LITERAL ; }
176
- {IDENTIFIER} { return IDENTIFIER ; }
177
- }
137
+ %%
178
138
179
139
<IN_BLOCK_COMMENT> {
180
140
"/*" { if (zzNestedCommentLevel++ == 0 )
@@ -190,12 +150,140 @@ FUNC_IDENTIFIER=[a-zA-Z_][a-zA-Z0-9_?!:&']*
190
150
[^] { }
191
151
}
192
152
153
+ <STRING> {
154
+ {REGULAR_STRING_PART} { return REGULAR_STRING_PART ; }
155
+ {ESCAPE_SEQUENCE} { return ESCAPE_SEQUENCE ; }
156
+ \" { popState(); return CLOSE_QUOTE ; }
157
+ [^] { popState(); yypushback(1 ); }
158
+ }
159
+
193
160
<IN_NAME_ATTRIBUTE> {
194
161
"@name" { return NAME_MACRO ; }
195
162
"(" { zzParenDepth++ ; return LPAREN ; }
196
- ")" { zzParenDepth-- ; yybegin(YYINITIAL ); return RPAREN ; }
197
- {FUNC_IDENTIFIER} { yybegin(YYINITIAL ); return FUNC_IDENTIFIER ; }
198
- [^] { yybegin(YYINITIAL ); yypushback(1 ); }
163
+ ")" { zzParenDepth-- ; popState(); return RPAREN ; }
164
+ {FUNC_IDENTIFIER} { popState(); return FUNC_IDENTIFIER ; }
165
+ [^] { popState(); yypushback(1 ); }
166
+ }
167
+
168
+ {WHITE_SPACE} { return WHITE_SPACE ; }
169
+ \" { pushState(STRING ); return OPEN_QUOTE ; }
170
+
171
+ "/*" { pushState(IN_BLOCK_COMMENT ); yypushback(2 ); }
172
+ "//" .* { return LINE_COMMENT ; }
173
+
174
+ "{" {
175
+ zzBlockDepth++ ;
176
+ if (zzStructScope) {
177
+ zzStructIdentifierExpected = true ;
178
+ }
179
+ return LBRACE ;
180
+ }
181
+ "}" {
182
+ if (zzBlockDepth-- == 0 ) {
183
+ zzStructScope = false ;
184
+ zzContractScope = false ;
185
+ }
186
+ return RBRACE ;
187
+ }
188
+ "[" { return LBRACK ; }
189
+ "]" { return RBRACK ; }
190
+ "(" { zzParenDepth++ ; return LPAREN ; }
191
+ ")" { zzParenDepth-- ; return RPAREN ; }
192
+ ":" {
193
+ if (zzStructScope) {
194
+ zzStructIdentifierExpected = false ;
195
+ }
196
+ return COLON ;
197
+ }
198
+ ";" {
199
+ if (zzStructScope) {
200
+ zzStructIdentifierExpected = true ;
201
+ }
202
+ return SEMICOLON ;
203
+ }
204
+ "," { return COMMA ; }
205
+ "." { return DOT ; }
206
+ "+" { return PLUS ; }
207
+ "-" { return MINUS ; }
208
+ "*" { return MUL ; }
209
+ "/" { return DIV ; }
210
+ "%" { return REM ; }
211
+ "&" { return AND ; }
212
+ "|" { return OR ; }
213
+ "^" { return XOR ; }
214
+ "<" { return LT ; }
215
+ ">" { return GT ; }
216
+ "=" { return EQ ; }
217
+ "?" { return Q ; }
218
+ "!" { return EXCL ; }
219
+ "~" { return TILDE ; }
220
+ "+=" { return PLUSLET ; }
221
+ "-=" { return MINUSLET ; }
222
+ "*=" { return TIMESLET ; }
223
+ "/=" { return DIVLET ; }
224
+ "%=" { return MODLET ; }
225
+ "&=" { return ANDLET ; }
226
+ "|=" { return ORLET ; }
227
+ "^=" { return XORLET ; }
228
+ "==" { return EQEQ ; }
229
+ "!=" { return EXCLEQ ; }
230
+ ">=" { return GTEQ ; }
231
+ "<=" { return LTEQ ; }
232
+ ">>" { return GTGT ; }
233
+ "<<" { return LTLT ; }
234
+ "||" { return OROR ; }
235
+ "&&" { return ANDAND ; }
236
+ "!!" { return EXCLEXCL ; }
237
+ "if" { return IF_KEYWORD ; }
238
+ "else" { return ELSE_KEYWORD ; }
239
+ "while" { return WHILE_KEYWORD ; }
240
+ "do" { return DO_KEYWORD ; }
241
+ "until" { return UNTIL_KEYWORD ; }
242
+ "repeat" { return REPEAT_KEYWORD ; }
243
+ "return" { return RETURN_KEYWORD ; }
244
+ "extends" { return EXTENDS_KEYWORD ; }
245
+ "mutates" { return MUTATES_KEYWORD ; }
246
+ "virtual" { return VIRTUAL_KEYWORD ; }
247
+ "override" { return OVERRIDE_KEYWORD ; }
248
+ "inline" { return INLINE_KEYWORD ; }
249
+ "native" { return NATIVE_KEYWORD ; }
250
+ "let" { return LET_KEYWORD ; }
251
+ "const" { return CONST_KEYWORD ; }
252
+ "fun" { return FUN_KEYWORD ; }
253
+ "initOf" { return INIT_OF_KEYWORD ; }
254
+ "as" { return AS_KEYWORD ; }
255
+ "abstract" { return ABSTRACT_KEYWORD ; }
256
+ "import" { return IMPORT_KEYWORD ; }
257
+ "struct" { zzStructScope = true ; return STRUCT_KEYWORD ; }
258
+ "message" { return zzBlockDepth == 0 ? MESSAGE_KEYWORD : IDENTIFIER ; }
259
+ "contract" { zzContractScope = true ; return CONTRACT_KEYWORD ; }
260
+ "trait" { return TRAIT_KEYWORD ; }
261
+ "with" { return WITH_KEYWORD ; }
262
+ "receive" { return RECEIVE_KEYWORD ; }
263
+ "external" { return EXTERNAL_KEYWORD ; }
264
+ "true" { return BOOLEAN_LITERAL ; }
265
+ "false" { return BOOLEAN_LITERAL ; }
266
+ "null" { return NULL_LITERAL ; }
267
+ "primitive" { return PRIMITIVE_KEYWORD ; }
268
+ "self" { return SELF_KEYWORD ; }
269
+ "map" { return MAP_KEYWORD ; }
270
+ "try" { return TRY_KEYWORD ; }
271
+ "catch" { return CATCH_KEYWORD ; }
272
+ "foreach" { return FOREACH_KEYWORD ; }
273
+ "in" { return IN_KEYWORD ; }
274
+ "bounced" {
275
+ if (zzStructScope && zzStructIdentifierExpected) {
276
+ zzStructIdentifierExpected = false ;
277
+ return IDENTIFIER ;
278
+ }
279
+ return BOUNCED_KEYWORD ;
199
280
}
281
+ "init" { return zzBlockDepth == 1 && zzParenDepth == 0 ? INIT_KEYWORD : IDENTIFIER ; }
282
+ "get" { return zzBlockDepth <= 1 ? GET_KEYWORD : IDENTIFIER ; }
283
+ "@interface" { return INTERFACE_MACRO ; }
284
+ "@name" { pushState(IN_NAME_ATTRIBUTE ); yypushback(5 ); }
285
+
286
+ {INTEGER_LITERAL} { return INTEGER_LITERAL ; }
287
+ {IDENTIFIER} { return IDENTIFIER ; }
200
288
201
289
[^] { return BAD_CHARACTER ; }
0 commit comments