@@ -11,13 +11,80 @@ startRule
1111 ;
1212
1313document
14- : (documentLines | compilerIfBlock)*
14+ : (documentLines | compilerIfBlock | constDirectiveStatement )*
1515 ;
1616
1717documentLines
1818 : (anyOtherLine | endOfLine)+
1919 ;
2020
21+ constDirectiveName
22+ : ANYCHARS
23+ ;
24+
25+ directiveParenthesizedExpression
26+ : ' (' WS ? directiveExpression WS ? ' )'
27+ ;
28+
29+ directiveUnaryMinusExpression
30+ : ' -' WS ? directiveExpression
31+ ;
32+
33+ directiveLiteralExpression
34+ : DATELITERAL
35+ | FLOATLITERAL
36+ | INTEGERLITERAL
37+ | STRINGLITERAL
38+ | literalIdentifier
39+ ;
40+
41+ literalIdentifier
42+ : booleanLiteralIdentifier
43+ | objectLiteralIdentifier
44+ | variantLiteralIdentifier
45+ ;
46+
47+ booleanLiteralIdentifier
48+ : TRUE
49+ | FALSE
50+ ;
51+
52+ objectLiteralIdentifier
53+ : NOTHING
54+ ;
55+
56+ variantLiteralIdentifier
57+ : EMPTY_X
58+ | NULL_
59+ ;
60+
61+ directiveExpression
62+ : directiveLiteralExpression
63+ | directiveParenthesizedExpression
64+ | directiveUnaryMinusExpression
65+ // | directiveExpression wsc? (divOperator | multOperator) wsc? directiveExpression
66+ // | directiveExpression wsc? modOperator wsc? directiveExpression
67+ // | directiveExpression wsc? (plusOperator | minusOperator) wsc? directiveExpression
68+ // | directiveExpression wsc? ampOperator wsc? directiveExpression
69+ // | directiveExpression wsc? (
70+ // IS
71+ // | LIKE
72+ // | geqOperator
73+ // | leqOperator
74+ // | gtOperator
75+ // | ltOperator
76+ // | neqOperator
77+ // | eqOperator
78+ // ) wsc? directiveExpression
79+ // | notOperatorExpression
80+ // | directiveExpression wsc? (andOperator | orOperator | xorOperator | eqvOperator | impOperator) wsc? directiveExpression
81+ // | lExpression
82+ ;
83+
84+ constDirectiveStatement
85+ : CONST WS constDirectiveName WS ? EQ WS ? directiveExpression endOfStatement
86+ ;
87+
2188compilerIfBlock
2289 : compilerConditionalBlock+
2390 compilerDefaultBlock?
@@ -76,9 +143,18 @@ compilerConstant
76143 | MAC
77144 ;
78145
79- anyWord
80- : ANYCHARS +
81- ;
146+ anyWord : (
147+ ANYCHARS
148+ | EQ
149+ | STRINGLITERAL
150+ | FLOATLITERAL
151+ | DATELITERAL
152+ | TRUE
153+ | FALSE
154+ | NOTHING
155+ | EMPTY_X
156+ | NULL_
157+ )+;
82158
83159anyOtherLine
84160 : (WS * anyWord)+
@@ -112,12 +188,20 @@ NEWLINE
112188 : ([\r\n\u2028\u2029]) (WS * ([\r\n\u2028\u2029]))*
113189 ;
114190
191+ AS
192+ : ' AS'
193+ ;
194+
195+ CONST
196+ : ' #CONST'
197+ ;
198+
115199ELSE
116200 : ' #ELSE'
117201 ;
118202
119203ELSEIF
120- : ' #ELSE IF '
204+ : ' #ELSEIF '
121205 ;
122206
123207ENDIF
@@ -188,6 +272,10 @@ SINGLEQUOTE
188272 : ' \' '
189273 ;
190274
275+ EQ
276+ : ' ='
277+ ;
278+
191279REM
192280 : ' REM'
193281 ;
@@ -216,6 +304,121 @@ NOT
216304 : ' NOT'
217305 ;
218306
307+ NOTHING
308+ : ' NOTHING'
309+ ;
310+
311+ NULL_
312+ : ' NULL'
313+ ;
314+
315+ TRUE
316+ : ' TRUE'
317+ ;
318+
319+ FALSE
320+ : ' FALSE'
321+ ;
322+
323+ EMPTY_X
324+ : ' EMPTY'
325+ ;
326+
327+ STRINGLITERAL
328+ : ' "' (~[" \r\n ] | '" " ')* '" '
329+ ;
330+
331+ INTEGERLITERAL
332+ : (DIGIT DIGIT* | ' &H ' [0-9A-F]+ | ' &' [O]? [0-7]+) [%&^]?
333+ ;
334+
335+ FLOATLITERAL
336+ : FLOATINGPOINTLITERAL [!#@]?
337+ | DECIMALLITERAL [!#@]
338+ ;
339+
340+ fragment FLOATINGPOINTLITERAL
341+ : DECIMALLITERAL [DE] [+-]? DECIMALLITERAL
342+ | DECIMALLITERAL ' .' DECIMALLITERAL? ([DE] [+-]? DECIMALLITERAL)?
343+ | ' .' DECIMALLITERAL ([DE] [+-]? DECIMALLITERAL)?
344+ ;
345+
346+ fragment DECIMALLITERAL
347+ : DIGIT DIGIT*
348+ ;
349+
350+ DATELITERAL
351+ : ' #' DATEORTIME ' #'
352+ ;
353+
354+ fragment DATEORTIME
355+ : DATEVALUE WS+ TIMEVALUE
356+ | DATEVALUE
357+ | TIMEVALUE
358+ ;
359+
360+ fragment DATEVALUE
361+ : DATEVALUEPART DATESEPARATOR DATEVALUEPART (DATESEPARATOR DATEVALUEPART)?
362+ ;
363+
364+ fragment DATEVALUEPART
365+ : DIGIT+
366+ | MONTHNAME
367+ ;
368+
369+ fragment DATESEPARATOR
370+ : WS+
371+ | WS? [/,-] WS?
372+ ;
373+
374+ fragment MONTHNAME
375+ : ENGLISHMONTHNAME
376+ | ENGLISHMONTHABBREVIATION
377+ ;
378+
379+ fragment ENGLISHMONTHNAME
380+ : ' JANUARY '
381+ | ' FEBRUARY '
382+ | ' MARCH '
383+ | ' APRIL '
384+ | ' MAY '
385+ | ' JUNE '
386+ | ' JULY '
387+ | ' AUGUST '
388+ | ' SEPTEMBER '
389+ | ' OCTOBER '
390+ | ' NOVEMBER '
391+ | ' DECEMBER '
392+ ;
393+
394+ // May has intentionally been left out
395+ fragment ENGLISHMONTHABBREVIATION
396+ : ' JAN '
397+ | ' FEB '
398+ | ' MAR '
399+ | ' APR '
400+ | ' JUN '
401+ | ' JUL '
402+ | ' AUG '
403+ | ' SEP '
404+ | ' OCT '
405+ | ' NOV '
406+ | ' DEC '
407+ ;
408+
409+ fragment TIMEVALUE
410+ : DIGIT+ AMPM
411+ | DIGIT+ TIMESEPARATOR DIGIT+ (TIMESEPARATOR DIGIT+)? AMPM?
412+ ;
413+
414+ fragment TIMESEPARATOR
415+ : WS? (' :' | ' .' ) WS?
416+ ;
417+
418+ fragment AMPM
419+ : WS? (' AM ' | ' PM ' | ' A ' | ' P ' )
420+ ;
421+
219422
220423// Any non-whitespace or new line characters.
221424ANYCHARS
@@ -224,4 +427,8 @@ ANYCHARS
224427
225428fragment ANYCHAR
226429 : ~[\r\n\u2028\u2029 \t\u0019\u3000 ]
430+ ;
431+
432+ fragment DIGIT
433+ : [0-9]
227434 ;
0 commit comments