//===-- lib/Parser/type-parsers.h -------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef FORTRAN_PARSER_TYPE_PARSERS_H_ #define FORTRAN_PARSER_TYPE_PARSERS_H_ #include "flang/Parser/instrumented-parser.h" #include "flang/Parser/parse-tree.h" #include namespace Fortran::parser { // Many parsers in the grammar are defined as instances of this Parser<> // class template, i.e. as the anonymous sole parser for a given type. // This usage requires that their Parse() member functions be defined // separately, typically with a parsing expression wrapped up in an // TYPE_PARSER() macro call. template struct Parser { using resultType = A; constexpr Parser() {} constexpr Parser(const Parser &) = default; static std::optional Parse(ParseState &); }; #define CONTEXT_PARSER(contextText, pexpr) \ instrumented((contextText), inContext((contextText), (pexpr))) // To allow use of the Fortran grammar (or parts of it) outside the // context of constructing the actual parser. #define TYPE_PARSER(pexpr) #define TYPE_CONTEXT_PARSER(context, pexpr) // Some specializations of Parser<> are used multiple times, or are // of some special importance, so we instantiate them once here and // give them names rather than referencing them as anonymous Parser{} // objects in the right-hand sides of productions. constexpr Parser program; // R501 - the "top level" production constexpr Parser specificationPart; // R504 constexpr Parser implicitPart; // R505 constexpr Parser declarationConstruct; // R507 constexpr Parser specificationConstruct; // R508 constexpr Parser executionPart; // R509 constexpr Parser executionPartConstruct; // R510 constexpr Parser internalSubprogramPart; // R511 constexpr Parser actionStmt; // R515 constexpr Parser name; // R603 constexpr Parser literalConstant; // R605 constexpr Parser namedConstant; // R606 constexpr Parser typeParamValue; // R701 constexpr Parser typeSpec; // R702 constexpr Parser declarationTypeSpec; // R703 constexpr Parser intrinsicTypeSpec; // R704 constexpr Parser integerTypeSpec; // R705 constexpr Parser kindSelector; // R706 constexpr Parser signedIntLiteralConstant; // R707 constexpr Parser intLiteralConstant; // R708 constexpr Parser kindParam; // R709 constexpr Parser realLiteralConstant; // R714 constexpr Parser charLength; // R723 constexpr Parser charLiteralConstant; // R724 constexpr Parser initialization; // R743 & R805 constexpr Parser derivedTypeSpec; // R754 constexpr Parser typeDeclarationStmt; // R801 constexpr Parser nullInit; // R806 constexpr Parser accessSpec; // R807 constexpr Parser languageBindingSpec; // R808, R1528 constexpr Parser entityDecl; // R803 constexpr Parser coarraySpec; // R809 constexpr Parser arraySpec; // R815 constexpr Parser explicitShapeSpec; // R816 constexpr Parser deferredShapeSpecList; // R820 constexpr Parser assumedImpliedSpec; // R821 constexpr Parser intentSpec; // R826 constexpr Parser dataStmt; // R837 constexpr Parser dataImpliedDo; // R840 constexpr Parser parameterStmt; // R851 constexpr Parser oldParameterStmt; constexpr Parser designator; // R901 constexpr Parser variable; // R902 constexpr Parser substring; // R908 constexpr Parser dataRef; // R911, R914, R917 constexpr Parser structureComponent; // R913 constexpr Parser allocateStmt; // R927 constexpr Parser statVariable; // R929 constexpr Parser statOrErrmsg; // R942 & R1165 constexpr Parser definedOpName; // R1003, R1023, R1414, & R1415 constexpr Parser expr; // R1022 constexpr Parser specificationExpr; // R1028 constexpr Parser assignmentStmt; // R1032 constexpr Parser pointerAssignmentStmt; // R1033 constexpr Parser whereStmt; // R1041, R1045, R1046 constexpr Parser whereConstruct; // R1042 constexpr Parser whereBodyConstruct; // R1044 constexpr Parser forallConstruct; // R1050 constexpr Parser forallAssignmentStmt; // R1053 constexpr Parser forallStmt; // R1055 constexpr Parser selector; // R1105 constexpr Parser endSelectStmt; // R1143 & R1151 & R1155 constexpr Parser loopControl; // R1123 constexpr Parser concurrentHeader; // R1125 constexpr Parser ioUnit; // R1201, R1203 constexpr Parser fileUnitNumber; // R1202 constexpr Parser ioControlSpec; // R1213, R1214 constexpr Parser format; // R1215 constexpr Parser inputItem; // R1216 constexpr Parser outputItem; // R1217 constexpr Parser inputImpliedDo; // R1218, R1219 constexpr Parser outputImpliedDo; // R1218, R1219 constexpr Parser positionOrFlushSpec; // R1227 & R1229 constexpr Parser formatStmt; // R1301 constexpr Parser interfaceBlock; // R1501 constexpr Parser genericSpec; // R1508 constexpr Parser procInterface; // R1513 constexpr Parser procDecl; // R1515 constexpr Parser functionReference; // R1520 constexpr Parser actualArgSpec; // R1523 constexpr Parser prefixSpec; // R1527 constexpr Parser functionSubprogram; // R1529 constexpr Parser functionStmt; // R1530 constexpr Parser suffix; // R1532 constexpr Parser endFunctionStmt; // R1533 constexpr Parser subroutineSubprogram; // R1534 constexpr Parser subroutineStmt; // R1535 constexpr Parser dummyArg; // R1536 constexpr Parser endSubroutineStmt; // R1537 constexpr Parser entryStmt; // R1541 constexpr Parser containsStmt; // R1543 constexpr Parser compilerDirective; constexpr Parser openaccConstruct; constexpr Parser accEndCombinedDirective; constexpr Parser openaccDeclarativeConstruct; constexpr Parser openmpConstruct; constexpr Parser openmpDeclarativeConstruct; constexpr Parser ompEndLoopDirective; } // namespace Fortran::parser #endif // FORTRAN_PARSER_TYPE_PARSERS_H_