@@ -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+
2030basicStatement
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
2838documentElement
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
3556attributeStatement
@@ -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+
4996methodOpen
5097 : ws? (visibility ws)? (SUB | FUNCTION | (PROPERTY ws ANYCHARS )) ws ANYCHARS
5198 ;
5299
53100methodParameters
54- : LPAREN (ANYCHARS | AS | STRINGLITERAL | ws)* RPAREN asType? endOfStatement
101+ : LPAREN (ANYCHARS | AS | STRINGLITERAL | ws)* RPAREN asType?
55102 ;
56103
57104methodClose
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
65112methodDeclaration
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+
73218comment
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+
77231endOfStatement
78- : comment? (NEWLINE + | endOfFile )
232+ : comment? (colonEnding | lineEnding )
79233 ;
80234
81235continuation
@@ -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+
90267ws
91268 : (TAB
92269 | SPACE
@@ -106,6 +283,10 @@ COMMENT
106283
107284// LEXER RULES
108285
286+ ASSIGNMENT
287+ : ' :='
288+ ;
289+
109290STRINGLITERAL
110291 : ' "' (~[" \r\n ] | '" " ')* '" '
111292 ;
126307 : ' AS '
127308 ;
128309
310+ BEGIN
311+ : ' BEGIN '
312+ ;
313+
129314ATTRIBUTE
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+
133370END
134371 : ' END '
135372 ;
136373
374+ SELECT
375+ : ' SELECT '
376+ ;
377+
378+ CASE
379+ : ' CASE '
380+ ;
381+
137382ENUM
138383 : ' ENUM '
139384 ;
@@ -196,5 +441,5 @@ ANYCHARS
196441 ;
197442
198443fragment ANYCHAR
199- : ~[\r\n\u2028\u2029 \t\u0019\u3000()]
444+ : ~[\r\n\u2028\u2029 \t\u0019\u3000(): ]
200445 ;
0 commit comments