source: CIVL/mods/dev.civl.abc/grammar/mfortran/MFortranLexer.g@ 1aaefd4

1.23 2.0 main test-branch
Last change on this file since 1aaefd4 was aad342c, checked in by Stephen Siegel <siegel@…>, 3 years ago

Performing huge refactor to incorporate ABC, GMC, and SARL into CIVL repo and use Java modules.

git-svn-id: svn://vsl.cis.udel.edu/civl/trunk@5664 fb995dde-84ed-4084-dfe6-e5aef3e2452c

  • Property mode set to 100644
File size: 15.4 KB
Line 
1lexer grammar MFortranLexer;
2
3options {
4 tokenVocab=MFortranLexer;
5}
6
7@header {
8/**
9 * Copyright (c) 2005, 2006 Los Alamos National Security, LLC. This
10 * material was produced under U.S. Government contract DE-
11 * AC52-06NA25396 for Los Alamos National Laboratory (LANL), which is
12 * operated by the Los Alamos National Security, LLC (LANS) for the
13 * U.S. Department of Energy. The U.S. Government has rights to use,
14 * reproduce, and distribute this software. NEITHER THE GOVERNMENT NOR
15 * LANS MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES ANY
16 * LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified to
17 * produce derivative works, such modified software should be clearly
18 * marked, so as not to confuse it with the version available from
19 * LANL.
20 *
21 * Additionally, this program and the accompanying materials are made
22 * available under the terms of the Eclipse Public License v1.0 which
23 * accompanies this distribution, and is available at
24 * http://www.eclipse.org/legal/epl-v10.html
25 */
26
27/**
28 *
29 * @author Craig E Rasmussen, Christopher D. Rickett, Jeffrey Overbey
30 */
31
32
33package dev.civl.abc.front.fortran.preproc;
34
35}
36
37/*
38 * Lexer rules
39 */
40
41/*
42 * Note: antlr sometimes has LL(*) failures with the grammars, but not always.
43 * it seems that it may be the timeout issue that was mentioned..
44 */
45
46// Support for language extension points
47NO_LANG_EXT
48 : {false}? 'no extension' ; // can't be recognized
49
50EOS : ';'
51 | ('\r')? ('\n') ;
52
53/* if this is a fragment, the generated code never seems to execute the
54 * action. the action needs to set the flag so EOS knows whether it should
55 * be channel 99'ed or not (ignore EOS if continuation is true, which is the
56 * case of the & at the end of a line).
57 */
58CONTINUE_CHAR
59 : '&' ;
60
61// R427 from char-literal-constant
62CHAR_CONST
63 : ('\'' ( ~('\'') )* '\'')+
64 | ('\"' ( ~('\"') )* '\"')+ ;
65
66DIGIT_STR
67 : Digit+ ;
68
69// R412
70BIN_CONST
71 : ('b'|'B') '\'' ('0'..'1')+ '\''
72 | ('b'|'B') '\"' ('0'..'1')+ '\"' ;
73
74// R413
75OCT_CONST
76 : ('o'|'O') '\'' ('0'..'7')+ '\''
77 | ('o'|'O') '\"' ('0'..'7')+ '\"' ;
78
79// R414
80HEX_CONST
81 : ('z'|'Z') '\'' (Digit|'a'..'f'|'A'..'F')+ '\''
82 | ('z'|'Z') '\"' (Digit|'a'..'f'|'A'..'F')+ '\"' ;
83
84WS : (' '|'\r'|'\t'|'\u000C') ;
85
86/*
87 * fragments
88 */
89
90// R409 digit_string
91//fragment
92//Digits : Digit+ ;
93//
94// R302 alphanumeric_character
95//fragment
96//Gen_Char : Letter | Digit | '_' ;
97//
98//fragment
99//Rep_Char : ~('\'' | '\"') ;
100//
101//fragment
102//SQ_Rep_Char : ~('\'') ;
103//
104//fragment
105//DQ_Rep_Char : ~('\"') ;
106
107fragment
108Sp_Char : ' ' .. '/'
109 | ':' .. '@'
110 | '[' .. '^'
111 | '`'
112 | '{' .. '~' ;
113
114
115fragment
116Letter : ('a'..'z' | 'A'..'Z') ;
117
118fragment
119Digit : '0'..'9' ;
120
121
122/*
123 * from fortran03_lexer.g
124 */
125
126ASTERISK : '*' ;
127COLON : ':' ;
128COLON_COLON : '::' ;
129COMMA : ',' ;
130EQUALS : '=' ;
131EQ_EQ : '==' ;
132EQ_GT : '=>' ;
133GREATERTHAN : '>' ;
134GREATERTHAN_EQ : '>=' ;
135LESSTHAN : '<' ;
136LESSTHAN_EQ : '<=' ;
137LBRACKET : '[' ;
138LPAREN : '(' ;
139MINUS : '-' ;
140PERCENT : '%' ;
141PLUS : '+' ;
142POWER : '**' ;
143SLASH : '/' ;
144SLASH_EQ : '/=' ;
145SLASH_SLASH : '//' ;
146RBRACKET : ']' ;
147RPAREN : ')' ;
148UNDERSCORE : '_' ;
149EQ : '.EQ.' ;
150NE : '.NE.' ;
151LT : '.LT.' ;
152LE : '.LE.' ;
153GT : '.GT.' ;
154GE : '.GE.' ;
155TRUE : '.TRUE.' ;
156FALSE : '.FALSE.' ;
157NOT : '.NOT.' ;
158AND : '.AND.' ;
159OR : '.OR.' ;
160EQV : '.EQV.' ;
161NEQV : '.NEQV.' ;
162PERIOD : '.' ;
163PERIOD_EXPONENT : '.' ('0'..'9')+
164 ('E' | 'e' | 'd' | 'D')
165 ('+' | '-')? ('0'..'9')+
166 | '.' ('E' | 'e' | 'd' | 'D')
167 ('+' | '-')? ('0'..'9')+
168 | '.' ('0'..'9')+
169 | ('0'..'9')+
170 ('e' | 'E' | 'd' | 'D')
171 ('+' | '-')? ('0'..'9')+ ;
172
173// begin keyword section (all keywords must appear below
174//ASSIGN : 'ASSIGN' ; /* DELETED */
175
176INTEGER : 'INTEGER' ;
177REAL : 'REAL' ;
178COMPLEX : 'COMPLEX' ;
179CHARACTER : 'CHARACTER' ;
180LOGICAL : 'LOGICAL' ;
181ABSTRACT : 'ABSTRACT' ;
182ACQUIRED_LOCK : 'ACQUIRED_LOCK' ; /* F2008 */
183ALL : 'ALL' ; /* F2008 */
184ALLOCATABLE : 'ALLOCATABLE' ;
185ALLOCATE : 'ALLOCATE' ;
186ASSIGNMENT : 'ASSIGNMENT' ;
187ASSOCIATE : 'ASSOCIATE' ;
188ASYNCHRONOUS : 'ASYNCHRONOUS' ;
189BACKSPACE : 'BACKSPACE' ;
190BIND : 'BIND' ;
191BLOCK : 'BLOCK' ;
192BLOCKDATA : 'BLOCKDATA' ;
193CALL : 'CALL' ;
194CASE : 'CASE' ;
195CHANGE : 'CHANGE' ;
196CLASS : 'CLASS' ;
197CLOSE : 'CLOSE' ;
198CODIMENSION : 'CODIMENSION' ;
199COMMON : 'COMMON' ;
200CONCURRENT : 'CONCURRENT' ;
201CONTAINS : 'CONTAINS' ;
202CONTIGUOUS : 'CONTIGUOUS' ;
203CONTINUE : 'CONTINUE' ;
204CRITICAL : 'CRITICAL' ;
205CYCLE : 'CYCLE' ;
206DATA : 'DATA' ;
207DEFAULT : 'DEFAULT' ;
208DEALLOCATE : 'DEALLOCATE' ;
209DEFERRED : 'DEFERRED' ;
210DIMENSION : 'DIMENSION' ;
211DO : 'DO' ;
212DOUBLE : 'DOUBLE' ;
213DOUBLEPRECISION : 'DOUBLEPRECISION' ;
214DOUBLECOMPLEX : 'DOUBLECOMPLEX' ;
215ELEMENTAL : 'ELEMENTAL' ;
216ELSE : 'ELSE' ;
217ELSEIF : 'ELSEIF' ;
218ELSEWHERE : 'ELSEWHERE' ;
219ENTRY : 'ENTRY' ;
220ENUM : 'ENUM' ;
221ENUMERATOR : 'ENUMERATOR' ;
222ERRMSG : 'ERRMSG' ;
223ERROR : 'ERROR' ;
224EQUIVALENCE : 'EQUIVALENCE' ;
225EVENT : 'EVENT' ; /* F2018 */
226EVENTWAIT : 'EVENTWAIT' ; /* F2018 */
227EXIT : 'EXIT' ;
228EXTENDS : 'EXTENDS' ;
229EXTERNAL : 'EXTERNAL' ;
230FAIL : 'FAIL' ;
231FAILIMAGE : 'FAILIMAGE' ;
232FILE : 'FILE' ;
233FINAL : 'FINAL' ;
234FLUSH : 'FLUSH' ;
235FORALL : 'FORALL' ;
236FORM : 'FORM' ;
237FORMAT : 'FORMAT' ;
238FORMATTED : 'FORMATTED' ;
239FORMTEAM : 'FORMTEAM' ;
240FUNCTION : 'FUNCTION' ;
241GENERIC : 'GENERIC' ;
242GO : 'GO' ;
243GOTO : 'GOTO' ;
244IF : 'IF' ;
245IMAGE : 'IMAGE' ;
246IMAGES : 'IMAGES' ;
247IMPLICIT : 'IMPLICIT' ;
248IMPORT : 'IMPORT' ;
249IMPURE : 'IMPURE' ;
250IN : 'IN' ;
251INOUT : 'INOUT' ;
252INTENT : 'INTENT' ;
253INTERFACE : 'INTERFACE' ;
254INTRINSIC : 'INTRINSIC' ;
255INQUIRE : 'INQUIRE' ;
256IS : 'IS' ;
257KIND : 'KIND' ;
258LEN : 'LEN' ;
259LOCAL : 'LOCAL' ;
260LOCAL_INT : 'LOCAL_INT' ;
261LOCK : 'LOCK' ; /* F2008 */
262MEMORY : 'MEMORY' ;
263MODULE : 'MODULE' ;
264MOLD : 'MOLD' ;
265NAMELIST : 'NAMELIST' ;
266NONE : 'NONE' ;
267NON_INTRINSIC : 'NON_INTRINSIC' ;
268NON_OVERRIDABLE : 'NON_OVERRIDABLE' ;
269NON_RECURSIVE : 'NON_RECURSIVE' ;
270NOPASS : 'NOPASS' ;
271NULLIFY : 'NULLIFY' ;
272ONLY : 'ONLY' ;
273OPEN : 'OPEN' ;
274OPERATOR : 'OPERATOR' ;
275OPTIONAL : 'OPTIONAL' ;
276OUT : 'OUT' ;
277PARAMETER : 'PARAMETER' ;
278PASS : 'PASS' ;
279PAUSE : 'PAUSE' ;
280POINTER : 'POINTER' ;
281POST : 'POST' ;
282PRINT : 'PRINT' ;
283PRECISION : 'PRECISION' ;
284PRIVATE : 'PRIVATE' ;
285PROCEDURE : 'PROCEDURE' ;
286PROGRAM : 'PROGRAM' ;
287PROTECTED : 'PROTECTED' ;
288PUBLIC : 'PUBLIC' ;
289PURE : 'PURE' ;
290QUIET : 'QUIET' ;
291RANK : 'RANK' ;
292READ : 'READ' ;
293RECURSIVE : 'RECURSIVE' ;
294RESULT : 'RESULT' ;
295RETURN : 'RETURN' ;
296REWIND : 'REWIND' ;
297SAVE : 'SAVE' ;
298SELECT : 'SELECT' ;
299SELECTCASE : 'SELECTCASE' ;
300SELECTTYPE : 'SELECTTYPE' ;
301SEQUENCE : 'SEQUENCE' ;
302SHARED : 'SHARED' ;
303STAT : 'STAT' ;
304STOP : 'STOP' ;
305SOURCE : 'SOURCE' ;
306SUBMODULE : 'SUBMODULE' ;
307SUBROUTINE : 'SUBROUTINE' ;
308SYNC : 'SYNC' ; /* F2008 */
309SYNCTEAM : 'SYNCTEAM' ;
310TARGET : 'TARGET' ;
311TEAM : 'TEAM' ; /* F2018 */
312THEN : 'THEN' ;
313TO : 'TO' ;
314TYPE : 'TYPE' ;
315UNFORMATTED : 'UNFORMATTED' ;
316UNLOCK : 'UNLOCK' ; /* F2008 */
317USE : 'USE' ;
318VALUE : 'VALUE' ;
319VOLATILE : 'VOLATILE' ;
320WAIT : 'WAIT' ;
321WHERE : 'WHERE' ;
322WHILE : 'WHILE' ;
323WRITE : 'WRITE' ;
324
325// these tokens (without blank characters) are from 3.3.2.2
326// All keywords commented out are separated as two tokens by converter
327//ENDASSOCIATE : 'ENDASSOCIATE' ;
328//ENDBLOCK : 'ENDCOTARGETBLOCK' ;
329//ENDBLOCKDATA : 'ENDBLOCKDATA' ;
330//ENDCRITICAL : 'ENDCRITICAL' ;
331//ENDDO : 'ENDDO' ;
332//ENDENUM : 'ENDENUM' ;
333//ENDFILE : 'ENDFILE' ;
334//ENDFORALL : 'ENDFORALL' ;
335//ENDFUNCTION : 'ENDFUNCTION' ;
336//ENDIF : 'ENDIF' ;
337//ENDMODULE : 'ENDMODULE' ;
338//ENDINTERFACE : 'ENDINTERFACE' ;
339//ENDPROCEDURE : 'ENDPROCEDURE' ;
340//ENDPROGRAM : 'ENDPROGRAM' ;
341//ENDSELECT : 'ENDSELECT' ;
342//ENDSUBMODULE : 'ENDSUBMODULE' ;
343//ENDSUBROUTINE : 'ENDSUBROUTINE' ;
344//ENDTEAM : 'ENDTEAM' ;
345//ENDTYPE : 'ENDTYPE' ;
346//ENDWHERE : 'ENDWHERE' ;
347END : 'END' ;
348
349// End keyword section (all keywords must appear above
350
351PREPROCESS_LINE : '#' ~('\n'|'\r')* ;
352INCLUDE
353options {k=1;} : 'INCLUDE' ;
354
355
356// Must come after .EQ. (for example) or will get matched first
357// TODO:: this may have to be done in the parser w/ a rule such as:
358// PERIOD IDENT PERIOD
359DEFINED_OP : '.' Letter+ '.' ;
360
361
362// Note: Hollerith constants were deleted in F77; Hollerith edit descriptors
363// deleted in F95.
364//
365// T_HOLLERITH : Digit+ 'H' ;
366//
367// used to catch edit descriptors and other situations
368// T_ID_OR_OTHER : 'ID_OR_OTHER' ;
369//
370//M_ARITHMETIC_IF_STMT : '__ARITHMETIC_IF_STMT__' ;
371
372STMT_FUNCTION : 'STMT_FUNCTION' ;
373
374// extra, context-sensitive terminals that require communication between parser and scanner
375// added the underscores so there is no way this could overlap w/ any valid
376// idents in Fortran. we just need this token to be defined so we can
377// create one of them while we're fixing up labeled do stmts.
378M_LBL_DO_TERMINAL : '__LABEL_DO_TERMINAL__' ;
379M_DATA_EDIT_DESC : '__DATA_EDIT_DESC__' ;
380M_CTRL_EDIT_DESC : '__CTRL_EDIT_DESC__' ;
381M_CSTR_EDIT_DESC : '__CSTR_EDIT_DESC__' ;
382M_ASSIGNMENT_STMT : '__ASSIGNMENT_STMT__' ;
383M_PTR_ASSIGNMENT_STMT : '__PTR_ASSIGNMENT_STMT__' ;
384M_ALLOCATE_STMT_1 : '__ALLOCATE_STMT_1__' ;
385M_WHERE_STMT : '__WHERE_STMT__' ;
386M_IF_STMT : '__IF_STMT__' ;
387M_FORALL_STMT : '__FORALL_STMT__' ;
388M_WHERE_CONSTRUCT_STMT : '__WHERE_CONSTRUCT_STMT__' ;
389M_FORALL_CONSTRUCT_STMT : '__FORALL_CONSTRUCT_STMT__' ;
390M_INQUIRE_STMT_2 : '__INQUIRE_STMT_2__' ;
391// text for the real constant will be set
392// when a token of this type is created by the prepass.
393M_REAL_CONST : '__REAL_CONST__' ;
394M_INCLUDE_NAME : '__INCLUDE_NAME__' ;
395M_EOF : '__EOF__' ;
396
397
398// R304
399IDENT
400options {k=1;} : Letter ( Letter | Digit | '_' )* ;
401
402
403// Used in format-item processing. This token is replaced by an edit
404// descriptor in the prepass (by FortranLexicalPrepass). It doesn't really
405// matter what this token contains because the format string is parsed
406// as a string in the lexical prepass. The goal is to keep the lexer from
407// bombing on strings like 2es15.6 and also not interfer with real literal
408// constants and Holleriths.
409
410EDIT_DESC_MISC : Digit+
411 ( ('e'|'E') (('n'|'N') | ('s'|'S')) )
412 ( Letter | Digit | '_' )* ;
413
414LINE_COMMENT : '!' ~('\n'|'\r'|'$')* ;
415
416/* Need a catch-all rule because of fixed-form being allowed to use any
417 character in column 6 to designate a continuation. */
418MISC_CHAR : ~('\n' | '\r') ;
419
420PRAGMA : '!$' ;
421
422CIVL_PRIMITIVE : '$' Letter+ ;
Note: See TracBrowser for help on using the repository browser.