1+ // ******************************************************************************
2+ // * ANTLR 4 LEXER GRAMMAR FOR PEOPLECODE PROGRAMS AND APPLICATION CLASSES
3+ // * by Leandro Baca
4+ // ******************************************************************************
5+ // * NOTE: This version contains C#-specific semantic predicates.
6+ // ******************************************************************************
7+
8+ lexer grammar PeopleCodeLexer;
9+
10+ channels {
11+ API_COMMENTS,
12+ COMMENTS,
13+ DIRECTIVES,
14+ WHITESPACE
15+ }
16+
17+ @header {
18+ using System.Text.RegularExpressions;
19+ }
20+
21+ @members {
22+ private static Regex REGEX_REM = new Regex(" ^rem(ark)?\\ b.*" ,RegexOptions.IgnoreCase | RegexOptions.Singleline);
23+ private static Regex REGEX_3_STAR = new Regex(" ^/\\ *{3}/.*" , RegexOptions.Singleline);
24+ }
25+
26+
27+ // ******************************************************************************
28+ // * DEFAULT MODE
29+ // ******************************************************************************
30+
31+ BLOCK_COMMENT_SLASH
32+ : (
33+ ' /*' ~[*] .*? ' */'
34+ | ' /*' ' *' * ' */'
35+ ) -> channel(COMMENTS )
36+ ;
37+
38+ API_COMMENT : ' /**' ~[/] .*? ' */' {!REGEX_3_STAR.IsMatch(Text)} ? -> channel(API_COMMENTS ) ;
39+ WS : [\p{White_Space} ]+ -> channel(WHITESPACE ) ;
40+ BLOCK_COMMENT_NEST : ' <*' (BLOCK_COMMENT_NEST | .)*? ' *>' -> channel(COMMENTS ) ;
41+ BLOCK_COMMENT_PLUS : ' /+' .*? ' +/' ' ;' ? -> channel(COMMENTS ) ;
42+ LINE_COMMENT : R E M (A R K )? .*? ' ;' {REGEX_REM.IsMatch(Text)} ? -> channel(COMMENTS ) ;
43+ DIR_IF : ' #' IF -> channel(DIRECTIVES ), pushMode(DIRECTIVE ) ;
44+ DIR_ELSE : ' #' ELSE SEMI * -> channel(DIRECTIVES ) ;
45+ DIR_END_IF : ' #' END IF SEMI * -> channel(DIRECTIVES ) ;
46+
47+ ABSTRACT : A B S T R A C T ;
48+ ADD : ' +' ;
49+ ALIAS : A L I A S ;
50+ AND : A N D ;
51+ ARRAY : A R R A Y ;
52+ AS : A S ;
53+ AT : ' @' ;
54+ BREAK : B R E A K ;
55+ CATCH : C A T C H ;
56+ CLASS : C L A S S ;
57+ COLON : ' :' ;
58+ COMMA : ' ,' ;
59+
60+ COMPONENT
61+ : C O M P O N E N T L I F E
62+ | C O M P O N E N T
63+ | P A N E L G R O U P
64+ ;
65+
66+ CONSTANT : C O N S T A N T ;
67+ CONTINUE : C O N T I N U E ;
68+ CREATE : C R E A T E ;
69+ DECLARE : D E C L A R E ;
70+ DOC : D O C ;
71+ DIV : ' /' ;
72+ DOT : ' .' ;
73+ ELSE : E L S E ;
74+ END_CLASS : END CLASS ;
75+ END_EVALUATE : END EVALUATE ;
76+ END_FOR : END FOR ;
77+ END_GET : END GET ;
78+ END_IF : END IF ;
79+ END_INTERFACE : END INTERFACE ;
80+ END_METHOD : END METHOD ;
81+ END_SET : END SET ;
82+ END_TRY : END TRY ;
83+ END_WHILE : END WHILE ;
84+ EQ : ' =' ;
85+ ERROR : E R R O R ;
86+ EVALUATE : E V A L U A T E ;
87+ EXCEPTION : E X C E P T I O N ;
88+ EXIT : E X I T ;
89+ EXP : ' **' ;
90+ EXTENDS : E X T E N D S ;
91+ FOR : F O R ;
92+ FUNCTION : F U N C T I O N ;
93+ END_FUNCTION : END FUNCTION ;
94+ GE : ' >=' ;
95+ GET : G E T ;
96+ GLOBAL : G L O B A L ;
97+ GT : ' >' ;
98+ IF : I F ;
99+ IMPLEMENTS : I M P L E M E N T S ;
100+ IMPORT : I M P O R T ;
101+ INSTANCE : I N S T A N C E ;
102+ INTERFACE : I N T E R F A C E ;
103+ INTEGER : I N T E G E R ;
104+ LBRACKET : ' [' ;
105+ LE : ' <=' ;
106+ LIBRARY : L I B R A R Y ;
107+ LOCAL : L O C A L ;
108+ LPAREN : ' (' ;
109+ LT : ' <' ;
110+ METHOD : M E T H O D ;
111+
112+ NEQ
113+ : ' <>'
114+ | ' !='
115+ ;
116+
117+ NOT : N O T ;
118+ NULL : N U L L ;
119+ OF : O F ;
120+ OR : O R ;
121+ OUT : O U T ;
122+ PEOPLECODE : P E O P L E C O D E ;
123+ PRIVATE : P R I V A T E ;
124+ PROPERTY : P R O P E R T Y ;
125+ PROTECTED : P R O T E C T E D ;
126+ RBRACKET : ' ]' ;
127+ READONLY : R E A D O N L Y ;
128+ REF : R E F ;
129+ REPEAT : R E P E A T ;
130+ RETURN : R E T U R N ;
131+ RETURNS : R E T U R N S ;
132+ RPAREN : ' )' ;
133+ SEMI : ' ;' ;
134+ SET : S E T ;
135+ STAR : ' *' ;
136+ STEP : S T E P ;
137+ SUBTR : ' -' ;
138+ SUPER : ' %' S U P E R ;
139+ THEN : T H E N ;
140+ THROW : T H R O W ;
141+ TO : T O ;
142+ TRY : T R Y ;
143+ UNTIL : U N T I L ;
144+ VALUE : V A L U E ;
145+ WARNING : W A R N I N G ;
146+ WHEN : W H E N ;
147+ WHEN_OTHER : W H E N ' -' O T H E R ;
148+ WHILE : W H I L E ;
149+ ANY : A N Y ;
150+ BOOLEAN : B O O L E A N ;
151+ DATE : D A T E ;
152+ DATETIME : D A T E T I M E ;
153+ FLOAT : F L O A T ;
154+ NUMBER : N U M B E R ;
155+ STRING : S T R I N G ;
156+ TIME : T I M E ;
157+ PIPE : ' |' ;
158+ METADATA : ' %' M E T A D A T A ;
159+
160+ DecimalLiteral : IntegerLiteral? ' .' [0-9]+ ;
161+ IntegerLiteral : ' -' ? [0-9]+ ;
162+
163+ StringLiteral
164+ : ' "' (~' "' |' ""' )* ' "'
165+ | ' \' ' (~' \' ' |' \'\' ' )* ' \' '
166+ ;
167+
168+ BooleanLiteral
169+ : T R U E
170+ | F A L S E
171+ ;
172+
173+ RecordEvent
174+ : F I E L D D E F A U L T
175+ | F I E L D E D I T
176+ | F I E L D C H A N G E
177+ | F I E L D F O R M U L A
178+ | R O W I N I T
179+ | R O W I N S E R T
180+ | R O W D E L E T E
181+ | R O W S E L E C T
182+ | S A V E E D I T
183+ | S A V E P R E C H A N G E
184+ | S A V E P O S T C H A N G E
185+ | S E A R C H I N I T
186+ | S E A R C H S A V E
187+ | W O R K F L O W
188+ | P R E P O P U P
189+ ;
190+
191+ SYSTEM_VARIABLE : ' %' A L L O W N O T I F I C A T I O N
192+ | ' %' A L L O W R E C I P I E N T L O O K U P
193+ | ' %' A P P L I C A T I O N L O G F E N C E
194+ | ' %' A S O F D A T E
195+ | ' %' A U T H E N T I C A T I O N T O K E N
196+ | ' %' B P N A M E
197+ | ' %' C L I E N T D A T E
198+ | ' %' C L I E N T T I M E Z O N E
199+ | ' %' C O M P I N T F C N A M E
200+ | ' %' C O M P O N E N T
201+ | ' %' C O N T E N T I D
202+ | ' %' C O N T E N T T Y P E
203+ | ' %' C O P Y R I G H T
204+ | ' %' C U R R E N C Y
205+ | ' %' D A T E
206+ | ' %' D A T E T I M E
207+ | ' %' D B N A M E
208+ | ' %' D B S E R V E R N A M E
209+ | ' %' D B T Y P E
210+ | ' %' E M A I L A D D R E S S
211+ | ' %' E M P L O Y E E I D
212+ | ' %' E X T E R N A L A U T H I N F O
213+ | ' %' F I L E P A T H
214+ | ' %' H P T A B N A M E
215+ | ' %' I M P O R T
216+ | ' %' I N T B R O K E R
217+ | ' %' I S M U L T I L A N G U A G E E N A B L E D
218+ | ' %' L A N G U A G E
219+ | ' %' L A N G U A G E ' _' B A S E
220+ | ' %' L A N G U A G E ' _' D A T A
221+ | ' %' L A N G U A G E ' _' U S E R
222+ | ' %' L O C A L N O D E
223+ | ' %' M A P ' _' M A R K E T
224+ | ' %' M A R K E T
225+ | ' %' M A X M E S S A G E S I Z E
226+ | ' %' M A X N B R S E G M E N T S
227+ | ' %' M E N U
228+ | ' %' M O D E
229+ | ' %' N A V I G A T O R H O M E P E R M I S S I O N L I S T
230+ | ' %' N O D E
231+ | ' %' O P E R A T O R C L A S S
232+ | ' %' O P E R A T O R I D
233+ | ' %' O P E R A T O R R O W L E V E L S E C U R I T Y C L A S S
234+ | ' %' O U T D E S T F O R M A T
235+ | ' %' O U T D E S T T Y P E
236+ | ' %' P A G E
237+ | ' %' P A N E L
238+ | ' %' P A N E L G R O U P
239+ | ' %' P A S S W O R D E X P I R E D
240+ | ' %' P E R F T I M E
241+ | ' %' P E R M I S S I O N L I S T S
242+ | ' %' P I D
243+ | ' %' P O R T A L
244+ | ' %' P R I M A R Y P E R M I S S I O N L I S T
245+ | ' %' P R O C E S S P R O F I L E P E R M I S S I O N L I S T
246+ | ' %' P S A U T H R E S U L T
247+ | ' %' R E Q U E S T
248+ | ' %' R E S P O N S E
249+ | ' %' R E S U L T D O C U M E N T
250+ | ' %' R O L E S
251+ | ' %' R O W S E C U R I T Y P E R M I S S I O N L I S T
252+ | ' %' R U N N I N G I N P O R T A L
253+ | ' %' S E R V E R T I M E Z O N E
254+ | ' %' S E S S I O N
255+ | ' %' S I G N O N U S E R I D
256+ | ' %' S I G N O N U S E R P S W D
257+ | ' %' S M T P B L A C K B E R R Y R E P L Y T O
258+ | ' %' S M T P G U A R A N T E E D
259+ | ' %' S M T P S E N D E R
260+ | ' %' S Q L R O W S
261+ | ' %' T H I S
262+ | ' %' T I M E
263+ | ' %' T R A N S F O R M D A T A
264+ | ' %' U S E R D E S C R I P T I O N
265+ | ' %' U S E R I D
266+ | ' %' W L I N S T A N C E I D
267+ | ' %' W L N A M E
268+ ;
269+
270+ SYSTEM_CONSTANT : ' %' GENERIC_ID_LIMITED ; // also catches any system variables that may be defined in future versions of PeopleTools
271+ GENERIC_ID_LIMITED : [a-zA-Z_ \p{Alpha} \p{General_Category=Other_Letter} ] ID_CHAR * ;
272+ GENERIC_ID : ID_1ST_CHAR ID_CHAR * ;
273+ USER_VARIABLE : ' &' ID_CHAR + ;
274+
275+ fragment END : E N D ' -' ;
276+ fragment ID_1ST_CHAR : [0-9a-zA-Z_ #$\p{Alnum} \p{General_Category=Other_Letter} ] ;
277+ fragment ID_CHAR : ID_1ST_CHAR | ' @' ;
278+ fragment CRLF : ' \r ' ? ' \n ' ; // all line feed characters would be [\r\n\u000B\f\u0085\u2028\u2029]
279+ // fragment HWS : [ \t\u00A0\u1680\u2000-\u200A\u202F\u205F\u3000] ; // horizontal whitespace characters
280+
281+ /* case insensitive lexer matching */
282+ fragment A : ' a' | ' A' ;
283+ fragment B : ' b' | ' B' ;
284+ fragment C : ' c' | ' C' ;
285+ fragment D : ' d' | ' D' ;
286+ fragment E : ' e' | ' E' ;
287+ fragment F : ' f' | ' F' ;
288+ fragment G : ' g' | ' G' ;
289+ fragment H : ' h' | ' H' ;
290+ fragment I : ' i' | ' I' ;
291+ fragment J : ' j' | ' J' ;
292+ fragment K : ' k' | ' K' ;
293+ fragment L : ' l' | ' L' ;
294+ fragment M : ' m' | ' M' ;
295+ fragment N : ' n' | ' N' ;
296+ fragment O : ' o' | ' O' ;
297+ fragment P : ' p' | ' P' ;
298+ fragment Q : ' q' | ' Q' ;
299+ fragment R : ' r' | ' R' ;
300+ fragment S : ' s' | ' S' ;
301+ fragment T : ' t' | ' T' ;
302+ fragment U : ' u' | ' U' ;
303+ fragment V : ' v' | ' V' ;
304+ fragment W : ' w' | ' W' ;
305+ fragment X : ' x' | ' X' ;
306+ fragment Y : ' y' | ' Y' ;
307+ fragment Z : ' z' | ' Z' ;
308+
309+
310+ // ******************************************************************************
311+ // * DIRECTIVE PEOPLECODE MODE
312+ // ******************************************************************************
313+
314+ mode DIRECTIVE ;
315+
316+ DIR_WS : [\p{White_Space} ]+ -> channel(WHITESPACE ) ;
317+ DIR_THEN : ' #' THEN SEMI * -> channel(DIRECTIVES ), popMode ;
318+ // DIR_TOOLSREL : '#' T O O L S R E L -> channel(DIRECTIVES) ;
319+ // DIR_AND : '&&' -> channel(DIRECTIVES) ;
320+ // DIR_OR : '||' -> channel(DIRECTIVES) ;
321+ DIR_ATOM : ~[\p{White_Space} ]+ -> channel(DIRECTIVES ) ;
0 commit comments