Advertisement
Forceisthop

Untitled

Dec 7th, 2023
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 111.50 KB | None | 0 0
  1. grammar hello;
  2.  
  3.  
  4. /*
  5. : EOS;
  6. commentOrNewLine : COMMENTORNEWLINE ;*/
  7. @header{
  8. import ast.*;
  9. }
  10.  
  11. start returns [ASTNode node]
  12. : p = executableProgram EOF { $node = new Start($p.node); }
  13. ;
  14.  
  15. executableProgram returns [ProgramNode node]
  16. : pul = programUnitList { $node = new ExecutableProgram($pul.node); }
  17. ;
  18.  
  19. programUnitList returns [ProgramUnitListNode node]
  20. : pu = programUnit { $node = new ProgramUnitListSingle($pu.node); }
  21. | pu = programUnit pul = programUnitList { $node = new ProgramUnitListMultiple($pu.node, $pul.node); }
  22. ;
  23.  
  24. programUnit returns [ProgramUnitNode node]
  25. : mp = mainProgram { $node = new ProgramUnitMain($mp.node); }
  26. | fs = functionSubprogram { $node = new ProgramUnitFunction($fs.node); }
  27. | ss = subroutineSubprogram { $node = new ProgramUnitSubroutine($ss.node); }
  28. | bd = blockDataSubprogram { $node = new ProgramUnitBlockData($bd.node); }
  29. | m = module { $node = new ProgramUnitModule($m.node); }
  30. ;
  31.  
  32. mainProgram returns [MainProgramNode node]
  33. : ps = programStmt mr = mainRange { $node = new MainProgram($ps.node, $mr.node); }
  34. | mr = mainRange { $node = new MainProgram(null, $mr.node); }
  35. ;
  36.  
  37. programStmt returns [ProgramStmtNode node]
  38. : PROGRAM id = identifier { $node = new ProgramStmt($id.node); }
  39. ;
  40. identifier returns [IdentifierNode node]
  41. : IDENT{ $node = new Identifier($IDENT.text); }
  42. ;
  43.  
  44. mainRange returns [MainRangeNode node]
  45. : b = body e = endProgramStmt { $node = new MainRange($b.node, $e.node); }
  46. // Other alternatives for mainRange
  47. | endProgramStmt
  48. | (bodyPlusInternals endProgramStmt) ;
  49.  
  50. bodyPlusInternals returns [BodyPlusInternalsNode node]
  51. : b = body cs = containsStmt isp = internalSubprogram { $node = new BodyPlusInternalsType1($b.node, $cs.node, $isp.node); }
  52. | cs = containsStmt isp = internalSubprogram { $node = new BodyPlusInternalsType2($cs.node, $isp.node); }
  53. | bpi = bodyPlusInternals isp = internalSubprogram { $node = new BodyPlusInternalsType3($bpi.node, $isp.node); }
  54. ;
  55.  
  56. internalSubprogram returns [InternalSubprogramNode node]
  57. : fs = functionSubprogram { $node = new InternalSubprogramFunction($fs.node); }
  58. | ss = subroutineSubprogram { $node = new InternalSubprogramSubroutine($ss.node); }
  59. ;
  60.  
  61. specificationPartConstruct returns [SpecificationPartConstructNode node]
  62. : is = implicitStmt { $node = new SpecificationPartConstructImplicit($is.node); }
  63. | ps = parameterStmt { $node = new SpecificationPartConstructParameter($ps.node); }
  64. | fs = formatStmt { $node = new SpecificationPartConstructFormat($fs.node); }
  65. | es = entryStmt { $node = new SpecificationPartConstructEntry($es.node); }
  66. | dc = declarationConstruct { $node = new SpecificationPartConstructDeclaration($dc.node); }
  67. | is = includeStmt { $node = new SpecificationPartConstructInclude($is.node); }
  68. | us = useStmt { $node = new SpecificationPartConstructUse($us.node); }
  69. ;
  70.  
  71. useStmt returns [UseStmtNode node]
  72. : USE n = NAME { $node = new UseStmtSimple($n.node); }
  73. | USE n = NAME COMMA ONLY COLON { $node = new UseStmtOnlyColon($n.node); }
  74. | USE n = NAME COMMA rl = renameList { $node = new UseStmtRenameList($n.node, $rl.node); }
  75. | USE n = NAME COMMA ONLY COLON ol = onlyList { $node = new UseStmtOnlyList($n.node, $ol.node); }
  76. ;
  77.  
  78. onlyList returns [OnlyListNode node]
  79. : os = onlyStmt { $node = new OnlyListSingle($os.node); }
  80. | os = onlyStmt osl = onlyStmtList { $node = new OnlyListMultiple($os.node, $osl.node); }
  81. ;
  82.  
  83. onlyStmtList returns [OnlyStmtListNode node]
  84. : COMMA os = onlyStmt { $node = new OnlyStmtListSingle($os.node); }
  85. | COMMA os = onlyStmt osl = onlyStmtList { $node = new OnlyStmtListMultiple($os.node, $osl.node); }
  86. | { $node = new NullNode(); } // For the empty case
  87. ;
  88.  
  89. onlyStmt returns [OnlyStmtNode node]
  90. : gs = genericSpec { $node = new OnlyStmtGenericSpec($gs.node); }
  91. | id = ident IMPLIEDT un = useName { $node = new OnlyStmtIdentUseName($id.node, $un.node); }
  92. | un = useName { $node = new OnlyStmtUseName($un.node); }
  93. ;
  94.  
  95. renameList returns [RenameListNode node]
  96. : r = rename rt = renameListTail { $node = new RenameList($r.node, $rt.node); }
  97. ;
  98.  
  99. renameListTail returns [RenameListTailNode node]
  100. : COMMA r = rename rt = renameListTail { $node = new RenameListTail($r.node, $rt.node); }
  101. | { $node = new NullNode(); } // For the empty case
  102. ;
  103.  
  104. rename returns [RenameNode node]
  105. : id = ident IMPLIEDT un = useName { $node = new Rename($id.node, $un.node); }
  106. ;
  107.  
  108. useName returns [UseNameNode node]
  109. : id = ident { $node = new UseName($id.node); }
  110. ;
  111.  
  112. parameterStmt returns [ParameterStmtNode node]
  113. : PARAMETER LPAREN ncdl = namedConstantDefList RPAREN { $node = new ParameterStmt($ncdl.node); }
  114. ;
  115.  
  116. namedConstantDefList returns [NamedConstantDefListNode node]
  117. : ncd = namedConstantDef { $node = new NamedConstantDefListSingle($ncd.node); }
  118. | ncd = namedConstantDef ncdlt = namedConstantDefListTail { $node = new NamedConstantDefListMultiple($ncd.node, $ncdlt.node); }
  119. ;
  120.  
  121. namedConstantDefListTail returns [NamedConstantDefListTailNode node]
  122. : ncd = namedConstantDef { $node = new NamedConstantDefListTailSingle($ncd.node); }
  123. | ncd = namedConstantDef ncdlt = namedConstantDefListTail { $node = new NamedConstantDefListTailMultiple($ncd.node, $ncdlt.node); }
  124. | { $node = new NullNode(); } // For the empty case
  125. ;
  126.  
  127. namedConstantDef returns [NamedConstantDefNode node]
  128. : NAME ASSIGN expr = expression { $node = new NamedConstantDef($NAME.text, $expr.node); }
  129. ;
  130.  
  131. endProgramStmt returns [EndProgramStmtNode node]
  132. : END { $node = new EndProgramStmt(); }
  133. | END PROGRAM { $node = new EndProgramStmt(); }
  134. | END PROGRAM NAME { $node = new EndProgramStmt($NAME.text); }
  135. ;
  136.  
  137.  
  138. blockDataSubprogram returns [BlockDataSubprogramNode node]
  139. : bds = blockDataStmt bdb = blockDataBody ebd = endBlockDataStmt { $node = new BlockDataSubprogram($bds.node, $bdb.node, $ebd.node); }
  140. | bds = blockDataStmt ebd = endBlockDataStmt { $node = new BlockDataSubprogram($bds.node, null, $ebd.node); }
  141. ;
  142.  
  143. blockDataStmt returns [BlockDataStmtNode node]
  144. : BLOCKDATA { $node = new BlockDataStmt(null); }
  145. | BLOCKDATA NAME { $node = new BlockDataStmt($NAME.text); }
  146. ;
  147.  
  148. blockDataBody returns [BlockDataBodyNode node]
  149. : bdbc = blockDataBodyConstruct { $node = new BlockDataBodySingle($bdbc.node); }
  150. | bdb = blockDataBody bdbc = blockDataBodyConstruct { $node = new BlockDataBodyMultiple($bdb.node, $bdbc.node); }
  151. ;
  152.  
  153. blockDataBodyConstruct returns [BlockDataBodyConstructNode node]
  154. : spc = specificationPartConstruct { $node = new BlockDataBodyConstruct($spc.node); }
  155. ;
  156.  
  157. endBlockDataStmt returns [EndBlockDataStmtNode node]
  158. : ENDBLOCKDATA { $node = new EndBlockDataStmt(); }
  159. | ENDBLOCKDATA NAME { $node = new EndBlockDataStmt($NAME.text); }
  160. ;
  161.  
  162. formatStmt returns [FormatStmtNode node]
  163. : ICON FORMAT LPAREN RPAREN { $node = new FormatStmtEmpty(); }
  164. | ICON FORMAT LPAREN fs = fmtSpec RPAREN { $node = new FormatStmt($fs.node); }
  165. ;
  166.  
  167. fmtSpec returns [FmtSpecNode node]
  168. : fe = formatedit { $node = new FmtSpecSingle($fe.node); }
  169. | fs = fmtSpec fe = formatedit { $node = new FmtSpecMultiple($fs.node, $fe.node); }
  170. ;
  171.  
  172. formatedit returns [FormatEditNode node]
  173. : ee = editElement { $node = new FormatEdit($ee.node); }
  174. ;
  175.  
  176. editElement returns [EditElementNode node]
  177. : FCON { $node = new EditElementFcon($FCON.text); }
  178. | SCON { $node = new EditElementScon($SCON.text); }
  179. ;
  180.  
  181. mislexedFcon returns [MislexedFconNode node]
  182. : RDCON SPOFF RDCON SPON { $node = new MislexedFconType1(); }
  183. | NAME SPOFF RDCON SPON { $node = new MislexedFconType2($NAME.text); }
  184. ;
  185.  
  186. module returns [ModuleNode node]
  187. : ms = moduleStmt mb = moduleBody ems = endModuleStmt { $node = new Module($ms.node, $mb.node, $ems.node); }
  188. | ms = moduleStmt ems = endModuleStmt { $node = new Module($ms.node, null, $ems.node); }
  189. ;
  190.  
  191. endModuleStmt returns [EndModuleStmtNode node]
  192. : END MODULE { $node = new EndModuleStmt(); }
  193. | END MODULE NAME { $node = new EndModuleStmt($NAME.text); }
  194. | ENDMODULE { $node = new EndModuleStmt(); }
  195. | ENDMODULE NAME { $node = new EndModuleStmt($NAME.text); }
  196. | END { $node = new EndModuleStmt(); }
  197. ;
  198.  
  199. entryStmt returns [EntryStmtNode node]
  200. : ENTRY NAME spl = subroutineParList RESULT LPAREN NAME RPAREN { $node = new EntryStmt($NAME.text, $spl.node, $NAME.text); }
  201. ;
  202.  
  203. subroutineParList returns [SubroutineParListNode node]
  204. : LPAREN sp = subroutinePars RPAREN { $node = new SubroutineParList($sp.node); }
  205. | LPAREN RPAREN { $node = new SubroutineParListEmpty(); }
  206. | { $node = new NullNode(); } // For the empty case
  207. ;
  208.  
  209. subroutinePars returns [SubroutineParsNode node]
  210. : sp = subroutinePar { $node = new SubroutineParsSingle($sp.node); }
  211. | sp = subroutinePar splt = subroutineParListTail { $node = new SubroutineParsMultiple($sp.node, $splt.node); }
  212. ;
  213.  
  214. subroutineParListTail returns [SubroutineParListTailNode node]
  215. : COMMA sp = subroutinePar { $node = new SubroutineParListTailSingle($sp.node); }
  216. | COMMA sp = subroutinePar splt = subroutineParListTail { $node = new SubroutineParListTailMultiple($sp.node, $splt.node); }
  217. | { $node = new NullNode(); } // For the empty case
  218. ;
  219.  
  220. subroutinePar returns [SubroutineParNode node]
  221. : dan = dummyArgName { $node = new SubroutineParDummyArg($dan.node); }
  222. | STAR { $node = new SubroutineParStar(); }
  223. ;
  224.  
  225. declarationConstruct returns [DeclarationConstructNode node]
  226. : dtd = derivedTypeDef { $node = new DeclarationConstructDerivedType($dtd.node); }
  227. | ib = interfaceBlock { $node = new DeclarationConstructInterface($ib.node); }
  228. | tds = typeDeclarationStmt { $node = new DeclarationConstructTypeDeclaration($tds.node); }
  229. | ss = specificationStmt { $node = new DeclarationConstructSpecification($ss.node); }
  230. ;
  231.  
  232. specificationStmt returns [SpecificationStmtNode node]
  233. : cs = commonStmt { $node = new SpecificationStmtCommon($cs.node); }
  234. | ds = dataStmt { $node = new SpecificationStmtData($ds.node); }
  235. // Add other variations of specification statements
  236. ;
  237.  
  238. targetStmt returns [TargetStmtNode node]
  239. : TARGET DOUBLECOLON tol = targetObjectList { $node = new TargetStmt($tol.node); }
  240. | TARGET tol = targetObjectList { $node = new TargetStmt($tol.node); }
  241. ;
  242.  
  243. targetObjectList returns [TargetObjectListNode node]
  244. : to = targetObject { $node = new TargetObjectListSingle($to.node); }
  245. | to = targetObject tot = targetObjectListTail { $node = new TargetObjectListMultiple($to.node, $tot.node); }
  246. ;
  247.  
  248. targetObjectListTail returns [TargetObjectListTailNode node]
  249. : COMMA to = targetObject { $node = new TargetObjectListTailSingle($to.node); }
  250. | COMMA to = targetObject tot = targetObjectListTail { $node = new TargetObjectListTailMultiple($to.node, $tot.node); }
  251. | { $node = new NullNode(); } // For the empty case
  252. ;
  253.  
  254. targetObject returns [TargetObjectNode node]
  255. : on = objectName { $node = new TargetObject($on.node); }
  256. | on = objectName LPAREN as = arraySpec RPAREN { $node = new TargetObjectArray($on.node, $as.node); }
  257. ;
  258.  
  259. pointerStmt returns [PointerStmtNode node]
  260. : POINTER DOUBLECOLON posl = pointerStmtObjectList { $node = new PointerStmt($posl.node); }
  261. | POINTER posl = pointerStmtObjectList { $node = new PointerStmt($posl.node); }
  262. ;
  263.  
  264. pointerStmtObject returns [PointerStmtObjectNode node]
  265. : on = objectName { $node = new PointerStmtObject($on.node); }
  266. | on = objectName LPAREN dssl = deferredShapeSpecList RPAREN { $node = new PointerStmtObjectArray($on.node, $dssl.node); }
  267. ;
  268.  
  269. pointerStmtObjectList returns [PointerStmtObjectListNode node]
  270. : pso = pointerStmtObject psot = pointerStmtObjectListTail { $node = new PointerStmtObjectList($pso.node, $psot.node); }
  271. ;
  272.  
  273. pointerStmtObjectListTail returns [PointerStmtObjectListTailNode node]
  274. : COMMA pso = pointerStmtObject { $node = new PointerStmtObjectListTailSingle($pso.node); }
  275. | COMMA pso = pointerStmtObject psot = pointerStmtObjectListTail { $node = new PointerStmtObjectListTailMultiple($pso.node, $psot.node); }
  276. | { $node = new NullNode(); } // For the empty case
  277. ;
  278.  
  279. optionalStmt returns [OptionalStmtNode node]
  280. : OPTIONAL DOUBLECOLON opl = optionalParList { $node = new OptionalStmt($opl.node); }
  281. | OPTIONAL opl = optionalParList { $node = new OptionalStmt($opl.node); }
  282. ;
  283.  
  284. optionalParList returns [OptionalParListNode node]
  285. : op = optionalPar { $node = new OptionalParListSingle($op.node); }
  286. | op = optionalPar oplt = optionalParListTail { $node = new OptionalParListMultiple($op.node, $oplt.node); }
  287. ;
  288.  
  289. optionalParListTail returns [OptionalParListTailNode node]
  290. : COMMA op = optionalPar { $node = new OptionalParListTailSingle($op.node); }
  291. | COMMA op = optionalPar oplt = optionalParListTail { $node = new OptionalParListTailMultiple($op.node, $oplt.node); }
  292. | { $node = new NullNode(); } // For the empty case
  293. ;
  294.  
  295. optionalPar returns [OptionalParNode node]
  296. : dan = dummyArgName { $node = new OptionalPar($dan.node); }
  297. ;
  298.  
  299. namelistStmt returns [NamelistStmtNode node]
  300. : NAMELIST ngs = namelistGroups { $node = new NamelistStmt($ngs.node); }
  301. ;
  302.  
  303. namelistGroups returns [NamelistGroupsNode node]
  304. : DIV ngn = namelistGroupName DIV ngo = namelistGroupObject { $node = new NamelistGroups($ngn.node, $ngo.node); }
  305. // Add other variations of namelistGroups
  306. ;
  307.  
  308. namelistGroupName returns [NamelistGroupNameNode node]
  309. : NAME { $node = new NamelistGroupName($NAME.text); }
  310. ;
  311.  
  312. namelistGroupObject returns [NamelistGroupObjectNode node]
  313. : vn = variableName { $node = new NamelistGroupObject($vn.node); }
  314. ;
  315.  
  316. intentStmt returns [IntentStmtNode node]
  317. : INTENT LPAREN is = intentSpec RPAREN iplc = intentParListWithColon { $node = new IntentStmt($is.node, $iplc.node); }
  318. | INTENT LPAREN is = intentSpec RPAREN ipl = intentParList { $node = new IntentStmt($is.node, $ipl.node); }
  319. ;
  320.  
  321. intentParListWithColon returns [IntentParListWithColonNode node]
  322. : DOUBLECOLON ipl = intentParList { $node = new IntentParListWithColon($ipl.node); }
  323. ;
  324.  
  325. intentParList returns [IntentParListNode node]
  326. : ip = intentPar { $node = new IntentParListSingle($ip.node); }
  327. | ip = intentPar COMMA ipl = intentParList { $node = new IntentParListMultiple($ip.node, $ipl.node); }
  328. ;
  329.  
  330. intentPar returns [IntentParNode node]
  331. : dan = dummyArgName { $node = new IntentPar($dan.node); }
  332. ;
  333.  
  334. dummyArgName returns [DummyArgNameNode node]
  335. : NAME { $node = new DummyArgName($NAME.text); }
  336. ;
  337.  
  338. intentSpec returns [IntentSpecNode node]
  339. : IN { $node = new IntentSpecIn(); }
  340. | OUT { $node = new IntentSpecOut(); }
  341. | INOUT { $node = new IntentSpecInOut(); }
  342. ;
  343.  
  344. allocatableStmt returns [AllocatableStmtNode node]
  345. : ALLOCATABLE DOUBLECOLON aal = arrayAllocationList { $node = new AllocatableStmt($aal.node); }
  346. | ALLOCATABLE aal = arrayAllocationList { $node = new AllocatableStmt($aal.node); }
  347. ;
  348.  
  349. arrayAllocationList returns [ArrayAllocationListNode node]
  350. : aa = arrayAllocation { $node = new ArrayAllocationListSingle($aa.node); }
  351. | aa = arrayAllocation aalt = arrayAllocationListTail { $node = new ArrayAllocationListMultiple($aa.node, $aalt.node); }
  352. ;
  353.  
  354. arrayAllocationListTail returns [ArrayAllocationListTailNode node]
  355. : COMMA aa = arrayAllocation { $node = new ArrayAllocationListTailSingle($aa.node); }
  356. | COMMA aa = arrayAllocation aalt = arrayAllocationListTail { $node = new ArrayAllocationListTailMultiple($aa.node, $aalt.node); }
  357. | { $node = new NullNode(); } // For the empty case
  358. ;
  359.  
  360. arrayAllocation returns [ArrayAllocationNode node]
  361. : an = arrayName { $node = new ArrayAllocation($an.node); }
  362. | an = arrayName LPAREN dssl = deferredShapeSpecList RPAREN { $node = new ArrayAllocationArray($an.node, $dssl.node); }
  363. ;
  364.  
  365. arrayName returns [ArrayNameNode node]
  366. : id = ident { $node = new ArrayName($id.node); }
  367. ;
  368.  
  369. accessStmt returns [AccessStmtNode node]
  370. : ACCESSSPEC DOUBLECOLON aidl = accessIdList { $node = new AccessStmt($aidl.node); }
  371. | ACCESSSPEC aidl = accessIdList { $node = new AccessStmt($aidl.node); }
  372. | ACCESSSPEC { $node = new AccessStmtEmpty(); }
  373. ;
  374.  
  375. accessIdList returns [AccessIdListNode node]
  376. : aid = accessId { $node = new AccessIdListSingle($aid.node); }
  377. | aid = accessId ailt = accessIdListTail { $node = new AccessIdListMultiple($aid.node, $ailt.node); }
  378. ;
  379.  
  380. accessIdListTail returns [AccessIdListTailNode node]
  381. : COMMA aid = accessId { $node = new AccessIdListTailSingle($aid.node); }
  382. | COMMA aid = accessId ailt = accessIdListTail { $node = new AccessIdListTailMultiple($aid.node, $ailt.node); }
  383. | { $node = new NullNode(); } // For the empty case
  384. ;
  385.  
  386. accessId returns [AccessIdNode node]
  387. : gn = genericName { $node = new AccessIdGenericName($gn.node); }
  388. | gs = genericSpec { $node = new AccessIdGenericSpec($gs.node); }
  389. ;
  390.  
  391. genericName returns [GenericNameNode node]
  392. : id = ident { $node = new GenericName($id.node); }
  393. ;
  394.  
  395. saveStmt returns [SaveStmtNode node]
  396. : SAVE { $node = new SaveStmt(); }
  397. | SAVE sel = savedEntityList { $node = new SaveStmtEntityList($sel.node); }
  398. | SAVE DOUBLECOLON sel = savedEntityList { $node = new SaveStmtEntityList($sel.node); }
  399. ;
  400.  
  401. savedEntityList returns [SavedEntityListNode node]
  402. : se = savedEntity { $node = new SavedEntityListSingle($se.node); }
  403. | se = savedEntity selt = savedEntityListTail { $node = new SavedEntityListMultiple($se.node, $selt.node); }
  404. ;
  405.  
  406. savedEntityListTail returns [SavedEntityListTailNode node]
  407. : se = savedEntity { $node = new SavedEntityListTailSingle($se.node); }
  408. | se = savedEntity selt = savedEntityListTail { $node = new SavedEntityListTailMultiple($se.node, $selt.node); }
  409. | { $node = new NullNode(); } // For the empty case
  410. ;
  411.  
  412. savedEntity returns [SavedEntityNode node]
  413. : vn = variableName { $node = new SavedEntityVariableName($vn.node); }
  414. | scb = savedCommonBlock { $node = new SavedEntityCommonBlock($scb.node); }
  415. ;
  416.  
  417. savedCommonBlock returns [SavedCommonBlockNode node]
  418. : DIV cbn = commonBlockName DIV { $node = new SavedCommonBlock($cbn.node); }
  419. ;
  420.  
  421. intrinsicStmt returns [IntrinsicStmtNode node]
  422. : INTRINSIC il = intrinsicList { $node = new IntrinsicStmt($il.node); }
  423. ;
  424.  
  425. intrinsicList returns [IntrinsicListNode node]
  426. : ipn = intrinsicProcedureName { $node = new IntrinsicListSingle($ipn.node); }
  427. | ipn = intrinsicProcedureName ilt = intrinsicListTail { $node = new IntrinsicListMultiple($ipn.node, $ilt.node); }
  428. ;
  429.  
  430. intrinsicListTail returns [IntrinsicListTailNode node]
  431. : ipn = intrinsicProcedureName { $node = new IntrinsicListTailSingle($ipn.node); }
  432. | ipn = intrinsicProcedureName ilt = intrinsicListTail { $node = new IntrinsicListTailMultiple($ipn.node, $ilt.node); }
  433. | { $node = new NullNode(); } // For the empty case
  434. ;
  435.  
  436. intrinsicProcedureName returns [IntrinsicProcedureNameNode node]
  437. : NAME { $node = new IntrinsicProcedureName($NAME.text); }
  438. ;
  439.  
  440. externalStmt returns [ExternalStmtNode node]
  441. : EXTERNAL enl = externalNameList { $node = new ExternalStmt($enl.node); }
  442. ;
  443.  
  444. externalNameList returns [ExternalNameListNode node]
  445. : en = externalName { $node = new ExternalNameListSingle($en.node); }
  446. | en = externalName enlt = externalNameListTail { $node = new ExternalNameListMultiple($en.node, $enlt.node); }
  447. ;
  448.  
  449. externalNameListTail returns [ExternalNameListTailNode node]
  450. : en = externalName { $node = new ExternalNameListTailSingle($en.node); }
  451. | en = externalName enlt = externalNameListTail { $node = new ExternalNameListTailMultiple($en.node, $enlt.node); }
  452. | { $node = new NullNode(); } // For the empty case
  453. ;
  454.  
  455. externalName returns [ExternalNameNode node]
  456. : NAME { $node = new ExternalName($NAME.text); }
  457. ;
  458.  
  459. equivalenceStmt returns [EquivalenceStmtNode node]
  460. : EQUIVALENCE esl = equivalenceSetList { $node = new EquivalenceStmt($esl.node); }
  461. ;
  462.  
  463. equivalenceSetList returns [EquivalenceSetListNode node]
  464. : es = equivalenceSet { $node = new EquivalenceSetListSingle($es.node); }
  465. | es = equivalenceSet eslt = equivalenceSetListTail { $node = new EquivalenceSetListMultiple($es.node, $eslt.node); }
  466. ;
  467.  
  468. equivalenceSetListTail returns [EquivalenceSetListTailNode node]
  469. : es = equivalenceSet { $node = new EquivalenceSetListTailSingle($es.node); }
  470. | es = equivalenceSet eslt = equivalenceSetListTail { $node = new EquivalenceSetListTailMultiple($es.node, $eslt.node); }
  471. | { $node = new NullNode(); } // For the empty case
  472. ;
  473.  
  474. equivalenceSet returns [EquivalenceSetNode node]
  475. : LPAREN eo = equivalenceObject COMMA eol = equivalenceObjectList RPAREN { $node = new EquivalenceSet($eo.node, $eol.node); }
  476. ;
  477.  
  478. equivalenceObject returns [EquivalenceObjectNode node]
  479. : v = variable { $node = new EquivalenceObject($v.node); }
  480. ;
  481.  
  482. equivalenceObjectList returns [EquivalenceObjectListNode node]
  483. : eo = equivalenceObject { $node = new EquivalenceObjectListSingle($eo.node); }
  484. | eo = equivalenceObject eolt = equivalenceObjectListTail { $node = new EquivalenceObjectListMultiple($eo.node, $eolt.node); }
  485. ;
  486.  
  487. equivalenceObjectListTail returns [EquivalenceObjectListTailNode node]
  488. : eo = equivalenceObject { $node = new EquivalenceObjectListTailSingle($eo.node); }
  489. | eo = equivalenceObject eolt = equivalenceObjectListTail { $node = new EquivalenceObjectListTailMultiple($eo.node, $eolt.node); }
  490. | { $node = new NullNode(); } // For the empty case
  491. ;
  492.  
  493. dimensionStmt returns [DimensionStmtNode node]
  494. : DIMENSION adl = arrayDeclaratorList { $node = new DimensionStmt($adl.node); }
  495. | DIMENSION DOUBLECOLON adl = arrayDeclaratorList { $node = new DimensionStmt($adl.node); }
  496. ;
  497.  
  498. arrayDeclaratorList returns [ArrayDeclaratorListNode node]
  499. : ad = arrayDeclarator adlt = arrayDeclaratorListTail { $node = new ArrayDeclaratorList($ad.node, $adlt.node); }
  500. ;
  501.  
  502. arrayDeclaratorListTail returns [ArrayDeclaratorListTailNode node]
  503. : ad = arrayDeclarator { $node = new ArrayDeclaratorListTailSingle($ad.node); }
  504. | ad = arrayDeclarator adlt = arrayDeclaratorListTail { $node = new ArrayDeclaratorListTailMultiple($ad.node, $adlt.node); }
  505. | { $node = new NullNode(); } // For the empty case
  506. ;
  507.  
  508. commonStmt returns [CommonStmtNode node]
  509. : COMMON cl = comlist { $node = new CommonStmt($cl.node); }
  510. ;
  511.  
  512. comlist returns [ComlistNode node]
  513. : cb = comblock cbo = commonBlockObject { $node = new ComlistBlockObject($cb.node, $cbo.node); }
  514. | cbo = commonBlockObject { $node = new ComlistObject($cbo.node); }
  515. // Add other variations of comlist
  516. ;
  517.  
  518. commonBlockObject returns [CommonBlockObjectNode node]
  519. : vn = variableName { $node = new CommonBlockObjectVariable($vn.node); }
  520. | ad = arrayDeclarator { $node = new CommonBlockObjectArray($ad.node); }
  521. ;
  522.  
  523. arrayDeclarator returns [ArrayDeclaratorNode node]
  524. : vn = variableName LPAREN as = arraySpec RPAREN { $node = new ArrayDeclarator($vn.node, $as.node); }
  525. ;
  526.  
  527. comblock returns [ComblockNode node]
  528. : DIV SPOFF DIV SPON { $node = new ComblockEmpty(); }
  529. | DIV cbn = commonBlockName DIV { $node = new ComblockName($cbn.node); }
  530. ;
  531.  
  532. commonBlockName returns [CommonBlockNameNode node]
  533. : NAME { $node = new CommonBlockName($NAME.text); }
  534. ;
  535.  
  536. typeDeclarationStmt returns [TypeDeclarationStmtNode node]
  537. : ts = typeSpec edl = entityDeclList { $node = new TypeDeclarationStmt($ts.node, $edl.node); }
  538. // Add other variations of typeDeclarationStmt
  539. ;
  540.  
  541. attrSpecSeq returns [AttrSpecSeqNode node]
  542. : COMMA as = attrSpec { $node = new AttrSpecSeqSingle($as.node); }
  543. | ass = attrSpecSeq COMMA as = attrSpec { $node = new AttrSpecSeqMultiple($ass.node, $as.node); }
  544. ;
  545.  
  546. attrSpec returns [AttrSpecNode node]
  547. : PARAMETER { $node = new AttrSpecParameter(); }
  548. | ACCESSSPEC { $node = new AttrSpecAccessSpec(); }
  549. // Add other variations of attrSpec
  550. ;
  551.  
  552. entityDeclList returns [EntityDeclListNode node]
  553. : ed = entityDecl { $node = new EntityDeclListSingle($ed.node); }
  554. | ed = entityDecl edlt = entityDeclListTail { $node = new EntityDeclListMultiple($ed.node, $edlt.node); }
  555. ;
  556.  
  557. entityDeclListTail returns [EntityDeclListTailNode node]
  558. : COMMA ed = entityDecl { $node = new EntityDeclListTailSingle($ed.node); }
  559. | COMMA ed = entityDecl edlt = entityDeclListTail { $node = new EntityDeclListTailMultiple($ed.node, $edlt.node); }
  560. | { $node = new NullNode(); } // For the empty case
  561. ;
  562.  
  563. entityDecl returns [EntityDeclNode node]
  564. : on = objectName { $node = new EntityDeclName($on.node); }
  565. // Add other variations of entityDecl
  566. ;
  567.  
  568. objectName returns [ObjectNameNode node]
  569. : NAME { $node = new ObjectName($NAME.text); }
  570. ;
  571.  
  572. arraySpec returns [ArraySpecNode node]
  573. : essl = explicitShapeSpecList { $node = new ArraySpecExplicit($essl.node); }
  574. // Add other variations of arraySpec
  575. ;
  576.  
  577. assumedShapeSpecList returns [AssumedShapeSpecListNode node]
  578. : lb = lowerBound COLON { $node = new AssumedShapeSpecListSingle($lb.node); }
  579. | dssl = deferredShapeSpecList COMMA lb = lowerBound COLON { $node = new AssumedShapeSpecListMultiple($dssl.node, $lb.node); }
  580. | assl = assumedShapeSpecList COMMA ass = assumedShapeSpec { $node = new AssumedShapeSpecListMultiple($assl.node, $ass.node); }
  581. ;
  582.  
  583. assumedShapeSpec returns [AssumedShapeSpecNode node]
  584. : lb = lowerBound COLON { $node = new AssumedShapeSpec($lb.node); }
  585. | COLON { $node = new AssumedShapeSpecEmpty(); }
  586. ;
  587.  
  588. assumedSizeSpec returns [AssumedSizeSpecNode node]
  589. : STAR { $node = new AssumedSizeSpecStar(); }
  590. | lb = lowerBound COLON STAR { $node = new AssumedSizeSpecLowerBoundStar($lb.node); }
  591. | essl = explicitShapeSpecList COMMA STAR { $node = new AssumedSizeSpecListStar($essl.node); }
  592. | essl = explicitShapeSpecList COMMA lb = lowerBound COLON STAR { $node = new AssumedSizeSpecListLowerBoundStar($essl.node, $lb.node); }
  593. ;
  594.  
  595. interfaceBlock returns [InterfaceBlockNode node]
  596. : is = interfaceStmt ibb = interfaceBlockBody eis = endInterfaceStmt { $node = new InterfaceBlock($is.node, $ibb.node, $eis.node); }
  597. ;
  598.  
  599. endInterfaceStmt returns [EndInterfaceStmtNode node]
  600. : ENDINTERFACE { $node = new EndInterfaceStmt(); }
  601. | END INTERFACE { $node = new EndInterfaceStmt(); }
  602. | ENDINTERFACE NAME { $node = new EndInterfaceStmt($NAME.text); }
  603. | END INTERFACE NAME { $node = new EndInterfaceStmt($NAME.text); }
  604. ;
  605.  
  606. interfaceStmt returns [InterfaceStmtNode node]
  607. : INTERFACE NAME { $node = new InterfaceStmtName($NAME.text); }
  608. | INTERFACE gs = genericSpec { $node = new InterfaceStmtGeneric($gs.node); }
  609. | INTERFACE { $node = new InterfaceStmt(); }
  610. ;
  611.  
  612. genericSpec returns [GenericSpecNode node]
  613. : OPERATOR LPAREN dop = definedOperator RPAREN { $node = new GenericSpecOperator($dop.node); }
  614. | ASSIGNMENT LPAREN ASSIGN RPAREN { $node = new GenericSpecAssignment(); }
  615. ;
  616.  
  617. definedOperator returns [DefinedOperatorNode node]
  618. : DOP { $node = new DefinedOperatorDop($DOP.text); }
  619. | POWER { $node = new DefinedOperatorPower(); }
  620. | STAR { $node = new DefinedOperatorStar(); }
  621. // Add other variations of definedOperator
  622. ;
  623.  
  624. interfaceBlockBody returns [InterfaceBlockBodyNode node]
  625. : ibpc = interfaceBodyPartConstruct { $node = new InterfaceBlockBodySingle($ibpc.node); }
  626. | ibb = interfaceBlockBody ibpc = interfaceBodyPartConstruct { $node = new InterfaceBlockBodyMultiple($ibb.node, $ibpc.node); }
  627. ;
  628.  
  629. interfaceBodyPartConstruct returns [InterfaceBodyPartConstructNode node]
  630. : ib = interfaceBody { $node = new InterfaceBodyPartConstructInterfaceBody($ib.node); }
  631. | mps = moduleProcedureStmt { $node = new InterfaceBodyPartConstructModuleProcedure($mps.node); }
  632. ;
  633.  
  634. moduleProcedureStmt returns [ModuleProcedureStmtNode node]
  635. : MODULE PROCEDURE pnl = procedureNameList { $node = new ModuleProcedureStmt($pnl.node); }
  636. ;
  637.  
  638. procedureNameList returns [ProcedureNameListNode node]
  639. : pn = procedureName { $node = new ProcedureNameListSingle($pn.node); }
  640. | pn = procedureName pntl = procedureNameListTail { $node = new ProcedureNameListMultiple($pn.node, $pntl.node); }
  641. ;
  642.  
  643. procedureNameListTail returns [ProcedureNameListTailNode node]
  644. : COMMA pn = procedureName { $node = new ProcedureNameListTailSingle($pn.node); }
  645. | COMMA pn = procedureName pntl = procedureNameListTail { $node = new ProcedureNameListTailMultiple($pn.node, $pntl.node); }
  646. | { $node = new NullNode(); } // For the empty case
  647. ;
  648.  
  649. procedureName returns [ProcedureNameNode node]
  650. : id = ident { $node = new ProcedureName($id.node); }
  651. ;
  652.  
  653. interfaceBody returns [InterfaceBodyNode node]
  654. : fp = functionPrefix NAME fir = functionInterfaceRange { $node = new InterfaceBodyFunction($fp.node, $NAME.text, $fir.node); }
  655. | SUBROUTINE NAME sir = subroutineInterfaceRange { $node = new InterfaceBodySubroutine($NAME.text, $sir.node); }
  656. ;
  657.  
  658. subroutineInterfaceRange returns [SubroutineInterfaceRangeNode node]
  659. : spl = subroutineParList sib = subprogramInterfaceBody es = endSubroutineStmt { $node = new SubroutineInterfaceRange($spl.node, $sib.node, $es.node); }
  660. | spl = subroutineParList es = endSubroutineStmt { $node = new SubroutineInterfaceRange($spl.node, null, $es.node); }
  661. ;
  662.  
  663.  
  664. endSubroutineStmt returns [EndSubroutineStmtNode node]
  665. : END { $node = new EndSubroutineStmt(); }
  666. | END SUBROUTINE { $node = new EndSubroutineStmt(); }
  667. | END SUBROUTINE NAME { $node = new EndSubroutineStmt($NAME.text); }
  668. ;
  669.  
  670. recursive returns [RecursiveNode node]
  671. : RECURSIVE { $node = new Recursive(); }
  672. ;
  673.  
  674. functionPrefix returns [FunctionPrefixNode node]
  675. : rec = recursive ts = typeSpec FUNCTION { $node = new FunctionPrefixRecursiveTypeSpec($rec.node, $ts.node); }
  676. | ts = typeSpec rec = RECURSIVE FUNCTION { $node = new FunctionPrefixTypeSpecRecursive($ts.node); }
  677. | rec = recursive FUNCTION { $node = new FunctionPrefixRecursive($rec.node); }
  678. | ts = typeSpec FUNCTION { $node = new FunctionPrefixTypeSpec($ts.node); }
  679. ;
  680.  
  681. functionInterfaceRange returns [FunctionInterfaceRangeNode node]
  682. : fpl = functionParList sib = subprogramInterfaceBody efs = endFunctionStmt { $node = new FunctionInterfaceRange($fpl.node, $sib.node, $efs.node); }
  683. | fpl = functionParList efs = endFunctionStmt { $node = new FunctionInterfaceRange($fpl.node, null, $efs.node); }
  684. ;
  685.  
  686. functionParList returns [FunctionParListNode node]
  687. : LPAREN fps = functionPars RPAREN { $node = new FunctionParList($fps.node); }
  688. | LPAREN RPAREN { $node = new FunctionParListEmpty(); }
  689. ;
  690.  
  691. functionPars returns [FunctionParsNode node]
  692. : fp = functionPar { $node = new FunctionParsSingle($fp.node); }
  693. | fp = functionPar fpt = functionParsTail { $node = new FunctionParsMultiple($fp.node, $fpt.node); }
  694. ;
  695.  
  696. functionParsTail returns [FunctionParsTailNode node]
  697. : COMMA fp = functionPar { $node = new FunctionParsTailSingle($fp.node); }
  698. | COMMA fp = functionPar fpt = functionParsTail { $node = new FunctionParsTailMultiple($fp.node, $fpt.node); }
  699. | { $node = new NullNode(); } // For the empty case
  700. ;
  701.  
  702. functionPar returns [FunctionParNode node]
  703. : dan = dummyArgName { $node = new FunctionPar($dan.node); }
  704. ;
  705.  
  706. subprogramInterfaceBody returns [SubprogramInterfaceBodyNode node]
  707. : spc = specificationPartConstruct { $node = new SubprogramInterfaceBodySingle($spc.node); }
  708. | sib = subprogramInterfaceBody spc = specificationPartConstruct { $node = new SubprogramInterfaceBodyMultiple($sib.node, $spc.node); }
  709. ;
  710.  
  711. endFunctionStmt returns [EndFunctionStmtNode node]
  712. : END { $node = new EndFunctionStmt(); }
  713. | END FUNCTION { $node = new EndFunctionStmt(); }
  714. | END FUNCTION NAME { $node = new EndFunctionStmt($NAME.text); }
  715. ;
  716.  
  717. derivedTypeDef returns [DerivedTypeDefNode node]
  718. : dts = derivedTypeStmt dtb = derivedTypeBody ets = endTypeStmt { $node = new DerivedTypeDef($dts.node, $dtb.node, $ets.node); }
  719. ;
  720.  
  721. endTypeStmt returns [EndTypeStmtNode node]
  722. : ENDTYPE NAME { $node = new EndTypeStmt($NAME.text); }
  723. | ENDTYPE { $node = new EndTypeStmt(); }
  724. | END TYPE NAME { $node = new EndTypeStmt($NAME.text); }
  725. | END TYPE { $node = new EndTypeStmt(); }
  726. ;
  727.  
  728. derivedTypeStmt returns [DerivedTypeStmtNode node]
  729. : TYPE NAME { $node = new DerivedTypeStmtName($NAME.text); }
  730. | TYPE DOUBLECOLON NAME { $node = new DerivedTypeStmtDoubleColon($NAME.text); }
  731. | TYPE COMMA ACCESSSPEC DOUBLECOLON NAME { $node = new DerivedTypeStmtAccessSpec($NAME.text); }
  732. ;
  733.  
  734. derivedTypeBody returns [DerivedTypeBodyNode node]
  735. : dtbc = derivedTypeBodyConstruct { $node = new DerivedTypeBodySingle($dtbc.node); }
  736. | dtb = derivedTypeBody dtbc = derivedTypeBodyConstruct { $node = new DerivedTypeBodyMultiple($dtb.node, $dtbc.node); }
  737. ;
  738.  
  739. derivedTypeBodyConstruct returns [DerivedTypeBodyConstructNode node]
  740. : pss = privateSequenceStmt { $node = new DerivedTypeBodyConstructPrivateSequence($pss.node); }
  741. | cds = componentDefStmt { $node = new DerivedTypeBodyConstructComponentDef($cds.node); }
  742. ;
  743.  
  744. privateSequenceStmt returns [PrivateSequenceStmtNode node]
  745. : PRIVATE { $node = new PrivateSequenceStmtPrivate(); }
  746. | SEQUENCE { $node = new PrivateSequenceStmtSequence(); }
  747. ;
  748.  
  749. componentDefStmt returns [ComponentDefStmtNode node]
  750. : ts = typeSpec COMMA casl = componentAttrSpecList DOUBLECOLON cdl = componentDeclList { $node = new ComponentDefStmtAttrSpecList($ts.node, $casl.node, $cdl.node); }
  751. | ts = typeSpec DOUBLECOLON cdl = componentDeclList { $node = new ComponentDefStmtDoubleColon($ts.node, $cdl.node); }
  752. | ts = typeSpec cdl = componentDeclList { $node = new ComponentDefStmt($ts.node, $cdl.node); }
  753. ;
  754.  
  755. componentDeclList returns [ComponentDeclListNode node]
  756. : cd = componentDecl { $node = new ComponentDeclListSingle($cd.node); }
  757. | cd = componentDecl cdt = componentDeclListTail { $node = new ComponentDeclListMultiple($cd.node, $cdt.node); }
  758. ;
  759.  
  760. componentDeclListTail returns [ComponentDeclListTailNode node]
  761. : COMMA cd = componentDecl { $node = new ComponentDeclListTailSingle($cd.node); }
  762. | COMMA cd = componentDecl cdt = componentDeclListTail { $node = new ComponentDeclListTailMultiple($cd.node, $cdt.node); }
  763. | { $node = new NullNode(); } // For the empty case
  764. ;
  765.  
  766. componentDecl returns [ComponentDeclNode node]
  767. : cn = componentName LPAREN cas = componentArraySpec RPAREN STAR cl = charLength { $node = new ComponentDeclArrayCharLength($cn.node, $cas.node, $cl.node); }
  768. // Add other variations of componentDecl
  769. ;
  770.  
  771. componentName returns [ComponentNameNode node]
  772. : NAME { $node = new ComponentName($NAME.text); }
  773. ;
  774.  
  775. componentAttrSpecList returns [ComponentAttrSpecListNode node]
  776. : cas = componentAttrSpec { $node = new ComponentAttrSpecListSingle($cas.node); }
  777. | casl = componentAttrSpecListTail COMMA cas = componentAttrSpec { $node = new ComponentAttrSpecListMultiple($casl.node, $cas.node); }
  778. ;
  779.  
  780. componentAttrSpecListTail returns [ComponentAttrSpecListTailNode node]
  781. : COMMA cas = componentAttrSpec { $node = new ComponentAttrSpecListTailSingle($cas.node); }
  782. | casl = componentAttrSpecListTail COMMA cas = componentAttrSpec { $node = new ComponentAttrSpecListTailMultiple($casl.node, $cas.node); }
  783. | { $node = new NullNode(); } // For the empty case
  784. ;
  785.  
  786. componentAttrSpec returns [ComponentAttrSpecNode node]
  787. : POINTER { $node = new ComponentAttrSpecPointer(); }
  788. | DIMENSION LPAREN cas = componentArraySpec RPAREN { $node = new ComponentAttrSpecDimension($cas.node); }
  789. ;
  790.  
  791. componentArraySpec returns [ComponentArraySpecNode node]
  792. : essl = explicitShapeSpecList { $node = new ComponentArraySpecExplicit($essl.node); }
  793. | dssl = deferredShapeSpecList { $node = new ComponentArraySpecDeferred($dssl.node); }
  794. ;
  795.  
  796. explicitShapeSpecList returns [ExplicitShapeSpecListNode node]
  797. : ess = explicitShapeSpec { $node = new ExplicitShapeSpecListSingle($ess.node); }
  798. | ess = explicitShapeSpec esslt = explicitShapeSpecListTail { $node = new ExplicitShapeSpecListMultiple($ess.node, $esslt.node); }
  799. ;
  800.  
  801. explicitShapeSpecListTail returns [ExplicitShapeSpecListTailNode node]
  802. : COMMA ess = explicitShapeSpec { $node = new ExplicitShapeSpecListTailSingle($ess.node); }
  803. | COMMA ess = explicitShapeSpec esslt = explicitShapeSpecListTail { $node = new ExplicitShapeSpecListTailMultiple($ess.node, $esslt.node); }
  804. | { $node = new NullNode(); } // For the empty case
  805. ;
  806.  
  807. explicitShapeSpec returns [ExplicitShapeSpecNode node]
  808. : lb = lowerBound COLON ub = upperBound { $node = new ExplicitShapeSpecRange($lb.node, $ub.node); }
  809. | ub = upperBound { $node = new ExplicitShapeSpecUpper($ub.node); }
  810. ;
  811.  
  812. lowerBound returns [LowerBoundNode node]
  813. : expr = expression { $node = new LowerBound($expr.node); }
  814. ;
  815.  
  816. upperBound returns [UpperBoundNode node]
  817. : expr = expression { $node = new UpperBound($expr.node); }
  818. ;
  819.  
  820. deferredShapeSpecList returns [DeferredShapeSpecListNode node]
  821. : dss = deferredShapeSpec { $node = new DeferredShapeSpecListSingle($dss.node); }
  822. | dss = deferredShapeSpec dsslt = deferredShapeSpecListTail { $node = new DeferredShapeSpecListMultiple($dss.node, $dsslt.node); }
  823. ;
  824.  
  825. deferredShapeSpecListTail returns [DeferredShapeSpecListTailNode node]
  826. : COMMA dss = deferredShapeSpec { $node = new DeferredShapeSpecListTailSingle($dss.node); }
  827. | COMMA dss = deferredShapeSpec dsslt = deferredShapeSpecListTail { $node = new DeferredShapeSpecListTailMultiple($dss.node, $dsslt.node); }
  828. | { $node = new NullNode(); } // For the empty case
  829. ;
  830.  
  831. deferredShapeSpec returns [DeferredShapeSpecNode node]
  832. : COLON { $node = new DeferredShapeSpec(); }
  833. ;
  834.  
  835. typeSpec returns [TypeSpecNode node]
  836. : INTEGER { $node = new TypeSpecInteger(); }
  837. | REAL { $node = new TypeSpecReal(); }
  838. | DOUBLEPRECISION { $node = new TypeSpecDoublePrecision(); }
  839. // Add other variations of typeSpec
  840. ;
  841.  
  842. kindSelector returns [KindSelectorNode node]
  843. : LPAREN KIND ASSIGN expr = expression RPAREN { $node = new KindSelectorKind($expr.node); }
  844. | LPAREN expr = expression RPAREN { $node = new KindSelectorExpression($expr.node); }
  845. ;
  846.  
  847. typeName returns [TypeNameNode node]
  848. : id = ident { $node = new TypeName($id.node); }
  849. ;
  850.  
  851. charSelector returns [CharSelectorNode node]
  852. : LPAREN LEN ASSIGN tpv = typeParamValue COMMA KIND ASSIGN expr = expression RPAREN { $node = new CharSelectorLenKind($tpv.node, $expr.node); }
  853. // Add other variations of charSelector
  854. ;
  855.  
  856. lengthSelector returns [LengthSelectorNode node]
  857. : STAR cl = charLength { $node = new LengthSelectorCharLength($cl.node); }
  858. | LPAREN tpv = typeParamValue RPAREN { $node = new LengthSelectorTypeParam($tpv.node); }
  859. ;
  860.  
  861. charLength returns [CharLengthNode node]
  862. : LPAREN tpv = typeParamValue RPAREN { $node = new CharLengthTypeParam($tpv.node); }
  863. | const = constant { $node = new CharLengthConstant($const.node); }
  864. ;
  865.  
  866. constant returns [ConstantNode node]
  867. : namedConstantUse { $node = new ConstantNamedConstantUse(); }
  868. | uacws = unsignedArithmeticConstantWithSign { $node = new ConstantUnsignedArithmeticWithSign($uacws.node); }
  869. | SCON { $node = new ConstantString($SCON.text); }
  870. | HOLLERITH { $node = new ConstantHollerith($HOLLERITH.text); }
  871. | logicalConstant { $node = new ConstantLogical(); }
  872. | ICON UNDERSCORE SCON { $node = new ConstantIconUnderscoreScon(); }
  873. | namedConstantUse UNDERSCORE SCON { $node = new ConstantNamedConstantUseUnderscoreScon(); }
  874. | structureConstructor { $node = new ConstantStructureConstructor(); }
  875. | bozLiteralConstant { $node = new ConstantBozLiteral(); }
  876. ;
  877.  
  878. unsignedArithmeticConstantWithSign returns [UnsignedArithmeticConstantWithSignNode node]
  879. : (PLUS | MINUS) uac = unsignedArithmeticConstant { $node = new UnsignedArithmeticConstantWithSign($uac.node); }
  880. | uac = unsignedArithmeticConstant { $node = new UnsignedArithmeticConstant($uac.node); }
  881. ;
  882.  
  883. bozLiteralConstant returns [BozLiteralConstantNode node]
  884. : BCON | OCON | ZCON;
  885.  
  886. structureConstructor returns [StructureConstructorNode node]
  887. : tn = typeName LPAREN el = exprList RPAREN { $node = new StructureConstructor($tn.node, $el.node); }
  888. ;
  889.  
  890. exprList returns [ExprListNode node]
  891. : expr = expression { $node = new ExprListSingle($expr.node); }
  892. | expr = expression COMMA el = exprList { $node = new ExprListMultiple($expr.node, $el.node); }
  893. ;
  894.  
  895. namedConstantUse returns [NamedConstantUseNode node]
  896. : NAME { $node = new NamedConstantUse($NAME.text); }
  897. ;
  898.  
  899. typeParamValue returns [TypeParamValueNode node]
  900. : expr = expression { $node = new TypeParamValueExpression($expr.node); }
  901. | STAR { $node = new TypeParamValueStar(); }
  902. ;
  903.  
  904. moduleStmt returns [ModuleStmtNode node]
  905. : MODULE mn = moduleName { $node = new ModuleStmt($mn.node); }
  906. ;
  907.  
  908. moduleName returns [ModuleNameNode node]
  909. : id = ident { $node = new ModuleName($id.node); }
  910. ;
  911.  
  912. ident returns [IdentNode node]
  913. : NAME { $node = new Ident($NAME.text); }
  914. ;
  915.  
  916. moduleBody returns [ModuleBodyNode node]
  917. : spc = specificationPartConstruct { $node = new ModuleBodySpecPartStmt($spc.node); }
  918. | mspc = moduleSubprogramPartConstruct { $node = new ModuleBodySubmoduleStmt($mspc.node); }
  919. | mb = moduleBody spc = specificationPartConstruct { $node = new ModuleBodyComplexSpecPart($mb.node, $spc.node); }
  920. | mb = moduleBody mspc = moduleSubprogramPartConstruct { $node = new ModuleBodyComplexSubmodule($mb.node, $mspc.node); }
  921. ;
  922.  
  923. moduleSubprogramPartConstruct returns [ModuleSubprogramPartConstructNode node]
  924. : cs = containsStmt { $node = new ModuleSubprogramPartConstructContains($cs.node); }
  925. | ms = moduleSubprogram { $node = new ModuleSubprogramPartConstructModuleSubprogram($ms.node); }
  926. ;
  927.  
  928. containsStmt returns [ContainsStmtNode node]
  929. : CONTAINS { $node = new ContainsStmt(); }
  930. ;
  931.  
  932. moduleSubprogram returns [ModuleSubprogramNode node]
  933. : fs = functionSubprogram { $node = new ModuleSubprogramFunction($fs.node); }
  934. | ss = subroutineSubprogram { $node = new ModuleSubprogramSubroutine($ss.node); }
  935. ;
  936.  
  937. functionSubprogram returns [FunctionSubprogramNode node]
  938. : fp = functionPrefix fn = functionName fr = functionRange { $node = new FunctionSubprogram($fp.node, $fn.node, $fr.node); }
  939. ;
  940.  
  941. functionName returns [FunctionNameNode node]
  942. : NAME { $node = new FunctionName($NAME.text); }
  943. ;
  944.  
  945. functionRange returns [FunctionRangeNode node]
  946. : fpl = functionParList bo = bodyOptional efs = endFunctionStmt { $node = new FunctionRange($fpl.node, $bo.node, $efs.node); }
  947. // Add other variations of functionRange
  948. ;
  949.  
  950. bodyOptional returns [BodyOptionalNode node]
  951. : body { $node = new BodyOptionalBody(); }
  952. | { $node = new NullNode(); } // For the empty case
  953. ;
  954.  
  955. body returns [BodyNode node]
  956. : bc = bodyConstruct { $node = new BodySingle($bc.node); }
  957. | bc = bodyConstruct bt = bodyTail { $node = new BodyMultiple($bc.node, $bt.node); }
  958. ;
  959.  
  960. bodyTail returns [BodyTailNode node]
  961. : bc = bodyConstruct { $node = new BodyTailSingle($bc.node); }
  962. | bc = bodyConstruct bt = bodyTail { $node = new BodyTailMultiple($bc.node, $bt.node); }
  963. | { $node = new NullNode(); } // For the empty case
  964. ;
  965.  
  966. bodyConstruct returns [BodyConstructNode node]
  967. : spc = specificationPartConstruct { $node = new BodyConstructSpecification($spc.node); }
  968. | ec = executableConstruct { $node = new BodyConstructExecutable($ec.node); }
  969. ;
  970.  
  971. executableConstruct returns [ExecutableConstructNode node]
  972. : as = actionStmt { $node = new ExecutableConstructAction($as.node); }
  973. | dc = doConstruct { $node = new ExecutableConstructDo($dc.node); }
  974. | ic = ifConstruct { $node = new ExecutableConstructIf($ic.node); }
  975. // Add other variations of executableConstruct
  976. ;
  977.  
  978. whereConstruct returns [WhereConstructNode node]
  979. : where { $node = new WhereConstructWhere($where.node); }
  980. | ew = elseWhere { $node = new WhereConstructElseWhere($ew.node); }
  981. ;
  982.  
  983. elseWhere returns [ElseWhereNode node]
  984. : where { $node = new ElseWhereWhere($where.node); }
  985. | ew = elsewhereStmt { $node = new ElseWhereElsewhereStmt($ew.node); }
  986. | ew = elseWhere as = assignmentStmt { $node = new ElseWhereAssignment($ew.node, $as.node); }
  987. ;
  988.  
  989. elsewhereStmt returns [ElsewhereStmtNode node]
  990. : ELSEWHERE { $node = new ElsewhereStmt(); }
  991. ;
  992.  
  993. endWhereStmt returns [EndWhereStmtNode node]
  994. : ENDWHERE { $node = new EndWhereStmt(); }
  995. | END WHERE { $node = new EndWhereStmt(); }
  996. ;
  997. assignmentStmt returns [AssignmentStmtNode node]
  998. : lo = labelOptional NAME sfelro = sFExprListRefOptional ssro = substringRangeOptional ASSIGN expr = expression { $node = new AssignmentStmtLabelOptional($lo.node, $NAME.text, $sfelro.node, $ssro.node, $expr.node); }
  999. | NAME sfelro = sFExprListRefOptional PCT ndr = nameDataRef ASSIGN expr = expression { $node = new AssignmentStmtNameDataRef($NAME.text, $sfelro.node, $ndr.node, $expr.node); }
  1000. | NAME LPAREN sfadnl = sFDummyArgNameList RPAREN PCT ndr = nameDataRef ASSIGN expr = expression { $node = new AssignmentStmtNameDataRefList($NAME.text, $sfadnl.node, $ndr.node, $expr.node); }
  1001. ;
  1002. sFDummyArgNameList returns [SFDummyArgNameListNode node]
  1003. : | where as = assignmentStmt { $node = new WhereAssignmentStmt($where.node, $as.node); }
  1004.  
  1005. ;
  1006. where returns [WhereNode node]
  1007. : wcs = whereConstructStmt { $node = new WhereWhereConstructStmt($wcs.node); }
  1008. | where as = assignmentStmt { $node = new WhereAssignmentStmt($where.node, $as.node); }
  1009. ;
  1010.  
  1011. whereConstructStmt returns [WhereConstructStmtNode node]
  1012. : WHERE LPAREN me = maskExpr RPAREN { $node = new WhereConstructStmt($me.node); }
  1013. ;
  1014.  
  1015. maskExpr returns [MaskExprNode node]
  1016. : expr = expression { $node = new MaskExpr($expr.node); }
  1017. ;
  1018.  
  1019. caseConstruct returns [CaseConstructNode node]
  1020. : NAME COLON SELECTCASE LPAREN expr = expression RPAREN scr = selectCaseRange { $node = new CaseConstructNameSelectCase($NAME.text, $expr.node, $scr.node); }
  1021. // Add other variations of caseConstruct
  1022. ;
  1023.  
  1024. selectCaseRange returns [SelectCaseRangeNode node]
  1025. : scb = selectCaseBody ess = endSelectStmt { $node = new SelectCaseRange($scb.node, $ess.node); }
  1026. | ess = endSelectStmt { $node = new SelectCaseRangeEmpty($ess.node); }
  1027. ;
  1028.  
  1029. endSelectStmt returns [EndSelectStmtNode node]
  1030. : ENDSELECT on = optionalName { $node = new EndSelectStmt($on.node); }
  1031. | END SELECT on = optionalName { $node = new EndSelectStmt($on.node); }
  1032. ;
  1033.  
  1034. optionalName returns [OptionalNameNode node]
  1035. : NAME { $node = new OptionalName($NAME.text); }
  1036. | { $node = new NullNode(); } // For the empty case
  1037. ;
  1038.  
  1039. selectCaseBody returns [SelectCaseBodyNode node]
  1040. : cs = caseStmt { $node = new SelectCaseBodyCaseStmt($cs.node); }
  1041. | scb = selectCaseBody cbc = caseBodyConstruct { $node = new SelectCaseBodyMultiple($scb.node, $cbc.node); }
  1042. ;
  1043.  
  1044. caseBodyConstruct returns [CaseBodyConstructNode node]
  1045. : cs = caseStmt { $node = new CaseBodyConstructCaseStmt($cs.node); }
  1046. | ep = executionPartConstruct { $node = new CaseBodyConstructExecutionPart($ep.node); }
  1047. ;
  1048.  
  1049. caseStmt returns [CaseStmtNode node]
  1050. : CASE cs = caseSelector { $node = new CaseStmt($cs.node); }
  1051. | CASE cs = caseSelector NAME { $node = new CaseStmtName($cs.node, $NAME.text); }
  1052. ;
  1053.  
  1054. caseSelector returns [CaseSelectorNode node]
  1055. : LPAREN cvrl = caseValueRangeList RPAREN { $node = new CaseSelector($cvrl.node); }
  1056. | DEFAULT { $node = new CaseSelectorDefault(); }
  1057. ;
  1058.  
  1059. caseValueRangeList returns [CaseValueRangeListNode node]
  1060. : cvr = caseValueRange { $node = new CaseValueRangeListSingle($cvr.node); }
  1061. | cvr = caseValueRange cvrlt = caseValueRangeListTail { $node = new CaseValueRangeListMultiple($cvr.node, $cvrlt.node); }
  1062. ;
  1063.  
  1064. caseValueRangeListTail returns [CaseValueRangeListTailNode node]
  1065. : cvr = caseValueRange { $node = new CaseValueRangeListTailSingle($cvr.node); }
  1066. | cvr = caseValueRange cvrlt = caseValueRangeListTail { $node = new CaseValueRangeListTailMultiple($cvr.node, $cvrlt.node); }
  1067. | { $node = new NullNode(); } // For the empty case
  1068. ;
  1069.  
  1070. caseValueRange returns [CaseValueRangeNode node]
  1071. : expr = expression { $node = new CaseValueRangeLiteral($expr.node); }
  1072. // Add other variations of caseValueRange
  1073. ;
  1074.  
  1075. ifThenStmt returns [IfThenStmtNode node]
  1076. : IF LPAREN expr = expression RPAREN THEN { $node = new IfThenStmt($expr.node); }
  1077. ;
  1078.  
  1079. conditionalBody returns [ConditionalBodyNode node]
  1080. : epc = executionPartConstruct { $node = new ConditionalBodySingle($epc.node); }
  1081. | epc = executionPartConstruct cbt = conditionalBodyTail { $node = new ConditionalBodyMultiple($epc.node, $cbt.node); }
  1082. | { $node = new NullNode(); } // For the empty case
  1083. ;
  1084.  
  1085. conditionalBodyTail returns [ConditionalBodyTailNode node]
  1086. : epc = executionPartConstruct { $node = new ConditionalBodyTailSingle($epc.node); }
  1087. | epc = executionPartConstruct cbt = conditionalBodyTail { $node = new ConditionalBodyTailMultiple($epc.node, $cbt.node); }
  1088. | { $node = new NullNode(); } // For the empty case
  1089. ;
  1090. ifConstruct returns [IfConstructNode node]
  1091. : its = ifThenStmt cb = conditionalBody eicl = elseIfConstructList eco = elseConstructOptional eis = endIfStmt { $node = new IfConstruct($its.node, $cb.node, $eicl.node, $eco.node, $eis.node); }
  1092. ;
  1093. elseIfConstructList returns [ElseIfConstructListNode node]
  1094. : eic = elseIfConstruct { $node = new ElseIfConstructListSingle($eic.node); }
  1095. | eic = elseIfConstruct eicl = elseIfConstructList { $node = new ElseIfConstructListMultiple($eic.node, $eicl.node); }
  1096. | { $node = new NullNode(); } // For the empty case
  1097. ;
  1098.  
  1099. elseConstructOptional returns [ElseConstructOptionalNode node]
  1100. : ec = elseConstruct { $node = new ElseConstructOptional($ec.node); }
  1101. | { $node = new NullNode(); } // For the empty case
  1102. ;
  1103.  
  1104. elseIfConstruct returns [ElseIfConstructNode node]
  1105. : eis = elseIfStmt cb = conditionalBody { $node = new ElseIfConstruct($eis.node, $cb.node); }
  1106. ;
  1107.  
  1108. elseIfStmt returns [ElseIfStmtNode node]
  1109. : ELSEIF LPAREN expr = expression RPAREN THEN { $node = new ElseIfStmt($expr.node); }
  1110. | ELSE IF LPAREN expr = expression RPAREN THEN { $node = new ElseIfStmt($expr.node); }
  1111. ;
  1112.  
  1113. elseConstruct returns [ElseConstructNode node]
  1114. : es = elseStmt { $node = new ElseConstruct($es.node); }
  1115. ;
  1116.  
  1117. elseStmt returns [ElseStmtNode node]
  1118. : ELSE { $node = new ElseStmt(); }
  1119. ;
  1120.  
  1121. endIfStmt returns [EndIfStmtNode node]
  1122. : ENDIF { $node = new EndIfStmt(); }
  1123. | END IF { $node = new EndIfStmt(); }
  1124. ;
  1125.  
  1126. doConstruct returns [DoConstructNode node]
  1127. : lds = labelDoStmt { $node = new DoConstructLabelDo($lds.node); }
  1128. | bdc = blockDoConstruct { $node = new DoConstructBlockDo($bdc.node); }
  1129. ;
  1130.  
  1131. blockDoConstruct returns [BlockDoConstructNode node]
  1132. : nco = nameColonOptional DO cloc = commaLoopControlOptional epc = executionPartConstructList eds = endDoStmt { $node = new BlockDoConstruct($nco.node, $cloc.node, $epc.node, $eds.node); }
  1133. ;
  1134.  
  1135. nameColonOptional returns [NameColonOptionalNode node]
  1136. : nc = nameColon { $node = new NameColonOptional($nc.node); }
  1137. | { $node = new NullNode(); } // For the empty case
  1138. ;
  1139.  
  1140. commaLoopControlOptional returns [CommaLoopControlOptionalNode node]
  1141. : clc = commaLoopControl { $node = new CommaLoopControlOptional($clc.node); }
  1142. | { $node = new NullNode(); } // For the empty case
  1143. ;
  1144.  
  1145. executionPartConstructList returns [ExecutionPartConstructListNode node]
  1146. : epc = executionPartConstruct { $node = new ExecutionPartConstructListSingle($epc.node); }
  1147. | epc = executionPartConstruct epc = executionPartConstructList { $node = new ExecutionPartConstructListMultiple($epc.node, $epc.node); }
  1148. | { $node = new NullNode(); } // For the empty case
  1149. ;
  1150.  
  1151. endDoStmt returns [EndDoStmtNode node]
  1152. : ENDDO eno = endNameOptional { $node = new EndDoStmt($eno.node); }
  1153. | END DO eno = endNameOptional { $node = new EndDoStmt($eno.node); }
  1154. ;
  1155.  
  1156. endNameOptional returns [EndNameOptionalNode node]
  1157. : en = endName { $node = new EndNameOptional($en.node); }
  1158. | { $node = new NullNode(); } // For the empty case
  1159. ;
  1160.  
  1161. endName returns [EndNameNode node]
  1162. : ident { $node = new EndName($ident.node); }
  1163. ;
  1164.  
  1165. nameColon returns [NameColonNode node]
  1166. : NAME COLON { $node = new NameColon($NAME.text); }
  1167. ;
  1168.  
  1169. labelDoStmt returns [LabelDoStmtNode node]
  1170. : DO dlr = doLblRef clc = commaLoopControl epc = executionPartConstructList dld = doLblDef dl = doLabelStmt { $node = new LabelDoStmt($dlr.node, $clc.node, $epc.node, $dld.node, $dl.node); }
  1171. ;
  1172.  
  1173.  
  1174. doLblRef returns [DoLblRefNode node]
  1175. : ICON { $node = new DoLblRef($ICON.text); }
  1176. ;
  1177.  
  1178. doLblDef returns [DoLblDefNode node]
  1179. : ICON { $node = new DoLblDef($ICON.text); }
  1180. ;
  1181.  
  1182. doLabelStmt returns [DoLabelStmtNode node]
  1183. : as = actionStmt { $node = new DoLabelStmt($as.node); }
  1184. ;
  1185.  
  1186. executionPartConstruct returns [ExecutionPartConstructNode node]
  1187. : ec = executableConstruct { $node = new ExecutionPartConstructExecutable($ec.node); }
  1188. | fs = formatStmt { $node = new ExecutionPartConstructFormat($fs.node); }
  1189. | ds = dataStmt { $node = new ExecutionPartConstructData($ds.node); }
  1190. | es = entryStmt { $node = new ExecutionPartConstructEntry($es.node); }
  1191. | dds = doubleDoStmt { $node = new ExecutionPartConstructDoubleDo($dds.node); }
  1192. ;
  1193.  
  1194. doubleDoStmt returns [DoubleDoStmtNode node]
  1195. : DO lr = lblRef clc = commaLoopControl { $node = new DoubleDoStmt($lr.node, $clc.node); }
  1196. ;
  1197.  
  1198. dataStmt returns [DataStmtNode node]
  1199. : DATA dss = dataStmtSet dsst = dataStmtSetList { $node = new DataStmt($dss.node, $dsst.node); }
  1200. ;
  1201.  
  1202. dataStmtSetList returns [DataStmtSetListNode node]
  1203. : dsss = dataStmtSetSeparator dss = dataStmtSet dsst = dataStmtSetList { $node = new DataStmtSetList($dsss.node, $dss.node, $dsst.node); }
  1204. | { $node = new NullNode(); } // For the empty case
  1205. ;
  1206.  
  1207. dataStmtSetSeparator returns [DataStmtSetSeparatorNode node]
  1208. : COMMA { $node = new DataStmtSetSeparator(); }
  1209. | { $node = new NullNode(); } // For the empty case
  1210. ;
  1211.  
  1212. dataStmtSet returns [DataStmtSetNode node]
  1213. : dse1 = dataStmtObject dse2 = dataStmtValue { $node = new DataStmtSet($dse1.node, $dse2.node); }
  1214. ;
  1215.  
  1216. dataStmtObjectListTail returns [DataStmtObjectListTailNode node]
  1217. : COMMA dso = dataStmtObject dsot = dataStmtObjectListTail { $node = new DataStmtObjectListTail($dso.node, $dsot.node); }
  1218. | { $node = new NullNode(); } // For the empty case
  1219. ;
  1220.  
  1221. dataStmtValueListTail returns [DataStmtValueListTailNode node]
  1222. : COMMA dsv = dataStmtValue dsvt = dataStmtValueListTail { $node = new DataStmtValueListTail($dsv.node, $dsvt.node); }
  1223. | { $node = new NullNode(); } // For the empty case
  1224. ;
  1225.  
  1226. dataStmtValue returns [DataStmtValueNode node]
  1227. : const = constant { $node = new DataStmtValueConstant($const.node); }
  1228. | const = constant STAR const2 = constant { $node = new DataStmtValueConstantStar($const.node, $const2.node); }
  1229. | ncu = namedConstantUse STAR const = constant { $node = new DataStmtValueNamedConstantUseStar($ncu.node, $const.node); }
  1230. ;
  1231.  
  1232. dataStmtObject returns [DataStmtObjectNode node]
  1233. : variable { $node = new DataStmtObjectVariable($variable.node); }
  1234. | dataImpliedDo { $node = new DataStmtObjectDataImpliedDo($dataImpliedDo.node); }
  1235. ;
  1236.  
  1237. variable returns [VariableNode node]
  1238. : vn = variableName slro = subscriptListRefOptional sro = substringRangeOptional { $node = new Variable($vn.node, $slro.node, $sro.node); }
  1239. ;
  1240.  
  1241. subscriptListRefOptional returns [SubscriptListRefOptionalNode node]
  1242. : slr = subscriptListRef { $node = new SubscriptListRefOptional($slr.node); }
  1243. | { $node = new NullNode(); } // For the empty case
  1244. ;
  1245.  
  1246. substringRangeOptional returns [SubstringRangeOptionalNode node]
  1247. : sr = substringRange { $node = new SubstringRangeOptional($sr.node); }
  1248. | { $node = new NullNode(); } // For the empty case
  1249. ;
  1250.  
  1251. subscriptListRef returns [SubscriptListRefNode node]
  1252. : LPAREN sl = subscriptList RPAREN { $node = new SubscriptListRef($sl.node); }
  1253. ;
  1254.  
  1255. subscriptList returns [SubscriptListNode node]
  1256. : s = subscript { $node = new SubscriptListSingle($s.node); }
  1257. | s = subscript slt = subscriptListTail { $node = new SubscriptListMultiple($s.node, $slt.node); }
  1258. ;
  1259.  
  1260. subscriptListTail returns [SubscriptListTailNode node]
  1261. : s = subscript { $node = new SubscriptListTailSingle($s.node); }
  1262. | s = subscript slt = subscriptListTail { $node = new SubscriptListTailMultiple($s.node, $slt.node); }
  1263. | { $node = new NullNode(); } // For the empty case
  1264. ;
  1265.  
  1266. subscript returns [SubscriptNode node]
  1267. : expr = expression { $node = new Subscript($expr.node); }
  1268. ;
  1269. sectionSubscriptList returns [SectionSubscriptListNode node]
  1270. : ss = sectionSubscript { $node = new SectionSubscriptListSingle($ss.node); }
  1271. | ssl = sectionSubscriptList COMMA ss = sectionSubscript { $node = new SectionSubscriptListMultiple($ssl.node, $ss.node); }
  1272. ;
  1273.  
  1274. sectionSubscript returns [SectionSubscriptNode node]
  1275. : expr = expression stt = subscriptTripletTail { $node = new SectionSubscriptExprTripletTail($expr.node, $stt.node); }
  1276. | stt = subscriptTripletTail { $node = new SectionSubscriptTripletTail($stt.node); }
  1277. | expr = expression { $node = new SectionSubscriptExpr($expr.node); }
  1278. ;
  1279.  
  1280. subscriptTripletTail returns [SubscriptTripletTailNode node]
  1281. : COLON eo = expressionOptional { $node = new SubscriptTripletTailColonOptional($eo.node); }
  1282. | COLON expr1 = expression COLON expr2 = expression { $node = new SubscriptTripletTailColonExprExpr($expr1.node, $expr2.node); }
  1283. | DOUBLECOLON expr = expression { $node = new SubscriptTripletTailDoubleColonExpr($expr.node); }
  1284. | COLON { $node = new SubscriptTripletTailColon(); }
  1285. ;
  1286.  
  1287. expressionOptional returns [ExpressionOptionalNode node]
  1288. : expr = expression { $node = new ExpressionOptional($expr.node); }
  1289. | { $node = new NullNode(); } // For the empty case
  1290. ;
  1291. substringRange returns [SubstringRangeNode node]
  1292. : LPAREN eo = expressionOptional stt = subscriptTripletTail RPAREN { $node = new SubstringRange($eo.node, $stt.node); }
  1293. ;
  1294.  
  1295.  
  1296. dataImpliedDo returns [DataImpliedDoNode node]
  1297. : LPAREN dool = dataIDoObjectList COMMA iv = impliedDoVariable ASSIGN e1 = expression COMMA e2 = expression RPAREN { $node = new DataImpliedDo($dool.node, $iv.node, $e1.node, $e2.node); }
  1298. | LPAREN dool = dataIDoObjectList COMMA iv = impliedDoVariable ASSIGN e1 = expression COMMA e2 = expression COMMA e3 = expression RPAREN { $node = new DataImpliedDoExtended($dool.node, $iv.node, $e1.node, $e2.node, $e3.node); }
  1299. ;
  1300.  
  1301. dataIDoObjectList returns [DataIDoObjectListNode node]
  1302. : dio = dataIDoObject { $node = new DataIDoObjectListSingle($dio.node); }
  1303. | dio = dataIDoObject diolt = dataIDoObjectListTail { $node = new DataIDoObjectListMultiple($dio.node, $diolt.node); }
  1304. ;
  1305.  
  1306. dataIDoObjectListTail returns [DataIDoObjectListTailNode node]
  1307. : dio = dataIDoObject { $node = new DataIDoObjectListTailSingle($dio.node); }
  1308. | dio = dataIDoObject diolt = dataIDoObjectListTail { $node = new DataIDoObjectListTailMultiple($dio.node, $diolt.node); }
  1309. | { $node = new NullNode(); } // For the empty case
  1310. ;
  1311.  
  1312. dataIDoObject returns [DataIDoObjectNode node]
  1313. : ae = arrayElement { $node = new DataIDoObjectArrayElement($ae.node); }
  1314. | dimpDo = dataImpliedDo { $node = new DataIDoObjectDataImpliedDo($dimpDo.node); }
  1315. | sc = structureComponent { $node = new DataIDoObjectStructureComponent($sc.node); }
  1316. ;
  1317.  
  1318. structureComponent returns [StructureComponentNode node]
  1319. : vn = variableName fs = fieldSelector { $node = new StructureComponentVariableName($vn.node, $fs.node); }
  1320. | sc = structureComponent fs = fieldSelector { $node = new StructureComponentStructureComponent($sc.node, $fs.node); }
  1321. ;
  1322.  
  1323. fieldSelector returns [FieldSelectorNode node]
  1324. : LPAREN ssl = sectionSubscriptList RPAREN PCT NAME { $node = new FieldSelectorSubscriptList($ssl.node, $NAME.text); }
  1325. | PCT NAME { $node = new FieldSelectorName($NAME.text); }
  1326. ;
  1327.  
  1328. arrayElement returns [ArrayElementNode node]
  1329. : vn = variableName LPAREN ssl = sectionSubscriptList RPAREN { $node = new ArrayElementVariableName($vn.node, $ssl.node); }
  1330. | sc = structureComponent LPAREN ssl = sectionSubscriptList RPAREN { $node = new ArrayElementStructureComponent($sc.node, $ssl.node); }
  1331. ;
  1332.  
  1333. impliedDoVariable returns [ImpliedDoVariableNode node]
  1334. : NAME { $node = new ImpliedDoVariable($NAME.text); }
  1335. ;
  1336.  
  1337. commaLoopControl returns [CommaLoopControlNode node]
  1338. : co = commaOptional lc = loopControl { $node = new CommaLoopControl($co.node, $lc.node); }
  1339. ;
  1340.  
  1341. commaOptional returns [CommaOptionalNode node]
  1342. : COMMA { $node = new CommaOptional(); }
  1343. | { $node = new NullNode(); } // For the empty case
  1344. ;
  1345.  
  1346. loopControl returns [LoopControlNode node]
  1347. : vn = variableName ASSIGN e1 = expression COMMA e2 = expression co = commaExprOptional { $node = new LoopControlVariableAssign($vn.node, $e1.node, $e2.node, $co.node); }
  1348. | WHILE LPAREN expr = expression RPAREN { $node = new LoopControlWhile($expr.node); }
  1349. ;
  1350.  
  1351. commaExprOptional returns [CommaExprOptionalNode node]
  1352. : ce = commaExpr { $node = new CommaExprOptional($ce.node); }
  1353. | { $node = new NullNode(); } // For the empty case
  1354. ;
  1355.  
  1356. variableName returns [VariableNameNode node]
  1357. : NAME { $node = new VariableName($NAME.text); }
  1358. ;
  1359.  
  1360. commaExpr returns [CommaExprNode node]
  1361. : COMMA expr = expression { $node = new CommaExpr($expr.node); }
  1362. ;
  1363.  
  1364. semicolonStmt returns [SemicolonStmtNode node]
  1365. : SEMICOLON as = actionStmt { $node = new SemicolonStmt($as.node); }
  1366. ;
  1367.  
  1368. actionStmt returns [ActionStmtNode node]
  1369. : aif = arithmeticIfStmt { $node = new ActionStmtArithmeticIf($aif.node); }
  1370. | as = assignmentStmt { $node = new ActionStmtAssignment($as.node); }
  1371. | as = assignStmt { $node = new ActionStmtAssign($as.node); }
  1372. | bs = backspaceStmt { $node = new ActionStmtBackspace($bs.node); }
  1373. | cs = callStmt { $node = new ActionStmtCall($cs.node); }
  1374. | cls = closeStmt { $node = new ActionStmtClose($cls.node); }
  1375. | cs = continueStmt { $node = new ActionStmtContinue($cs.node); }
  1376. | efs = endfileStmt { $node = new ActionStmtEndfile($efs.node); }
  1377. | gts = gotoStmt { $node = new ActionStmtGoto($gts.node); }
  1378. | cgs = computedGotoStmt { $node = new ActionStmtComputedGoto($cgs.node); }
  1379. | ags = assignedGotoStmt { $node = new ActionStmtAssignedGoto($ags.node); }
  1380. | ifs = ifStmt { $node = new ActionStmtIf($ifs.node); }
  1381. | ins = inquireStmt { $node = new ActionStmtInquire($ins.node); }
  1382. | os = openStmt { $node = new ActionStmtOpen($os.node); }
  1383. | ps = pauseStmt { $node = new ActionStmtPause($ps.node); }
  1384. | ps = printStmt { $node = new ActionStmtPrint($ps.node); }
  1385. | ss = stopStmt { $node = new ActionStmtStop($ss.node); }
  1386. | ws = writeStmt { $node = new ActionStmtWrite($ws.node); }
  1387. | als = allocateStmt { $node = new ActionStmtAllocate($als.node); }
  1388. | cys = cycleStmt { $node = new ActionStmtCycle($cys.node); }
  1389. | dls = deallocateStmt { $node = new ActionStmtDeallocate($dls.node); }
  1390. | exs = exitStmt { $node = new ActionStmtExit($exs.node); }
  1391. | nus = nullifyStmt { $node = new ActionStmtNullify($nus.node); }
  1392. | pas = pointerAssignmentStmt { $node = new ActionStmtPointerAssignment($pas.node); }
  1393. | ws = whereStmt { $node = new ActionStmtWhere($ws.node); }
  1394. | ss = semicolonStmt { $node = new ActionStmtSemicolon($ss.node); }
  1395. ;
  1396.  
  1397. whereStmt returns [WhereStmtNode node]
  1398. : WHERE LPAREN me = maskExpr RPAREN as = assignmentStmt { $node = new WhereStmt($me.node, $as.node); }
  1399. ;
  1400.  
  1401. pointerAssignmentStmt returns [PointerAssignmentStmtNode node]
  1402. : NAME IMPLIEDT t = target { $node = new PointerAssignmentStmtSingle($NAME.text, $t.node); }
  1403. | NAME sfelro = sFExprListRefOptional PCT ndr = nameDataRef IMPLIEDT t = target { $node = new PointerAssignmentStmtComplex($NAME.text, $sfelro.node, $ndr.node, $t.node); }
  1404. ;
  1405. sFExprListRef returns [SFExprListRefNode node]
  1406. : LPAREN sfel = sFExprList cssl = expression RPAREN { $node = new SFExprListRef($sfel.node, $cssl.node); }
  1407. ;
  1408.  
  1409. sFExprList returns [SFExprListNode node]
  1410. : expr1 = expression COLON expr2 = expression { $node = new SFExprListExprColonExpr($expr1.node, $expr2.node); }
  1411. | expr = expression COLON { $node = new SFExprListExprColon($expr.node); }
  1412. | expr = expression { $node = new SFExprListExpr($expr.node); }
  1413. | COLON expr = expression { $node = new SFExprListColonExpr($expr.node); }
  1414. | COLON { $node = new SFExprListColon(); }
  1415. | expr1 = expression COLON expr2 = expression COLON expr3 = expression { $node = new SFExprListExprColonExprColonExpr($expr1.node, $expr2.node, $expr3.node); }
  1416. | COLON expr1 = expression COLON expr2 = expression { $node = new SFExprListColonExprColonExpr($expr1.node, $expr2.node); }
  1417. | DOUBLECOLON expr = expression { $node = new SFExprListDoubleColonExpr($expr.node); }
  1418. | expr1 = expression DOUBLECOLON expr2 = expression { $node = new SFExprListExprDoubleColonExpr($expr1.node, $expr2.node); }
  1419. ;
  1420. sFExprListRefOptional returns [SFExprListRefOptionalNode node]
  1421. : sfelr = sFExprListRef { $node = new SFExprListRefOptional($sfelr.node); }
  1422. | { $node = new NullNode(); } // For the empty case
  1423. ;
  1424.  
  1425. target returns [TargetNode node]
  1426. : expr = expression { $node = new Target($expr.node); }
  1427. ;
  1428.  
  1429. nullifyStmt returns [NullifyStmtNode node]
  1430. : NULLIFY LPAREN pol = pointerObjectList RPAREN { $node = new NullifyStmt($pol.node); }
  1431. ;
  1432.  
  1433. pointerObjectList returns [PointerObjectListNode node]
  1434. : po = pointerObject { $node = new PointerObjectListSingle($po.node); }
  1435. | po = pointerObject polt = pointerObjectListTail { $node = new PointerObjectListMultiple($po.node, $polt.node); }
  1436. ;
  1437.  
  1438. pointerObjectListTail returns [PointerObjectListTailNode node]
  1439. : COMMA po = pointerObject { $node = new PointerObjectListTailSingle($po.node); }
  1440. | COMMA po = pointerObject polt = pointerObjectListTail { $node = new PointerObjectListTailMultiple($po.node, $polt.node); }
  1441. | { $node = new NullNode(); } // For the empty case
  1442. ;
  1443.  
  1444. pointerObject returns [PointerObjectNode node]
  1445. : NAME { $node = new PointerObjectName($NAME.text); }
  1446. | pf = pointerField { $node = new PointerObjectField($pf.node); }
  1447. ;
  1448.  
  1449. pointerField returns [PointerFieldNode node]
  1450. : NAME sfelro = sFExprListRefOptional PCT NAME { $node = new PointerFieldName($NAME.text, $sfelro.node, $NAME.text); }
  1451. | pf = pointerField fs = fieldSelector { $node = new PointerFieldComplex($pf.node, $fs.node); }
  1452. ;
  1453.  
  1454. exitStmt returns [ExitStmtNode node]
  1455. : EXIT eno = endNameOptional { $node = new ExitStmt($eno.node); }
  1456. ;
  1457. deallocateStmt returns [DeallocateStmtNode node]
  1458. : DEALLOCATE LPAREN aol = allocateObjectList COMMA STAT ASSIGN v = variable RPAREN { $node = new DeallocateStmtWithStat($aol.node, $v.node); }
  1459. | DEALLOCATE LPAREN aol = allocateObjectList RPAREN { $node = new DeallocateStmt($aol.node); }
  1460. ;
  1461.  
  1462. allocateObjectList returns [AllocateObjectListNode node]
  1463. : ao = allocateObject { $node = new AllocateObjectListSingle($ao.node); }
  1464. | ao = allocateObject aolt = allocateObjectListTail { $node = new AllocateObjectListMultiple($ao.node, $aolt.node); }
  1465. ;
  1466.  
  1467. allocateObjectListTail returns [AllocateObjectListTailNode node]
  1468. : COMMA ao = allocateObject { $node = new AllocateObjectListTailSingle($ao.node); }
  1469. | COMMA ao = allocateObject aolt = allocateObjectListTail { $node = new AllocateObjectListTailMultiple($ao.node, $aolt.node); }
  1470. | { $node = new NullNode(); } // For the empty case
  1471. ;
  1472.  
  1473. cycleStmt returns [CycleStmtNode node]
  1474. : CYCLE eno = endNameOptional { $node = new CycleStmt($eno.node); }
  1475. ;
  1476.  
  1477. allocateStmt returns [AllocateStmtNode node]
  1478. : ALLOCATE LPAREN al = allocationList COMMA STAT ASSIGN v = variable RPAREN { $node = new AllocateStmtWithStat($al.node, $v.node); }
  1479. | ALLOCATE LPAREN al = allocationList RPAREN { $node = new AllocateStmt($al.node); }
  1480. ;
  1481.  
  1482. allocationList returns [AllocationListNode node]
  1483. : a = allocation { $node = new AllocationListSingle($a.node); }
  1484. | a = allocation alt = allocationListTail { $node = new AllocationListMultiple($a.node, $alt.node); }
  1485. ;
  1486.  
  1487. allocationListTail returns [AllocationListTailNode node]
  1488. : COMMA a = allocation { $node = new AllocationListTailSingle($a.node); }
  1489. | COMMA a = allocation alt = allocationListTail { $node = new AllocationListTailMultiple($a.node, $alt.node); }
  1490. | { $node = new NullNode(); } // For the empty case
  1491. ;
  1492.  
  1493. allocation returns [AllocationNode node]
  1494. : ao = allocateObject { $node = new AllocationAllocateObject($ao.node); }
  1495. | ao = allocateObject as = allocatedShape { $node = new AllocationAllocateObjectWithShape($ao.node, $as.node); }
  1496. ;
  1497.  
  1498. allocateObject returns [AllocateObjectNode node]
  1499. : vn = variableName { $node = new AllocateObjectVariableName($vn.node); }
  1500. | ao = allocateObject fs = fieldSelector { $node = new AllocateObjectFieldSelector($ao.node, $fs.node); }
  1501. ;
  1502.  
  1503. allocatedShape returns [AllocatedShapeNode node]
  1504. : LPAREN ssl = sectionSubscriptList RPAREN { $node = new AllocatedShape($ssl.node); }
  1505. ;
  1506.  
  1507. stopStmt returns [StopStmtNode node]
  1508. : STOP svo = stopValueOptional { $node = new StopStmt($svo.node); }
  1509. ;
  1510.  
  1511. stopValueOptional returns [StopValueOptionalNode node]
  1512. : ICON { $node = new StopValueOptionalIcon($ICON.text); }
  1513. | SCON { $node = new StopValueOptionalString($SCON.text); }
  1514. | { $node = new NullNode(); } // For the empty case
  1515. ;
  1516.  
  1517. writeStmt returns [WriteStmtNode node]
  1518. : WRITE LPAREN iocl = ioControlSpecList RPAREN oilo = outputItemListOptional { $node = new WriteStmt($iocl.node, $oilo.node); }
  1519. ;
  1520.  
  1521. outputItemListOptional returns [OutputItemListOptionalNode node]
  1522. : oil = outputItemList { $node = new OutputItemListOptional($oil.node); }
  1523. | { $node = new NullNode(); } // For the empty case
  1524. ;
  1525. ioControlSpec returns [IOControlSpecNode node]
  1526. : FMT ASSIGN fi = formatIdentifier { $node = new IOControlSpecFmt($fi.node); }
  1527. | UNIT ASSIGN ui = unitIdentifier { $node = new IOControlSpecUnit($ui.node); }
  1528. | REC ASSIGN expr = expression { $node = new IOControlSpecRec($expr.node); }
  1529. | END ASSIGN lr = lblRef { $node = new IOControlSpecEnd($lr.node); }
  1530. | ERR ASSIGN lr = lblRef { $node = new IOControlSpecErr($lr.node); }
  1531. | IOSTAT ASSIGN sv = scalarVariable { $node = new IOControlSpecIOStat($sv.node); }
  1532. | NML ASSIGN ngn = namelistGroupName { $node = new IOControlSpecNml($ngn.node); }
  1533. | ADVANCE ASSIGN cExpr = cExpression { $node = new IOControlSpecAdvance($cExpr.node); }
  1534. | SIZE ASSIGN var = variable { $node = new IOControlSpecSize($var.node); }
  1535. | EOR ASSIGN lr = lblRef { $node = new IOControlSpecEor($lr.node); }
  1536. ;
  1537. ioControlSpecList returns [IOControlSpecListNode node]
  1538. : ui = unitIdentifier DOLLAR COMMA { $node = new IOControlSpecListUnitIdentifier($ui.node); }
  1539. | ui = unitIdentifier COMMA fi = formatIdentifier { $node = new IOControlSpecListFormatIdentifier($ui.node, $fi.node); }
  1540. | ui = unitIdentifier COMMA iocs = ioControlSpec { $node = new IOControlSpecListUnitIdentifierIOControlSpec($ui.node, $iocs.node); }
  1541. | iocs = ioControlSpec { $node = new IOControlSpecListIOControlSpec($iocs.node); }
  1542. | iocsl = ioControlSpecList COMMA iocs = ioControlSpec { $node = new IOControlSpecListMultiple($iocsl.node, $iocs.node); }
  1543. ;
  1544.  
  1545. printStmt returns [PrintStmtNode node]
  1546. : PRINT fi = formatIdentifier COMMA oil = outputItemList { $node = new PrintStmtWithItemList($fi.node, $oil.node); }
  1547. | PRINT fi = formatIdentifier { $node = new PrintStmtNoItemList($fi.node); }
  1548. ;
  1549.  
  1550. outputItemList returns [OutputItemListNode node]
  1551. : expr = expression { $node = new OutputItemListSingleExpression($expr.node); }
  1552. | oil1 = outputItemList1 { $node = new OutputItemListComplex($oil1.node); }
  1553. ;
  1554.  
  1555. outputItemList1 returns [OutputItemList1Node node]
  1556. : expr1 = expression COMMA expr2 = expression { $node = new OutputItemList1TwoExpressions($expr1.node, $expr2.node); }
  1557. | expr = expression COMMA oid = outputImpliedDo { $node = new OutputItemList1ExpressionImpliedDo($expr.node, $oid.node); }
  1558. | oid = outputImpliedDo { $node = new OutputItemList1ImpliedDo($oid.node); }
  1559. | oil1 = outputItemList1 COMMA expr = expression { $node = new OutputItemList1MultipleExpressions($oil1.node, $expr.node); }
  1560. | oil1 = outputItemList1 COMMA oid = outputImpliedDo { $node = new OutputItemList1MultipleImpliedDo($oil1.node, $oid.node); }
  1561. ;
  1562.  
  1563. outputImpliedDo returns [OutputImpliedDoNode node]
  1564. : LPAREN expr = expression COMMA iv = impliedDoVariable ASSIGN e1 = expression COMMA e2 = expression ceo = commaExprOptional RPAREN { $node = new OutputImpliedDoSimple($expr.node, $iv.node, $e1.node, $e2.node, $ceo.node); }
  1565. | LPAREN oil1 = outputItemList1 COMMA iv = impliedDoVariable ASSIGN e1 = expression COMMA e2 = expression ceo = commaExprOptional RPAREN { $node = new OutputImpliedDoComplex($oil1.node, $iv.node, $e1.node, $e2.node, $ceo.node); }
  1566. ;
  1567.  
  1568. formatIdentifier returns [FormatIdentifierNode node]
  1569. : lblRef { $node = new FormatIdentifierLabelRef($lblRef.node); }
  1570. | cExpr = cExpression { $node = new FormatIdentifierCExpression($cExpr.node); }
  1571. | STAR { $node = new FormatIdentifierStar(); }
  1572. ;
  1573.  
  1574. pauseStmt returns [PauseStmtNode node]
  1575. : PAUSE svo = stopValueOptional { $node = new PauseStmt($svo.node); }
  1576. ;
  1577.  
  1578. openStmt returns [OpenStmtNode node]
  1579. : OPEN LPAREN csl = connectSpecList RPAREN { $node = new OpenStmt($csl.node); }
  1580. ;
  1581.  
  1582. connectSpecList returns [ConnectSpecListNode node]
  1583. : uico = unitIdentifierCommaOptional cso = connectSpecOptional cslt = connectSpecListTail { $node = new ConnectSpecList($uico.node, $cso.node, $cslt.node); }
  1584. ;
  1585. unitIdentifierComma returns [UnitIdentifierCommaNode node]
  1586. : ui = unitIdentifier COMMA { $node = new UnitIdentifierComma($ui.node); }
  1587. | ui = unitIdentifier { $node = new UnitIdentifierCommaSingle($ui.node); }
  1588. ;
  1589. unitIdentifierCommaOptional returns [UnitIdentifierCommaOptionalNode node]
  1590. : uic = unitIdentifierComma { $node = new UnitIdentifierCommaOptional($uic.node); }
  1591. | { $node = new NullNode(); } // For the empty case
  1592. ;
  1593.  
  1594. connectSpecOptional returns [ConnectSpecOptionalNode node]
  1595. : cs = connectSpec { $node = new ConnectSpecOptional($cs.node); }
  1596. | { $node = new NullNode(); } // For the empty case
  1597. ;
  1598.  
  1599. connectSpecListTail returns [ConnectSpecListTailNode node]
  1600. : COMMA cs = connectSpec { $node = new ConnectSpecListTailSingle($cs.node); }
  1601. | COMMA cs = connectSpec cslt = connectSpecListTail { $node = new ConnectSpecListTailMultiple($cs.node, $cslt.node); }
  1602. | { $node = new NullNode(); } // For the empty case
  1603. ;
  1604.  
  1605. connectSpec returns [ConnectSpecNode node]
  1606. : UNIT ASSIGN ui = unitIdentifier { $node = new ConnectSpecUnit($ui.node); }
  1607. | ERR ASSIGN lbl = lblRef { $node = new ConnectSpecErr($lbl.node); }
  1608. | FILE ASSIGN cExpr = cExpression { $node = new ConnectSpecFile($cExpr.node); }
  1609. // Add other variations of connectSpec
  1610. ;
  1611.  
  1612. inquireStmt returns [InquireStmtNode node]
  1613. : INQUIRE LPAREN isl = inquireSpecList RPAREN { $node = new InquireStmtSpecList($isl.node); }
  1614. | INQUIRE LPAREN IOLENGTH ASSIGN sv = scalarVariable RPAREN oil = outputItemList { $node = new InquireStmtIOLength($sv.node, $oil.node); }
  1615. ;
  1616.  
  1617. inquireSpecList returns [InquireSpecListNode node]
  1618. : uio = unitIdentifierOptional iso = inquireSpecOptional islt = inquireSpecListTail { $node = new InquireSpecList($uio.node, $iso.node, $islt.node); }
  1619. ;
  1620.  
  1621. unitIdentifierOptional returns [UnitIdentifierOptionalNode node]
  1622. : ui = unitIdentifier { $node = new UnitIdentifierOptional($ui.node); }
  1623. | { $node = new NullNode(); } // For the empty case
  1624. ;
  1625.  
  1626. inquireSpecOptional returns [InquireSpecOptionalNode node]
  1627. : is = inquireSpec { $node = new InquireSpecOptional($is.node); }
  1628. | { $node = new NullNode(); } // For the empty case
  1629. ;
  1630.  
  1631. inquireSpecListTail returns [InquireSpecListTailNode node]
  1632. : COMMA is = inquireSpec { $node = new InquireSpecListTailSingle($is.node); }
  1633. | COMMA is = inquireSpec islt = inquireSpecListTail { $node = new InquireSpecListTailMultiple($is.node, $islt.node); }
  1634. | { $node = new NullNode(); } // For the empty case
  1635. ;
  1636.  
  1637. inquireSpec returns [InquireSpecNode node]
  1638. : UNIT ASSIGN ui = unitIdentifier { $node = new InquireSpecUnit($ui.node); }
  1639. // Define other variations of inquireSpec as per your CFG
  1640. ;
  1641.  
  1642. assignedGotoStmt returns [AssignedGotoStmtNode node]
  1643. : (GOTO | GO TO) vn = variableName { $node = new AssignedGotoStmtVariableName($vn.node); }
  1644. | (GOTO | GO TO) vn = variableName LPAREN lrl = lblRefList RPAREN { $node = new AssignedGotoStmtVariableNameLblRefList($vn.node, $lrl.node); }
  1645. | (GOTO | GO TO) vc = variableComma LPAREN lrl = lblRefList RPAREN { $node = new AssignedGotoStmtVariableCommaLblRefList($vc.node, $lrl.node); }
  1646. ;
  1647.  
  1648. variableComma returns [VariableCommaNode node]
  1649. : vn = variableName COMMA { $node = new VariableComma($vn.node); }
  1650. ;
  1651.  
  1652. gotoStmt returns [GotoStmtNode node]
  1653. : (GOTO | GO TO) lr = lblRef { $node = new GotoStmt($lr.node); }
  1654. ;
  1655.  
  1656. computedGotoStmt returns [ComputedGotoStmtNode node]
  1657. : GOTO LPAREN lrl = lblRefList RPAREN co = commaOptional expr = expression { $node = new ComputedGotoStmt($lrl.node, $co.node, $expr.node); }
  1658. ;
  1659. lblRefList returns [LblRefListNode node]
  1660. : lr = lblRef lrlt = lblRefListTail { $node = new LblRefList($lr.node, $lrlt.node); }
  1661. ;
  1662.  
  1663. lblRefListTail returns [LblRefListTailNode node]
  1664. : COMMA lr = lblRef { $node = new LblRefListTailSingle($lr.node); }
  1665. | COMMA lr = lblRef lrlt = lblRefListTail { $node = new LblRefListTailMultiple($lr.node, $lrlt.node); }
  1666. | { $node = new NullNode(); } // For the empty case
  1667. ;
  1668.  
  1669. endfileStmt returns [EndfileStmtNode node]
  1670. : (ENDFILE | END FILE) ui = unitIdentifier { $node = new EndfileStmtUnitIdentifier($ui.node); }
  1671. | (ENDFILE | END FILE) LPAREN psl = positionSpecList RPAREN { $node = new EndfileStmtPositionSpecList($psl.node); }
  1672. ;
  1673.  
  1674. continueStmt returns [ContinueStmtNode node]
  1675. : CONTINUE { $node = new ContinueStmt(); }
  1676. ;
  1677.  
  1678. closeStmt returns [CloseStmtNode node]
  1679. : CLOSE LPAREN csl = closeSpecList RPAREN { $node = new CloseStmt($csl.node); }
  1680. ;
  1681.  
  1682. closeSpecList returns [CloseSpecListNode node]
  1683. : uico = unitIdentifierCommaOptional cso = closeSpecOptional cslt = closeSpecListTail { $node = new CloseSpecList($uico.node, $cso.node, $cslt.node); }
  1684. ;
  1685.  
  1686. closeSpecOptional returns [CloseSpecOptionalNode node]
  1687. : cs = closeSpec { $node = new CloseSpecOptional($cs.node); }
  1688. | { $node = new NullNode(); } // For the empty case
  1689. ;
  1690.  
  1691. closeSpecListTail returns [CloseSpecListTailNode node]
  1692. : COMMA cs = closeSpec { $node = new CloseSpecListTailSingle($cs.node); }
  1693. | COMMA cs = closeSpec cslt = closeSpecListTail { $node = new CloseSpecListTailMultiple($cs.node, $cslt.node); }
  1694. | { $node = new NullNode(); } // For the empty case
  1695. ;
  1696.  
  1697. closeSpec returns [CloseSpecNode node]
  1698. : UNIT ASSIGN ui = unitIdentifier { $node = new CloseSpecUnit($ui.node); }
  1699. | ERR ASSIGN lr = lblRef { $node = new CloseSpecErr($lr.node); }
  1700. | STATUS ASSIGN cExpr = cExpression { $node = new CloseSpecStatus($cExpr.node); }
  1701. | IOSTAT sv = scalarVariable { $node = new CloseSpecIOStat($sv.node); }
  1702. ;
  1703. cExpression returns [CExpressionNode node]
  1704. : cp = cPrimary cpcol = cPrimaryConcatOpList { $node = new CExpression($cp.node, $cpcol.node); }
  1705. ;
  1706.  
  1707. cPrimaryConcatOpList returns [CPrimaryConcatOpListNode node]
  1708. : cpco = cPrimaryConcatOp { $node = new CPrimaryConcatOpListSingle($cpco.node); }
  1709. | cpco = cPrimaryConcatOp cpcol = cPrimaryConcatOpList { $node = new CPrimaryConcatOpListMultiple($cpco.node, $cpcol.node); }
  1710. | { $node = new NullNode(); } // For the empty case
  1711. ;
  1712.  
  1713. cPrimary returns [CPrimaryNode node]
  1714. : cop = cOperand { $node = new CPrimaryOperand($cop.node); }
  1715. | LPAREN cExpr = cExpression RPAREN { $node = new CPrimaryExpression($cExpr.node); }
  1716. ;
  1717.  
  1718. cOperand returns [COperandNode node]
  1719. : SCON { $node = new COperandString($SCON.text); }
  1720. | ndr = nameDataRef { $node = new COperandNameDataRef($ndr.node); }
  1721. | fr = functionReference { $node = new COperandFunctionReference($fr.node); }
  1722. ;
  1723.  
  1724. cPrimaryConcatOp returns [CPrimaryConcatOpNode node]
  1725. : cp = cPrimary DIV SPOFF DIV SPON { $node = new CPrimaryConcatOp($cp.node); }
  1726. ;
  1727.  
  1728. callStmt returns [CallStmtNode node]
  1729. : CALL snu = subroutineNameUse { $node = new CallStmtNoArgs($snu.node); }
  1730. | CALL snu = subroutineNameUse LPAREN sal = subroutineArgList RPAREN { $node = new CallStmtWithArgs($snu.node, $sal.node); }
  1731. ;
  1732.  
  1733. subroutineNameUse returns [SubroutineNameUseNode node]
  1734. : NAME { $node = new SubroutineNameUse($NAME.text); }
  1735. ;
  1736.  
  1737. subroutineArgList returns [SubroutineArgListNode node]
  1738. : sao = subroutineArgOnly { $node = new SubroutineArgListSingle($sao.node); }
  1739. | sawt = subroutineArgWithTail { $node = new SubroutineArgListMultiple($sawt.node); }
  1740. ;
  1741.  
  1742. subroutineArg returns [SubroutineArgNode node]
  1743. : expr = expression { $node = new SubroutineArgExpression($expr.node); }
  1744. | HOLLERITH { $node = new SubroutineArgHollerith($HOLLERITH.text); }
  1745. | STAR lr = lblRef { $node = new SubroutineArgLblRef($lr.node); }
  1746. | NAME ASSIGN expr = expression { $node = new SubroutineArgNameAssignExpression($NAME.text, $expr.node); }
  1747. | NAME ASSIGN HOLLERITH { $node = new SubroutineArgNameAssignHollerith($NAME.text, $HOLLERITH.text); }
  1748. | NAME ASSIGN STAR lr = lblRef { $node = new SubroutineArgNameAssignLblRef($NAME.text, $lr.node); }
  1749. ;
  1750.  
  1751. labelOptional returns [LabelOptionalNode node]
  1752. : label { $node = new LabelOptional($label.node); }
  1753. | { $node = new NullNode(); } // For the empty case
  1754. ;
  1755.  
  1756.  
  1757. subroutineArgOnly returns [SubroutineArgOnlyNode node]
  1758. : sa = subroutineArg { $node = new SubroutineArgOnly($sa.node); }
  1759. ;
  1760.  
  1761. subroutineArgWithTail returns [SubroutineArgWithTailNode node]
  1762. : sa = subroutineArg salt = subroutineArgListTail { $node = new SubroutineArgWithTail($sa.node, $salt.node); }
  1763. ;
  1764.  
  1765. subroutineArgListTail returns [SubroutineArgListTailNode node]
  1766. : COMMA sa = subroutineArg { $node = new SubroutineArgListTailSingle($sa.node); }
  1767. | COMMA sa = subroutineArg salt = subroutineArgListTail { $node = new SubroutineArgListTailMultiple($sa.node, $salt.node); }
  1768. | { $node = new NullNode(); } // For the empty case
  1769. ;
  1770.  
  1771. arithmeticIfStmt returns [ArithmeticIfStmtNode node]
  1772. : IF LPAREN expr = expression RPAREN lr1 = lblRef COMMA lr2 = lblRef COMMA lr3 = lblRef { $node = new ArithmeticIfStmt($expr.node, $lr1.node, $lr2.node, $lr3.node); }
  1773. ;
  1774.  
  1775. lblRef returns [LblRefNode node]
  1776. : label { $node = new LblRef($label.node); }
  1777. ;
  1778.  
  1779. label returns [LabelNode node]
  1780. : ICON { $node = new Label($ICON.text); }
  1781. ;
  1782.  
  1783. assignStmt returns [AssignStmtNode node]
  1784. : lo = labelOptional NAME sfelro = sFExprListRefOptional ssro = substringRangeOptional ASSIGN expr = expression { $node = new AssignStmt($lo.node, $NAME.text, $sfelro.node, $ssro.node, $expr.node); }
  1785. // Add other variations of assignStmt
  1786. ;
  1787.  
  1788. backspaceStmt returns [BackspaceStmtNode node]
  1789. : BACKSPACE ui = unitIdentifier { $node = new BackspaceStmtUnitIdentifier($ui.node); }
  1790. | BACKSPACE LPAREN psl = positionSpecList RPAREN { $node = new BackspaceStmtPositionSpecList($psl.node); }
  1791. ;
  1792. unitIdentifier returns [UnitIdentifierNode node]
  1793. : ufe = uFExpr { $node = new UnitIdentifierUFExpr($ufe.node); }
  1794. | STAR { $node = new UnitIdentifierStar(); }
  1795. ;
  1796.  
  1797. positionSpecList returns [PositionSpecListNode node]
  1798. : uico = unitIdentifierCommaOptional ps = positionSpec pslt = positionSpecListTail { $node = new PositionSpecList($uico.node, $ps.node, $pslt.node); }
  1799. ;
  1800.  
  1801. positionSpecListTail returns [PositionSpecListTailNode node]
  1802. : ps = positionSpec { $node = new PositionSpecListTailSingle($ps.node); }
  1803. | ps = positionSpec pslt = positionSpecListTail { $node = new PositionSpecListTailMultiple($ps.node, $pslt.node); }
  1804. | { $node = new NullNode(); } // For the empty case
  1805. ;
  1806.  
  1807. positionSpec returns [PositionSpecNode node]
  1808. : UNIT ASSIGN ui = unitIdentifier { $node = new PositionSpecUnit($ui.node); }
  1809. | ERR ASSIGN lr = lblRef { $node = new PositionSpecErr($lr.node); }
  1810. | IOSTAT ASSIGN sv = scalarVariable { $node = new PositionSpecIOStat($sv.node); }
  1811. // Add other variations of positionSpec
  1812. ;
  1813.  
  1814. scalarVariable returns [ScalarVariableNode node]
  1815. : vn = variableName { $node = new ScalarVariableVariableName($vn.node); }
  1816. | ae = arrayElement { $node = new ScalarVariableArrayElement($ae.node); }
  1817. // Add other variations of scalarVariable
  1818. ;
  1819.  
  1820. uFExpr returns [UFExprNode node]
  1821. : uft = uFTerm { $node = new UFExprTerm($uft.node); }
  1822. | (PLUS | MINUS) uft = uFTerm { $node = new UFExprUnary($uft.node); }
  1823. | ufe = uFExpr (PLUS | MINUS) uft = uFTerm { $node = new UFExprBinary($ufe.node, $uft.node); }
  1824. // Add other variations of uFExpr
  1825. ;
  1826.  
  1827. uFTerm returns [UFTermNode node]
  1828. : uff = uFFactor { $node = new UFTermFactor($uff.node); }
  1829. | uft = uFTerm (STAR | DIV) uff = uFFactor { $node = new UFTermBinary($uft.node, $uff.node); }
  1830. | uft = uFTerm (DIV DIV) ufp = uFPrimary { $node = new UFTermDoubleDiv($uft.node, $ufp.node); }
  1831. // Add other variations of uFTerm
  1832. ;
  1833.  
  1834. uFFactor returns [UFFactorNode node]
  1835. : ufp = uFPrimary { $node = new UFFactorPrimary($ufp.node); }
  1836. | ufp = uFPrimary POWER uff = uFFactor { $node = new UFFactorPower($ufp.node, $uff.node); }
  1837. // Add other variations of uFFactor
  1838. ;
  1839.  
  1840. uFPrimary returns [UFPrimaryNode node]
  1841. : ICON { $node = new UFPrimaryIcon($ICON.text); }
  1842. | SCON { $node = new UFPrimaryString($SCON.text); }
  1843. | ndr = nameDataRef { $node = new UFPrimaryNameDataRef($ndr.node); }
  1844. | fr = functionReference { $node = new UFPrimaryFunctionReference($fr.node); }
  1845. | LPAREN ufe = uFExpr RPAREN { $node = new UFPrimaryExpression($ufe.node); }
  1846. // Add other variations of uFPrimary
  1847. ;
  1848.  
  1849. subroutineSubprogram returns [SubroutineSubprogramNode node]
  1850. : SUBROUTINE sn = subroutineName sr = subroutineRange { $node = new SubroutineSubprogramRegular($sn.node, $sr.node); }
  1851. | RECURSIVE SUBROUTINE sn = subroutineName sr = subroutineRange { $node = new SubroutineSubprogramRecursive($sn.node, $sr.node); }
  1852. ;
  1853.  
  1854. subroutineName returns [SubroutineNameNode node]
  1855. : NAME { $node = new SubroutineName($NAME.text); }
  1856. ;
  1857.  
  1858. subroutineRange returns [SubroutineRangeNode node]
  1859. : splwb = subroutineParListWithBody ess = endSubroutineStmt { $node = new SubroutineRangeParListWithBody($splwb.node, $ess.node); }
  1860. | spl = subroutineParList bpi = bodyPlusInternals ess = endSubroutineStmt { $node = new SubroutineRangeParListBodyPlusInternals($spl.node, $bpi.node, $ess.node); }
  1861. ;
  1862.  
  1863. subroutineParListWithBody returns [SubroutineParListWithBodyNode node]
  1864. : spl = subroutineParList { $node = new SubroutineParListWithBodyParList($spl.node); }
  1865. | spl = subroutineParList b = body { $node = new SubroutineParListWithBodyBody($spl.node, $b.node); }
  1866. ;
  1867.  
  1868. includeStmt returns [IncludeStmtNode node]
  1869. : INCLUDE SCON { $node = new IncludeStmt($SCON.text); }
  1870. ;
  1871.  
  1872. implicitStmt returns [ImplicitStmtNode node]
  1873. : IMPLICIT isl = implicitSpecList { $node = new ImplicitStmtSpecList($isl.node); }
  1874. | IMPLICIT NONE { $node = new ImplicitStmtNone(); }
  1875. ;
  1876.  
  1877. implicitSpecList returns [ImplicitSpecListNode node]
  1878. : sis = singleImplicitSpec { $node = new ImplicitSpecListSingle($sis.node); }
  1879. | mis = multipleImplicitSpecs { $node = new ImplicitSpecListMultiple($mis.node); }
  1880. ;
  1881.  
  1882. singleImplicitSpec returns [SingleImplicitSpecNode node]
  1883. : is = implicitSpec { $node = new SingleImplicitSpec($is.node); }
  1884. ;
  1885.  
  1886. multipleImplicitSpecs returns [MultipleImplicitSpecsNode node]
  1887. : is = implicitSpec COMMA isl = implicitSpecList { $node = new MultipleImplicitSpecs($is.node, $isl.node); }
  1888. ;
  1889.  
  1890. implicitSpec returns [ImplicitSpecNode node]
  1891. : ts = typeSpec ir = implicitRanges { $node = new ImplicitSpecTypeSpecRanges($ts.node, $ir.node); }
  1892. | ts = typeSpec LPAREN ir = implicitRanges RPAREN { $node = new ImplicitSpecTypeSpecRangesParen($ts.node, $ir.node); }
  1893. ;
  1894.  
  1895. implicitRanges returns [ImplicitRangesNode node]
  1896. : irl = implicitRangeList { $node = new ImplicitRanges($irl.node); }
  1897. ;
  1898.  
  1899. implicitRangeList returns [ImplicitRangeListNode node]
  1900. : ir = implicitRange { $node = new ImplicitRangeListSingle($ir.node); }
  1901. | irl = implicitRangeList COMMA ir = implicitRange { $node = new ImplicitRangeListMultiple($irl.node, $ir.node); }
  1902. | { $node = new NullNode(); } // For the empty case
  1903. ;
  1904.  
  1905. implicitRange returns [ImplicitRangeNode node]
  1906. : NAME MINUS NAME { $node = new ImplicitRange($NAME.text, $NAME.text); }
  1907. ;
  1908. expression returns [ExpressionNode node]
  1909. : le5 = level5Expr { $node = new ExpressionSingle($le5.node); }
  1910. | expr = expression dbo = definedBinaryOp le5 = level5Expr { $node = new ExpressionBinary($expr.node, $dbo.node, $le5.node); }
  1911. ;
  1912.  
  1913. definedBinaryOp returns [DefinedBinaryOpNode node]
  1914. : DOP { $node = new DefinedBinaryOp($DOP.text); }
  1915. ;
  1916.  
  1917. level5Expr returns [Level5ExprNode node]
  1918. : eo = equivOperand { $node = new Level5ExprSingle($eo.node); }
  1919. | le5e = level5ExprExtended { $node = new Level5ExprExtended($le5e.node); }
  1920. ;
  1921.  
  1922. level5ExprExtended returns [Level5ExprExtendedNode node]
  1923. : eo = equivOperand neqv = NEQV eo2 = equivOperand le5eo = level5ExprExtendedOptional { $node = new Level5ExprExtendedNEQV($eo.node, $eo2.node, $le5eo.node); }
  1924. | eo = equivOperand eqv = EQV eo2 = equivOperand le5eo = level5ExprExtendedOptional { $node = new Level5ExprExtendedEQV($eo.node, $eo2.node, $le5eo.node); }
  1925. ;
  1926.  
  1927. level5ExprExtendedOptional returns [Level5ExprExtendedOptionalNode node]
  1928. : // Define rules for NEQV and EQV with level5ExprExtendedOptional
  1929. | { $node = new NullNode(); } // For the empty case
  1930. ;
  1931.  
  1932. equivOperand returns [EquivOperandNode node]
  1933. : soo = singleOrOperand { $node = new EquivOperandSingleOr($soo.node); }
  1934. | moo = multipleOrOperands { $node = new EquivOperandMultipleOr($moo.node); }
  1935. ;
  1936.  
  1937. singleOrOperand returns [SingleOrOperandNode node]
  1938. : oo = orOperand { $node = new SingleOrOperand($oo.node); }
  1939. ;
  1940.  
  1941. multipleOrOperands returns [MultipleOrOperandsNode node]
  1942. : oo = orOperand LOR ool = orOperandList { $node = new MultipleOrOperands($oo.node, $ool.node); }
  1943. ;
  1944.  
  1945. orOperandList returns [OrOperandListNode node]
  1946. : oo = orOperand { $node = new OrOperandListSingle($oo.node); }
  1947. | ool = orOperandList LOR oo = orOperand { $node = new OrOperandListMultiple($ool.node, $oo.node); }
  1948. | { $node = new NullNode(); } // For the empty case
  1949. ;
  1950.  
  1951. orOperand returns [OrOperandNode node]
  1952. : sao = singleAndOperand { $node = new OrOperandSingleAnd($sao.node); }
  1953. | mao = multipleAndOperands { $node = new OrOperandMultipleAnd($mao.node); }
  1954. ;
  1955.  
  1956. singleAndOperand returns [SingleAndOperandNode node]
  1957. : ao = andOperand { $node = new SingleAndOperand($ao.node); }
  1958. ;
  1959.  
  1960. multipleAndOperands returns [MultipleAndOperandsNode node]
  1961. : ao = andOperand LAND aol = andOperandList { $node = new MultipleAndOperands($ao.node, $aol.node); }
  1962. ;
  1963.  
  1964. andOperandList returns [AndOperandListNode node]
  1965. : ao = andOperand { $node = new AndOperandListSingle($ao.node); }
  1966. | aol = andOperandList LAND ao = andOperand { $node = new AndOperandListMultiple($aol.node, $ao.node); }
  1967. | { $node = new NullNode(); } // For the empty case
  1968. ;
  1969.  
  1970. andOperand returns [AndOperandNode node]
  1971. : le4 = level4Expr { $node = new AndOperandLevel4Expr($le4.node); }
  1972. | nle4 = notLevel4Expr { $node = new AndOperandNotLevel4Expr($nle4.node); }
  1973. ;
  1974.  
  1975. notLevel4Expr returns [NotLevel4ExprNode node]
  1976. : LNOT le4 = level4Expr { $node = new NotLevel4Expr($le4.node); }
  1977. ;
  1978. relOp returns [RelOpNode node]
  1979. : LT { $node = new RelOpLT(); }
  1980. | LE { $node = new RelOpLE(); }
  1981. | EQ { $node = new RelOpEQ(); }
  1982. | NE { $node = new RelOpNE(); }
  1983. | GT { $node = new RelOpGT(); }
  1984. | GE { $node = new RelOpGE(); }
  1985. | OP { $node = new RelOpOP($OP.text); }
  1986. ;
  1987.  
  1988. level4Expr returns [Level4ExprNode node]
  1989. : le3 = level3Expr (ro = relOp le3_2 = level3Expr)* { $node = new Level4Expr($le3.node, $ro.node, $le3_2.node); }
  1990. ;
  1991.  
  1992. level3Expr returns [Level3ExprNode node]
  1993. : le2 = level2Expr (DIV SPOFF? DIV SPON? le2_2 = level2Expr)* { $node = new Level3Expr($le2.node, $le2_2.node); }
  1994. ;
  1995.  
  1996. level2Expr returns [Level2ExprNode node]
  1997. : s = sign? ao = addOperand ((PLUS | MINUS) ao2 = addOperand)* { $node = new Level2Expr($s.node, $ao.node, $ao2.node); }
  1998. ;
  1999.  
  2000. addOperandList returns [AddOperandListNode node]
  2001. : pmao = plusOrMinusAddOperand { $node = new AddOperandListSingle($pmao.node); }
  2002. | aol = addOperandList pmao = plusOrMinusAddOperand { $node = new AddOperandListMultiple($aol.node, $pmao.node); }
  2003. ;
  2004.  
  2005. plusOrMinusAddOperand returns [PlusOrMinusAddOperandNode node]
  2006. : PLUS ao = addOperand { $node = new PlusAddOperand($ao.node); }
  2007. | MINUS ao = addOperand { $node = new MinusAddOperand($ao.node); }
  2008. ;
  2009.  
  2010. sign returns [SignNode node]
  2011. : PLUS { $node = new SignPlus(); }
  2012. | MINUS { $node = new SignMinus(); }
  2013. ;
  2014.  
  2015. addOperand returns [AddOperandNode node]
  2016. : smo = singleMultOperand { $node = new AddOperandSingleMult($smo.node); }
  2017. | mmo = multipleMultOperands { $node = new AddOperandMultipleMult($mmo.node); }
  2018. ;
  2019.  
  2020. singleMultOperand returns [SingleMultOperandNode node]
  2021. : mo = multOperand { $node = new SingleMultOperand($mo.node); }
  2022. ;
  2023.  
  2024. multipleMultOperands returns [MultipleMultOperandsNode node]
  2025. : mo = multOperand sdoml = starOrDivMultOperandList { $node = new MultipleMultOperands($mo.node, $sdoml.node); }
  2026. ;
  2027.  
  2028. starOrDivMultOperandList returns [StarOrDivMultOperandListNode node]
  2029. : STAR mo = multOperand { $node = new StarMultOperandListSingle($mo.node); }
  2030. | DIV mo = multOperand { $node = new DivMultOperandListSingle($mo.node); }
  2031. | sdoml = starOrDivMultOperandList STAR mo = multOperand { $node = new StarMultOperandListMultiple($sdoml.node, $mo.node); }
  2032. | sdoml = starOrDivMultOperandList DIV mo = multOperand { $node = new DivMultOperandListMultiple($sdoml.node, $mo.node); }
  2033. ;
  2034.  
  2035. multOperand returns [MultOperandNode node]
  2036. : sle1 = singleLevel1Expr { $node = new MultOperandSingleLevel1($sle1.node); }
  2037. | mle1 = multipleLevel1Exprs { $node = new MultOperandMultipleLevel1($mle1.node); }
  2038. ;
  2039.  
  2040. singleLevel1Expr returns [SingleLevel1ExprNode node]
  2041. : le1 = level1Expr { $node = new SingleLevel1Expr($le1.node); }
  2042. ;
  2043.  
  2044. multipleLevel1Exprs returns [MultipleLevel1ExprsNode node]
  2045. : le1 = level1Expr ple1l = powerLevel1ExprList { $node = new MultipleLevel1Exprs($le1.node, $ple1l.node); }
  2046. ;
  2047.  
  2048. powerLevel1ExprList returns [PowerLevel1ExprListNode node]
  2049. : POWER le1 = level1Expr { $node = new PowerLevel1ExprListSingle($le1.node); }
  2050. | ple1l = powerLevel1ExprList POWER le1 = level1Expr { $node = new PowerLevel1ExprListMultiple($ple1l.node, $le1.node); }
  2051. ;
  2052.  
  2053. level1Expr returns [Level1ExprNode node]
  2054. : p = primary { $node = new Level1ExprPrimary($p.node); }
  2055. | duo = definedUnaryOp p = primary { $node = new Level1ExprDefinedUnaryOp($duo.node, $p.node); }
  2056. ;
  2057.  
  2058. definedUnaryOp returns [DefinedUnaryOpNode node]
  2059. : DOP { $node = new DefinedUnaryOp($DOP.text); }
  2060. ;
  2061.  
  2062. primary returns [PrimaryNode node]
  2063. : uac = unsignedArithmeticConstant { $node = new PrimaryUnsignedArithmeticConstant($uac.node); }
  2064. | ndr = nameDataRef { $node = new PrimaryNameDataRef($ndr.node); }
  2065. | fr = functionReference { $node = new PrimaryFunctionReference($fr.node); }
  2066. | LPAREN expr = expression RPAREN { $node = new PrimaryExpression($expr.node); }
  2067. | SCON { $node = new PrimaryString($SCON.text); }
  2068. | lc = logicalConstant { $node = new PrimaryLogicalConstant($lc.node); }
  2069. | ac = arrayConstructor { $node = new PrimaryArrayConstructor($ac.node); }
  2070. ;
  2071. arrayConstructor returns [ArrayConstructorNode node]
  2072. : OBRACKETSLASH acvl = acValueList CBRACKETSLASH { $node = new ArrayConstructor($acvl.node); }
  2073. ;
  2074.  
  2075. acValueList returns [ACValueListNode node]
  2076. : expr = expression { $node = new ACValueListSingle($expr.node); }
  2077. | acvl1 = acValueList1 { $node = new ACValueListMultiple($acvl1.node); }
  2078. ;
  2079.  
  2080. acValueList1 returns [ACValueList1Node node]
  2081. : expr1 = expression COMMA expr2 = expression { $node = new ACValueList1TwoExpressions($expr1.node, $expr2.node); }
  2082. // Add other variations of acValueList1
  2083. ;
  2084.  
  2085. functionReference returns [FunctionReferenceNode node]
  2086. : NAME LPAREN RPAREN { $node = new FunctionReferenceNoArgs($NAME.text); }
  2087. | NAME LPAREN fal = functionArgList RPAREN { $node = new FunctionReferenceWithArgs($NAME.text, $fal.node); }
  2088. ;
  2089.  
  2090. functionArgList returns [FunctionArgListNode node]
  2091. : fa = functionArg { $node = new FunctionArgListSingle($fa.node); }
  2092. | fal = functionArgList COMMA fa = functionArg { $node = new FunctionArgListMultiple($fal.node, $fa.node); }
  2093. // Add other variations of functionArgList
  2094. ;
  2095.  
  2096. functionArg returns [FunctionArgNode node]
  2097. : NAME ASSIGN expr = expression { $node = new FunctionArg($NAME.text, $expr.node); }
  2098. ;
  2099.  
  2100. nameDataRef returns [NameDataRefNode node]
  2101. : ndrs = nameDataRefSingle { $node = new NameDataRefSingle($ndrs.node); }
  2102. | ndrm = nameDataRefMultiple { $node = new NameDataRefMultiple($ndrm.node); }
  2103. ;
  2104.  
  2105. nameDataRefSingle returns [NameDataRefSingleNode node]
  2106. : NAME { $node = new NameDataRefSingleName($NAME.text); }
  2107. | REAL { $node = new NameDataRefSingleReal(); }
  2108. | SIZE { $node = new NameDataRefSingleSize(); }
  2109. ;
  2110.  
  2111. nameDataRefMultiple returns [NameDataRefMultipleNode node]
  2112. : NAME cdrtl = complexDataRefTailList { $node = new NameDataRefMultipleName($NAME.text, $cdrtl.node); }
  2113. | REAL cdrtl = complexDataRefTailList { $node = new NameDataRefMultipleReal($cdrtl.node); }
  2114. | SIZE cdrtl = complexDataRefTailList { $node = new NameDataRefMultipleSize($cdrtl.node); }
  2115. ;
  2116.  
  2117. complexDataRefTail returns [ComplexDataRefTailNode node]
  2118. : ssr = sectionSubscriptRef { $node = new ComplexDataRefTailSectionSubscript($ssr.node); }
  2119. | PCT NAME { $node = new ComplexDataRefTailPercentName($NAME.text); }
  2120. ;
  2121. sectionSubscriptRef returns [SectionSubscriptRefNode node]
  2122. : LPAREN ssl = sectionSubscriptList RPAREN { $node = new SectionSubscriptRef($ssl.node); }
  2123. ;
  2124. complexDataRefTailList returns [ComplexDataRefTailListNode node]
  2125. : cdrt = complexDataRefTail { $node = new ComplexDataRefTailListSingle($cdrt.node); }
  2126. | cdrtl = complexDataRefTailList cdrt = complexDataRefTail { $node = new ComplexDataRefTailListMultiple($cdrtl.node, $cdrt.node); }
  2127. ;
  2128. // Continuation of the ANTLR4 grammar
  2129.  
  2130. acImpliedDo returns [ACImpliedDoNode node]
  2131. : LPAREN expr = expression COMMA iv = impliedDoVariable ASSIGN e1 = expression COMMA e2 = expression RPAREN { $node = new ACImpliedDoSimple($expr.node, $iv.node, $e1.node, $e2.node); }
  2132. | LPAREN expr = expression COMMA iv = impliedDoVariable ASSIGN e1 = expression COMMA e2 = expression COMMA e3 = expression RPAREN { $node = new ACImpliedDoExtended($expr.node, $iv.node, $e1.node, $e2.node, $e3.node); }
  2133. | LPAREN acido = acImpliedDo COMMA iv = impliedDoVariable ASSIGN e1 = expression COMMA e2 = expression RPAREN { $node = new ACImpliedDoNestedSimple($acido.node, $iv.node, $e1.node, $e2.node); }
  2134. | LPAREN acido = acImpliedDo COMMA iv = impliedDoVariable ASSIGN e1 = expression COMMA e2 = expression COMMA e3 = expression RPAREN { $node = new ACImpliedDoNestedExtended($acido.node, $iv.node, $e1.node, $e2.node, $e3.node); }
  2135. ;
  2136.  
  2137.  
  2138. logicalConstant returns [LogicalConstantNode node]
  2139. : (TRUE | FALSE) { $node = new LogicalConstant($TRUE != null ? "TRUE" : "FALSE"); }
  2140. | TRUE UNDERSCORE kp = kindParam { $node = new LogicalConstantTrueKindParam($kp.node); }
  2141. | FALSE UNDERSCORE kp = kindParam { $node = new LogicalConstantFalseKindParam($kp.node); }
  2142. ;
  2143.  
  2144. kindParam returns [KindParamNode node]
  2145. : ICON { $node = new KindParamIcon($ICON.text); }
  2146. | ncu = namedConstantUse { $node = new KindParamNamedConstantUse($ncu.node); }
  2147. ;
  2148.  
  2149. unsignedArithmeticConstant returns [UnsignedArithmeticConstantNode node]
  2150. : (ICON | RDCON) { $node = new UnsignedArithmeticConstant($ICON != null ? $ICON.text : $RDCON.text); }
  2151. | cc = complexConst { $node = new UnsignedArithmeticConstantComplexConst($cc.node); }
  2152. | ICON UNDERSCORE kp = kindParam { $node = new UnsignedArithmeticConstantIconKindParam($ICON.text, $kp.node); }
  2153. | RDCON UNDERSCORE kp = kindParam { $node = new UnsignedArithmeticConstantRdconKindParam($RDCON.text, $kp.node); }
  2154. ;
  2155.  
  2156. complexConst returns [ComplexConstNode node]
  2157. : LPAREN cc = complexComponent COMMA RPAREN { $node = new ComplexConst($cc.node); }
  2158. ;
  2159.  
  2160. complexComponent returns [ComplexComponentNode node]
  2161. : si = signIcon { $node = new ComplexComponentSignIcon($si.node); }
  2162. | ICON { $node = new ComplexComponentIcon($ICON.text); }
  2163. | RDCON { $node = new ComplexComponentRdcon($RDCON.text); }
  2164. | NAME { $node = new ComplexComponentName($NAME.text); }
  2165. ;
  2166.  
  2167. signIcon returns [SignIconNode node]
  2168. : PLUS ICON { $node = new SignIconPlus($ICON.text); }
  2169. | MINUS ICON { $node = new SignIconMinus($ICON.text); }
  2170. ;
  2171.  
  2172. ifStmt returns [IfStmtNode node]
  2173. : IF LPAREN expr = expression RPAREN as = actionStmt { $node = new IfStmt($expr.node, $as.node); }
  2174. ;
  2175.  
  2176.  
  2177. RECURSIVE
  2178. : 'RECURSIVE' | 'recursive' |'Recursive' ;
  2179.  
  2180.  
  2181. CONTAINS
  2182. :
  2183. ('contains'|'CONTAINS' |'Contains')
  2184. ;
  2185.  
  2186. MODULE
  2187. : 'MODULE' | 'module' |'Module'
  2188. ;
  2189.  
  2190. ENDMODULE
  2191. : 'ENDMODULE' | 'endmodule' |'Endmodule'
  2192. ;
  2193.  
  2194. PROGRAM
  2195. : 'program' | 'PROGRAM' |'Program'
  2196. ;
  2197.  
  2198. ENTRY
  2199. : 'entry' | 'ENTRY' |'Entry'
  2200. ;
  2201.  
  2202. FUNCTION
  2203. : 'function' | 'FUNCTION' | 'Function'
  2204. ;
  2205.  
  2206.  
  2207. BLOCK
  2208. : 'block' | 'BLOCK' | 'Block'
  2209. ;
  2210.  
  2211. SUBROUTINE
  2212. : 'subroutine' | 'SUBROUTINE' | 'Subroutine'
  2213. ;
  2214.  
  2215. ENDINTERFACE
  2216. : 'ENDINTERFACE' | ' endinterface' |'Endinterface'
  2217. ;
  2218.  
  2219. PROCEDURE
  2220. : 'procedure' | 'PROCEDURE' | 'Procedure'
  2221. ;
  2222.  
  2223. END
  2224. : 'END' | 'end'| 'End'
  2225. ;
  2226.  
  2227. DIMENSION
  2228. : 'dimension' | 'DIMENSION' | 'Dimension'
  2229. ;
  2230.  
  2231. TARGET : 'TARGET' | 'target' |'Target' ;
  2232.  
  2233. ALLOCATABLE : 'ALLOCATABLE' | 'allocatable' |'Allocatable' ;
  2234.  
  2235. OPTIONAL : 'OPTIONAL' | 'optional' |'Optional' ;
  2236.  
  2237. NAMELIST : 'NAMELIST' | 'namelist' ;
  2238.  
  2239. INTENT : 'INTENT' | 'intent' |'Intent' ;
  2240.  
  2241. IN : 'IN' | 'in' |'In' ;
  2242.  
  2243. OUT : 'OUT' | 'out' |'Out' ;
  2244.  
  2245. INOUT : 'INOUT' | 'inout' | 'Inout' ;
  2246.  
  2247. OPERATOR : 'operator' | 'OPERATOR' | 'Operator';
  2248.  
  2249. USE : 'USE' | 'use' |'Use' ;
  2250.  
  2251. ONLY : 'ONLY' | 'only' |'Only' ;
  2252.  
  2253. IMPLIEDT : '=>' ;
  2254.  
  2255. ASSIGNMENT : 'ASSIGNMENT' | 'assignment' |'Assignment' ;
  2256.  
  2257.  
  2258.  
  2259. DOP : '.''\\a'+'.';
  2260.  
  2261. OP
  2262. :'=='
  2263. | '!='
  2264. | '<='
  2265. |'>='
  2266. |'<'
  2267. |'>'
  2268. |'/='
  2269. ;
  2270.  
  2271. DOUBLEPRECISION : 'DOUBLEPRECISION' | 'doubleprecision' | 'double precision' | 'DOUBLE PRECISION';
  2272.  
  2273. DOUBLECOLON : '::' ;
  2274.  
  2275. ASSIGNSTMT : 'assign' | 'ASSIGN' |'Assign';
  2276.  
  2277. COMMON : 'COMMON' | 'common' |'Common';
  2278.  
  2279. ELSEWHERE : 'ELSEWHERE' | 'elsewhere' |'Elsewhere' ;
  2280.  
  2281. REAL
  2282. : 'REAL' | 'real' |'Real'
  2283. ;
  2284.  
  2285.  
  2286.  
  2287. EQUIVALENCE
  2288. : 'EQUIVALENCE' | 'equivalence' |'Equivalence'
  2289. ;
  2290.  
  2291.  
  2292. BLOCKDATA
  2293. : 'blockdata' | 'BLOCKDATA' |'Blockdata'
  2294. ;
  2295.  
  2296.  
  2297. POINTER
  2298. : 'pointer' | 'POINTER' |'Pointer'
  2299. ;
  2300.  
  2301. fragment PRIVATES
  2302. : 'private' | 'PRIVATE' |'Private'
  2303. ;
  2304.  
  2305. PRIVATE : PRIVATES ;
  2306.  
  2307. SEQUENCE
  2308. : 'sequence' | 'SEQUENCE' |'Sequence'
  2309. ;
  2310.  
  2311. fragment PUBLIC
  2312. : 'public' | 'PUBLIC' | 'Public'
  2313. ;
  2314.  
  2315. ACCESSSPEC
  2316. : PRIVATE | PUBLIC
  2317. ;
  2318.  
  2319. IMPLICIT
  2320. : 'implicit' | 'IMPLICIT' | 'Implicit'
  2321. ;
  2322.  
  2323. NONE
  2324. : 'none' | 'NONE' | 'None'
  2325. ;
  2326.  
  2327. CHARACTER
  2328. : 'character' | 'CHARACTER' | 'Character'
  2329. ;
  2330.  
  2331.  
  2332. PARAMETER
  2333. : 'parameter' | 'PARAMETER' | 'Parameter'
  2334. ;
  2335.  
  2336.  
  2337. EXTERNAL
  2338. : 'external' | 'EXTERNAL' | 'External'
  2339. ;
  2340.  
  2341.  
  2342. INTRINSIC
  2343. : 'intrinsic' | 'INTRINSIC' |'Intrinsic'
  2344. ;
  2345.  
  2346.  
  2347. SAVE
  2348. : 'save' | 'SAVE' |'Save'
  2349. ;
  2350.  
  2351.  
  2352. DATA
  2353. : 'data' | 'DATA' | 'Data'
  2354. ;
  2355.  
  2356.  
  2357. GO
  2358. : 'GO' | 'go' | 'Go'
  2359. ;
  2360.  
  2361.  
  2362. GOTO
  2363. : 'GOTO' | 'goto' | 'Goto'
  2364. ;
  2365.  
  2366.  
  2367. IF
  2368. : 'IF' | 'if' | 'If'
  2369. ;
  2370.  
  2371.  
  2372. THEN
  2373. : 'THEN' | 'then'
  2374. ;
  2375.  
  2376.  
  2377. ELSE
  2378. : 'ELSE' | 'else'
  2379. ;
  2380.  
  2381.  
  2382. ENDIF
  2383. : 'ENDIF' | 'endif'
  2384. ;
  2385.  
  2386. RESULT
  2387. : 'RESULT' | 'result'
  2388. ;
  2389.  
  2390.  
  2391. ELSEIF
  2392. : 'ELSEIF' | 'elseif' | 'Elseif'
  2393. ;
  2394.  
  2395.  
  2396. DO
  2397. : 'DO' | 'do' |'Do'
  2398. ;
  2399.  
  2400. INCLUDE : 'INCLUDE' | 'include' |'Include' ;
  2401.  
  2402. CONTINUE
  2403. : 'CONTINUE' | 'continue' |'Continue'
  2404. ;
  2405.  
  2406. ENDWHERE : 'ENDWHERE' | 'endwhere' | 'Endwhere';
  2407.  
  2408. WHERE : 'WHERE' | 'where' |'Where' ;
  2409.  
  2410. ENDSELECT : 'ENDSELECT' | 'endselect' ;
  2411.  
  2412. SELECTCASE : 'SELECTCASE' | 'selectcase';
  2413.  
  2414. SELECT: 'SELECT' | 'select' ;
  2415.  
  2416. CASE : 'case' | 'CASE' |'Case' ;
  2417.  
  2418. DEFAULT : 'DEFAULT' | 'default' | 'Default';
  2419.  
  2420. DIRECT : 'DIRECT' | 'direct' |'Direct' ;
  2421.  
  2422. STOP
  2423. : 'STOP' | 'stop' | 'Stop'
  2424. ;
  2425.  
  2426. REC : 'REC' | 'rec' |'Rec'
  2427. ;
  2428.  
  2429. ENDDO
  2430. : 'ENDDO' | 'enddo'
  2431. ;
  2432.  
  2433.  
  2434. PAUSE
  2435. : 'pause' | 'PAUSE'
  2436. ;
  2437.  
  2438.  
  2439. WRITE
  2440. : 'WRITE' | 'write'
  2441. ;
  2442.  
  2443.  
  2444. READ
  2445. : 'READ' | 'read'
  2446. ;
  2447.  
  2448. SEMICOLON : ';';
  2449.  
  2450. PRINT
  2451. : 'PRINT' | 'print'
  2452. ;
  2453.  
  2454.  
  2455. OPEN
  2456. : 'OPEN' | 'open'
  2457. ;
  2458.  
  2459.  
  2460. FMT
  2461. : 'FMT' | 'fmt'
  2462. ;
  2463.  
  2464.  
  2465. UNIT
  2466. : 'UNIT' | 'unit'
  2467. ;
  2468.  
  2469. PAD : 'PAD' | 'pad' ;
  2470.  
  2471. ACTION : 'ACTION' | 'action' ;
  2472.  
  2473. DELIM : 'DELIM' | 'delim' ;
  2474.  
  2475. IOLENGTH : 'IOLENGTH' | 'iolength' ;
  2476.  
  2477. READWRITE : 'READWRITE' | 'readwrite' ;
  2478.  
  2479. ERR
  2480. : 'err' | 'ERR'
  2481. ;
  2482.  
  2483. SIZE : 'SIZE' | 'size' ;
  2484.  
  2485. ADVANCE : 'ADVANCE' | 'advance' ;
  2486.  
  2487. NML : 'NML' | 'nml' ;
  2488.  
  2489.  
  2490. IOSTAT
  2491. : 'IOSTAT' | 'iostat'
  2492. ;
  2493.  
  2494.  
  2495. FORMAT
  2496. : 'FORMAT' | 'format'
  2497. ;
  2498.  
  2499.  
  2500. LET
  2501. : 'LET' | 'let'
  2502. ;
  2503.  
  2504.  
  2505. CALL
  2506. : 'CALL' | 'call'
  2507. ;
  2508.  
  2509.  
  2510. RETURN
  2511. : 'RETURN' | 'return' | 'Return'
  2512. ;
  2513.  
  2514.  
  2515. CLOSE
  2516. : 'CLOSE' | 'close'
  2517. ;
  2518.  
  2519.  
  2520. DOUBLE
  2521. : 'DOUBLE' | 'double'
  2522. ;
  2523.  
  2524.  
  2525. IOSTART
  2526. : 'IOSTART' | 'iostart'
  2527. ;
  2528.  
  2529.  
  2530. SEQUENTIAL
  2531. : 'SEQUENTIAL' | 'sequential'
  2532. ;
  2533.  
  2534.  
  2535. LABEL
  2536. : 'LABEL' | 'label'
  2537. ;
  2538.  
  2539.  
  2540. FILE
  2541. : 'file' | 'FILE'
  2542. ;
  2543.  
  2544.  
  2545. STATUS
  2546. : 'STATUS' | 'status'
  2547. ;
  2548.  
  2549.  
  2550. ACCESS
  2551. : 'ACCESS' | 'access'
  2552. ;
  2553.  
  2554.  
  2555. POSITION
  2556. : 'POSITION' | 'position'
  2557. ;
  2558.  
  2559.  
  2560. FORM
  2561. : 'FORM' | 'form'
  2562. ;
  2563.  
  2564.  
  2565. RECL
  2566. : 'RECL' | 'recl'
  2567. ;
  2568.  
  2569.  
  2570. EXIST
  2571. : 'EXIST' | 'exist'
  2572. ;
  2573.  
  2574.  
  2575. OPENED
  2576. : 'OPENED' | 'opened'
  2577. ;
  2578.  
  2579.  
  2580. NUMBER
  2581. : 'NUMBER' | 'number'
  2582. ;
  2583.  
  2584.  
  2585. NAMED
  2586. : 'NAMED' | 'named'
  2587. ;
  2588.  
  2589.  
  2590. NAME_
  2591. : 'NAME' | 'name'
  2592. ;
  2593.  
  2594.  
  2595. FORMATTED
  2596. : 'FORMATTED' | 'formatted'
  2597. ;
  2598.  
  2599.  
  2600. UNFORMATTED
  2601. : 'UNFORMATTED' | 'unformatted'
  2602. ;
  2603.  
  2604.  
  2605. NEXTREC
  2606. : 'NEXTREC' | 'nextrec'
  2607. ;
  2608.  
  2609.  
  2610. INQUIRE
  2611. : 'INQUIRE' | 'inquire'
  2612. ;
  2613.  
  2614.  
  2615. BACKSPACE
  2616. : 'BACKSPACE' | 'backspace'
  2617. ;
  2618.  
  2619.  
  2620. ENDFILE
  2621. : 'ENDFILE' | 'endfile'
  2622. ;
  2623.  
  2624.  
  2625. REWIND
  2626. : 'REWIND' | 'rewind'
  2627. ;
  2628.  
  2629. ENDBLOCKDATA : 'endblockdata' | 'ENDBLOCKDATA' ;
  2630.  
  2631. ENDBLOCK : 'ENDBLOCK' | 'endblock' ;
  2632.  
  2633.  
  2634.  
  2635.  
  2636. fragment NEWLINE
  2637. : '\r\n' | '\r' | '\n'
  2638. | '\u0085' // <Next Line CHARACTER (U+0085)>'
  2639. | '\u2028' //'<Line Separator CHARACTER (U+2028)>'
  2640. | '\u2029' //'<Paragraph Separator CHARACTER (U+2029)>'
  2641. ;
  2642.  
  2643.  
  2644. KIND : 'KIND' | 'kind' ;
  2645.  
  2646. LEN : 'LEN' | 'len' ;
  2647.  
  2648. //EOS : COMMENTORNEWLINE+ ;
  2649. //EOS : (COMMENTORNEWLINE? SPACES* [\r\n] [ \t]* )+;
  2650.  
  2651. //RN : NEWLINE -> channel(HIDDEN) ;
  2652.  
  2653. WS
  2654. : ([ \t] | NEWLINE)+ -> channel(HIDDEN)
  2655. ;
  2656.  
  2657. COMMENT
  2658. : '!' ~[\r\n]* -> channel(HIDDEN);
  2659.  
  2660.  
  2661. /*
  2662. COMMENTORNEWLINE
  2663. : COMMENT
  2664. |
  2665. NEWLINE
  2666.  
  2667. ;
  2668. */
  2669.  
  2670.  
  2671.  
  2672. DOLLAR
  2673. : '$'
  2674. ;
  2675.  
  2676.  
  2677. COMMA
  2678. : ','
  2679. ;
  2680.  
  2681.  
  2682. LPAREN
  2683. : '('
  2684. ;
  2685.  
  2686. PCT : '%';
  2687.  
  2688. WHILE : 'while' | 'WHILE';
  2689.  
  2690. ALLOCATE : 'ALLOCATE' | 'allocate' ;
  2691.  
  2692. STAT : 'STAT' | 'stat';
  2693.  
  2694. RPAREN
  2695. : ')'
  2696. ;
  2697.  
  2698.  
  2699. COLON
  2700. : ':'
  2701. ;
  2702.  
  2703.  
  2704. ASSIGN
  2705. : '='
  2706. ;
  2707.  
  2708.  
  2709. MINUS
  2710. : '-'
  2711. ;
  2712.  
  2713.  
  2714. PLUS
  2715. : '+'
  2716. ;
  2717.  
  2718.  
  2719. DIV
  2720. : '/'
  2721. ;
  2722.  
  2723. fragment STARCHAR
  2724. : '*'
  2725. ;
  2726.  
  2727. FORMATSEP
  2728. : '/' | ':'
  2729. ;
  2730.  
  2731.  
  2732. POWER
  2733. : '**'
  2734. ;
  2735.  
  2736.  
  2737. LNOT
  2738. : '.not.' | '.NOT.'
  2739. ;
  2740.  
  2741.  
  2742. LAND
  2743. : '.and.' | '.AND.'
  2744. ;
  2745.  
  2746.  
  2747. LOR
  2748. : '.or.' | '.OR.'
  2749. ;
  2750.  
  2751.  
  2752. EQV
  2753. : '.eqv.' | '.EQV.'
  2754. ;
  2755.  
  2756.  
  2757. NEQV
  2758. : '.neqv.' | '.NEQV.'
  2759. ;
  2760.  
  2761.  
  2762. XOR
  2763. : '.xor.' | '.XOR.'
  2764. ;
  2765.  
  2766.  
  2767. EOR
  2768. : '.eor.' | '.EOR.'
  2769. ;
  2770.  
  2771.  
  2772. LT
  2773. : '.lt.' | '.LT.'
  2774. ;
  2775.  
  2776.  
  2777. LE
  2778. : '.le.' | '.LE.'
  2779. ;
  2780.  
  2781.  
  2782. GT
  2783. : '.gt.' | '.GT.'
  2784. ;
  2785.  
  2786.  
  2787. GE
  2788. : '.ge.' | '.GE.'
  2789. ;
  2790.  
  2791.  
  2792. NE
  2793. : '.ne.' | '.NE.'
  2794. ;
  2795.  
  2796.  
  2797. EQ
  2798. : '.eq.' | '.EQ.'
  2799. ;
  2800.  
  2801.  
  2802. TRUE
  2803. : '.true.' | '.TRUE.'
  2804. ;
  2805.  
  2806.  
  2807. FALSE
  2808. : '.false.' | '.FALSE.'
  2809. ;
  2810.  
  2811.  
  2812. XCON
  2813. : NUM+ [xX]
  2814. ;
  2815.  
  2816.  
  2817. PCON
  2818. : [+-]?NUM+[pP]
  2819. ;
  2820.  
  2821.  
  2822. FCON
  2823. : ('a'|'A'|'b'|'B'|'e'|'E'|'d'|'D'|(('e'|'E')('n'|'N'|'s'|'S'))|'q'|'Q'|'f'|'F'|'g'|'G'|'i'|'I'|'l'|'L'|'o'|'O'|'z'|'Z')(NUM+|'*')('.'NUM+(('e'|'E'|'d'|'D'|'q'|'Q')NUM+)?)
  2824. ;
  2825.  
  2826.  
  2827. CCON
  2828. : 'CCON'
  2829. ;
  2830.  
  2831.  
  2832. HOLLERITH
  2833. : 'HOLLERITH'
  2834. ;
  2835.  
  2836.  
  2837. CONCATOP
  2838. : 'CONCATOP'
  2839. ;
  2840.  
  2841.  
  2842. CTRLDIRECT
  2843. : 'CTRLDIRECT'
  2844. ;
  2845.  
  2846.  
  2847. CTRLREC
  2848. : 'CTRLREC'
  2849. ;
  2850.  
  2851.  
  2852. TO
  2853. : 'TO'
  2854. ;
  2855.  
  2856.  
  2857. SUBPROGRAMBLOCK
  2858. : 'SUBPROGRAMBLOCK'
  2859. ;
  2860.  
  2861.  
  2862. DOBLOCK
  2863. : 'DOBLOCK'
  2864. ;
  2865.  
  2866.  
  2867. AIF
  2868. : 'AIF'
  2869. ;
  2870.  
  2871.  
  2872. THENBLOCK
  2873. : 'THENBLOCK'
  2874. ;
  2875.  
  2876.  
  2877. ELSEBLOCK
  2878. : 'ELSEBLOCK'
  2879. ;
  2880.  
  2881.  
  2882. CODEROOT
  2883. : 'CODEROOT'
  2884. ;
  2885.  
  2886.  
  2887. COMPLEX
  2888. : 'COMPLEX' | 'complex'
  2889. ;
  2890.  
  2891.  
  2892. PRECISION
  2893. : 'PRECISION' | 'precision'
  2894. ;
  2895.  
  2896.  
  2897. INTEGER
  2898. : 'INTEGER' | 'integer' |'Integer'
  2899. ;
  2900.  
  2901.  
  2902. LOGICAL
  2903. : 'LOGICAL' | 'logical' | 'Logical'
  2904. ;
  2905.  
  2906. fragment SCORE : '_';
  2907.  
  2908. UNDERSCORE : SCORE ;
  2909.  
  2910. OBRACKETSLASH : '(/';
  2911.  
  2912. DOT : '.' ;
  2913.  
  2914. CBRACKETSLASH : '/)';
  2915.  
  2916. ZCON : [zZ]'\''[abcdefABCDEF0-9] + '\''
  2917. | [zZ] '"'[abcdefABCDEF0-9] +'"' ;
  2918.  
  2919. BCON : [bB]'\'' [01] + '\''
  2920. | [bB]'"'[01] + '"'
  2921. ;
  2922.  
  2923. OCON
  2924. : [oO]'"'[01234567] + '"'
  2925. | [oO]'\''[01234567] + '\''
  2926. ;
  2927.  
  2928. SCON
  2929. : '\'' ('\'' '\'' | ~ ('\'' | '\n' | '\r') | (('\n' | '\r' ('\n')?) ' ' CONTINUATION) ('\n' | '\r' ('\n')?) ' ' CONTINUATION)* '\''
  2930. |
  2931. '\'' (~('\'') | ('\'''\''))* ('\'' )
  2932. |
  2933. ('"') (~('"') | '""')* ('"')
  2934. ;
  2935.  
  2936. RDCON : NUM+ '.' NUM* EXPON?
  2937. | NUM* '.' NUM+ EXPON?
  2938. | NUM+ EXPON
  2939. ;
  2940.  
  2941. DEALLOCATE : 'DEALLOCATE' | 'deallocate' ;
  2942.  
  2943. NULLIFY : 'NULLIFY' | 'nullify' ;
  2944.  
  2945. CYCLE : 'CYCLE' | 'cycle' ;
  2946.  
  2947. ENDTYPE : 'ENDTYPE' | 'endtype' | 'Endtype' |'EndType';
  2948.  
  2949. INTERFACE : 'INTERFACE' | 'interface' | 'Interface' ;
  2950.  
  2951. SPOFF : 'SPOFF';
  2952.  
  2953. SPON : 'SPON';
  2954.  
  2955. ICON
  2956. : NUM+
  2957. ;
  2958.  
  2959. TYPE
  2960. : 'type' | 'TYPE' | 'Type'
  2961. ;
  2962.  
  2963. NAME
  2964. :LETTER ( ALPHANUMERIC_CHARACTER )*
  2965. ;
  2966.  
  2967. EXIT : 'EXIT' | 'exit' ;
  2968.  
  2969. BLANK
  2970. : 'BLANK' | 'blank'
  2971. ;
  2972.  
  2973.  
  2974. ALPHANUMERIC_CHARACTER : LETTER | NUM | SCORE ;
  2975.  
  2976. fragment LETTER : ('a'..'z' | 'A'..'Z') ;
  2977.  
  2978.  
  2979. STAR
  2980. : STARCHAR
  2981. ;
  2982.  
  2983.  
  2984.  
  2985. STRINGLITERAL
  2986. : '"' ~ ["\r\n]* '"'
  2987. ;
  2988.  
  2989.  
  2990. EOL
  2991. : [\r\n] +
  2992. ;
  2993.  
  2994. fragment SPACES
  2995. : [ \t] +
  2996. ;
  2997.  
  2998. LINECONT
  2999. : (('&' SPACES? COMMENT? NEWLINE (SPACES* [ \t] * '&' )?) | ( SPACES? COMMENT? NEWLINE SPACES* [ \t] * '&' )) -> channel(HIDDEN)
  3000. ;
  3001.  
  3002. fragment CONTINUATION
  3003. : ~ ('0' | ' ')
  3004. ;
  3005.  
  3006.  
  3007. fragment ALNUM
  3008. : (ALPHA | NUM)
  3009. ;
  3010.  
  3011.  
  3012. fragment HEX
  3013. : (NUM | 'a' .. 'f')
  3014. ;
  3015.  
  3016.  
  3017. fragment SIGN
  3018. : ('+' | '-')
  3019. ;
  3020.  
  3021.  
  3022. fragment FDESC
  3023. : ('i' | 'f' | 'd') (NUM) + '.' (NUM) + | ('e' | 'g') (NUM) + '.' (NUM) + ('e' (NUM) +)?
  3024. ;
  3025.  
  3026.  
  3027. fragment EXPON
  3028. : ('e' | 'E' | 'd' | 'D') (SIGN)? (NUM) +
  3029. ;
  3030.  
  3031.  
  3032. fragment ALPHA
  3033. : ('a' .. 'z') | ('A' .. 'Z')
  3034. ;
  3035.  
  3036.  
  3037. fragment NUM
  3038. : ('0' .. '9')
  3039. ;
  3040. IDENT : [a-zA-Z][a-zA-Z0-9_]*;
  3041.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement