Skip to content

Commit e9c54b5

Browse files
committed
Develop formatter
1 parent bb30e7d commit e9c54b5

File tree

3 files changed

+393
-63
lines changed

3 files changed

+393
-63
lines changed

server/src/antlr/vbafmt.g4

Lines changed: 261 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,40 @@ document
1717
: documentElement* endOfFile
1818
;
1919

20+
classHeader
21+
: ws? BEGIN endOfStatement
22+
classHeaderBlock
23+
ws? END endOfStatement
24+
;
25+
26+
classHeaderBlock
27+
: documentElement+
28+
;
29+
2030
basicStatement
21-
: ws (ambiguousComponent ws?)+ endOfStatement
31+
: ws? ((ambiguousComponent | keywordComponent | flowCharacter) ws?)+ endOfStatement
2232
;
2333

24-
// endOfStatement
25-
// : bols? NEWLINE
26-
// ;
34+
blankLine
35+
: ws? comment? NEWLINE
36+
;
2737

2838
documentElement
2939
: comment
40+
| classHeader
41+
| doBlock
42+
| forBlock
43+
| endStatement
44+
| enumBlock
45+
| labelStatement
3046
| methodDeclaration
3147
| attributeStatement
48+
| ifElseStatement
49+
| ifElseBlock
50+
| selectCaseBlock
51+
| whileBlock
3252
| basicStatement
53+
| blankLine
3354
;
3455

3556
attributeStatement
@@ -46,36 +67,169 @@ visibility
4667
| GLOBAL
4768
;
4869

70+
endStatement
71+
: ws? END endOfStatement
72+
;
73+
74+
enumBlockOpen
75+
: ws? (visibility ws)? ENUM ws ambiguousComponent endOfStatement
76+
;
77+
78+
enumBlockClose
79+
: ws? END ws ENUM
80+
;
81+
82+
enumBlock
83+
: enumBlockOpen
84+
block?
85+
enumBlockClose
86+
;
87+
88+
labelStatement
89+
: ws? ambiguousComponent COLON
90+
;
91+
92+
methodSignature
93+
: methodOpen ws? methodParameters
94+
;
95+
4996
methodOpen
5097
: ws? (visibility ws)? (SUB | FUNCTION | (PROPERTY ws ANYCHARS)) ws ANYCHARS
5198
;
5299

53100
methodParameters
54-
: LPAREN (ANYCHARS | AS | STRINGLITERAL | ws)* RPAREN asType? endOfStatement
101+
: LPAREN (ANYCHARS | AS | STRINGLITERAL | ws)* RPAREN asType?
55102
;
56103

57104
methodClose
58-
: ws? END ws (SUB | FUNCTION | PROPERTY) endOfStatement
105+
: ws? END ws (SUB | FUNCTION | PROPERTY)
59106
;
60107

61-
methodBody
62-
: documentElement*
108+
block
109+
: documentElement+
63110
;
64111

65112
methodDeclaration
66-
: methodOpen
67-
methodParameters
68-
attributeStatement?
69-
methodBody
70-
methodClose
113+
: methodSignature endOfStatement
114+
attributeStatement*
115+
block?
116+
methodClose endOfStatement
71117
;
72118

119+
expression
120+
: (ambiguousComponent | flowCharacter | keywordComponent) ws?
121+
;
122+
123+
doBlockOpen
124+
: ws? DO (ws (WHILE | UNTIL) ws expression+)? endOfStatement
125+
;
126+
127+
doBlockClose
128+
: ws? LOOP (ws (WHILE | UNTIL) ws expression+)? endOfStatement
129+
;
130+
131+
doBlock
132+
: doBlockOpen
133+
block?
134+
doBlockClose
135+
;
136+
137+
whileBlockOpen
138+
: ws? WHILE ws expression+ endOfStatement
139+
;
140+
141+
whileBlockClose
142+
: ws? WEND endOfStatement
143+
;
144+
145+
whileBlock
146+
: whileBlockOpen
147+
block?
148+
whileBlockClose
149+
;
150+
151+
forBlockOpen
152+
: ws? FOR (ws EACH)? ws expression+ endOfStatement
153+
;
154+
155+
forBlockClose
156+
: ws? NEXT (ws expression+)? endOfStatement
157+
;
158+
159+
forBlock
160+
: ws? forBlockOpen
161+
block?
162+
forBlockClose
163+
;
164+
165+
ifBlockOpen
166+
: ws? IF ws expression+ THEN endOfStatement
167+
;
168+
169+
elseIfBlockOpen
170+
: ws? ELSEIF ws expression+ THEN endOfStatement
171+
;
172+
173+
ifBlockDefault
174+
: ws? ELSE endOfStatement
175+
;
176+
177+
ifBlockClose
178+
: ws? END ws IF endOfStatement
179+
;
180+
181+
ifElseBlock
182+
: ifBlockOpen block?
183+
(elseIfBlockOpen block?)*
184+
(ifBlockDefault block?)?
185+
ifBlockClose
186+
;
187+
188+
ifElseStatement
189+
: ws? IF ws expression+ THEN ws expression+ (ELSE ws expression+)? endOfStatement
190+
;
191+
192+
selectCaseOpen
193+
: ws? SELECT ws CASE basicStatement
194+
;
195+
196+
selectCaseClose
197+
: ws? END ws SELECT
198+
;
199+
200+
caseStatement
201+
: ws? CASE (ws IS)? basicStatement?
202+
;
203+
204+
caseDefaultStatement
205+
: ws? CASE ws ELSE endOfStatement
206+
;
207+
208+
caseBlock
209+
: ((caseStatement | caseDefaultStatement) block?)+
210+
;
211+
212+
selectCaseBlock
213+
: selectCaseOpen
214+
caseBlock?
215+
selectCaseClose
216+
;
217+
73218
comment
74-
: ws? (COMMENT | REMCOMMENT) (ws | ANYCHARS)*
219+
: ws? (COMMENT | REMCOMMENT)
75220
;
76221

222+
colonEnding
223+
: COLON
224+
;
225+
226+
lineEnding
227+
: ws? NEWLINE
228+
| endOfFile
229+
;
230+
77231
endOfStatement
78-
: comment? (NEWLINE+ | endOfFile)
232+
: comment? (colonEnding | lineEnding)
79233
;
80234

81235
continuation
@@ -87,6 +241,29 @@ ambiguousComponent
87241
| STRINGLITERAL
88242
;
89243

244+
keywordComponent
245+
: AS
246+
| BEGIN
247+
| DO
248+
| FOR
249+
| FUNCTION
250+
| GLOBAL
251+
| IF
252+
| IS
253+
| NEXT
254+
| PRIVATE
255+
| PROPERTY
256+
| PUBLIC
257+
| THEN
258+
| SUB
259+
| ASSIGNMENT
260+
;
261+
262+
flowCharacter
263+
: LPAREN
264+
| RPAREN
265+
;
266+
90267
ws
91268
: (TAB
92269
| SPACE
@@ -106,6 +283,10 @@ COMMENT
106283

107284
// LEXER RULES
108285

286+
ASSIGNMENT
287+
: ':='
288+
;
289+
109290
STRINGLITERAL
110291
: '"' (~["\r\n] | '""')* '"'
111292
;
@@ -126,14 +307,78 @@ AS
126307
: 'AS'
127308
;
128309
310+
BEGIN
311+
: 'BEGIN'
312+
;
313+
129314
ATTRIBUTE
130315
: 'ATTRIBUTE'
131316
;
132317
318+
DO
319+
: 'DO'
320+
;
321+
322+
LOOP
323+
: 'LOOP'
324+
;
325+
326+
FOR
327+
: 'FOR'
328+
;
329+
330+
EACH
331+
: 'EACH'
332+
;
333+
334+
NEXT
335+
: 'NEXT'
336+
;
337+
338+
WHILE
339+
: 'WHILE'
340+
;
341+
342+
UNTIL
343+
: 'UNTIL'
344+
;
345+
346+
WEND
347+
: 'WEND'
348+
;
349+
350+
IF
351+
: 'IF'
352+
;
353+
354+
IS
355+
: 'IS'
356+
;
357+
358+
ELSE
359+
: 'ELSE'
360+
;
361+
362+
ELSEIF
363+
: 'ELSEIF'
364+
;
365+
366+
THEN
367+
: 'THEN'
368+
;
369+
133370
END
134371
: 'END'
135372
;
136373
374+
SELECT
375+
: 'SELECT'
376+
;
377+
378+
CASE
379+
: 'CASE'
380+
;
381+
137382
ENUM
138383
: 'ENUM'
139384
;
@@ -196,5 +441,5 @@ ANYCHARS
196441
;
197442

198443
fragment ANYCHAR
199-
: ~[\r\n\u2028\u2029 \t\u0019\u3000()]
444+
: ~[\r\n\u2028\u2029 \t\u0019\u3000():]
200445
;

0 commit comments

Comments
 (0)