[flang] Move Parser<> to its own header.
Original-commit: flang-compiler/f18@c43e8ba138 Reviewed-on: https://github.com/flang-compiler/f18/pull/66 Tree-same-pre-rewrite: false
This commit is contained in:
parent
c387b6d4e4
commit
48704ef940
|
@ -1048,27 +1048,11 @@ template<class T> struct construct {
|
|||
}
|
||||
};
|
||||
|
||||
// If f is a function of type bool (*f)(const ParseState &), then
|
||||
// StatePredicateGuardParser{f} is a parser that succeeds when f() is true
|
||||
// and fails otherwise. The state is preserved.
|
||||
class StatePredicateGuardParser {
|
||||
public:
|
||||
using resultType = Success;
|
||||
constexpr StatePredicateGuardParser(
|
||||
const StatePredicateGuardParser &) = default;
|
||||
constexpr explicit StatePredicateGuardParser(
|
||||
bool (*predicate)(const ParseState &))
|
||||
: predicate_{predicate} {}
|
||||
std::optional<Success> Parse(ParseState &state) const {
|
||||
if (predicate_(state)) {
|
||||
return {Success{}};
|
||||
}
|
||||
return {};
|
||||
}
|
||||
|
||||
private:
|
||||
bool (*const predicate_)(const ParseState &);
|
||||
};
|
||||
// For a parser p, indirect(p) returns a parser that builds an indirect
|
||||
// reference to p's return type.
|
||||
template<typename PA> inline constexpr auto indirect(const PA &p) {
|
||||
return construct<Indirection<typename PA::resultType>>{}(p);
|
||||
}
|
||||
|
||||
// If a and b are parsers, then nonemptySeparated(a, b) returns a parser
|
||||
// that succeeds if a does. If a succeeds, it then applies many(b >> a).
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
// Top-level grammar specification for Fortran. These parsers drive
|
||||
// the tokenization parsers in cooked-tokens.h to consume characters,
|
||||
// recognize the productions of Fortran, and to construct a parse tree.
|
||||
// See parser-combinators.txt for documentation on the parser combinator
|
||||
// See ParserCombinators.md for documentation on the parser combinator
|
||||
// library used here to implement an LL recursive descent recognizer.
|
||||
|
||||
#include "basic-parsers.h"
|
||||
|
@ -12,6 +12,7 @@
|
|||
#include "debug-parser.h"
|
||||
#include "parse-tree.h"
|
||||
#include "token-parsers.h"
|
||||
#include "type-parser.h"
|
||||
#include "user-state.h"
|
||||
#include <cinttypes>
|
||||
#include <cstdio>
|
||||
|
@ -31,130 +32,6 @@ namespace parser {
|
|||
// on the definitions of symbols. The "Rxxx" numbers that appear in
|
||||
// comments refer to these numbered requirements in the Fortran standard.
|
||||
|
||||
// Many parsers in this grammar are defined as instances of this Parser<>
|
||||
// template class. 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<typename A> struct Parser {
|
||||
using resultType = A;
|
||||
constexpr Parser() {}
|
||||
static inline std::optional<A> Parse(ParseState &);
|
||||
};
|
||||
|
||||
#define TYPE_PARSER(pexpr) \
|
||||
template<> \
|
||||
inline std::optional<typename decltype(pexpr)::resultType> \
|
||||
Parser<typename decltype(pexpr)::resultType>::Parse(ParseState &state) { \
|
||||
static constexpr auto parser = (pexpr); \
|
||||
return parser.Parse(state); \
|
||||
}
|
||||
|
||||
#define TYPE_CONTEXT_PARSER(contextText, pexpr) \
|
||||
TYPE_PARSER(instrumented((contextText), inContext((contextText), (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<T>{}
|
||||
// objects in the right-hand sides of productions.
|
||||
constexpr Parser<Program> program; // R501 - the "top level" production
|
||||
constexpr Parser<SpecificationPart> specificationPart; // R504
|
||||
constexpr Parser<ImplicitPart> implicitPart; // R505
|
||||
constexpr Parser<DeclarationConstruct> declarationConstruct; // R507
|
||||
constexpr Parser<SpecificationConstruct> specificationConstruct; // R508
|
||||
constexpr Parser<ExecutionPart> executionPart; // R509
|
||||
constexpr Parser<ExecutionPartConstruct> executionPartConstruct; // R510
|
||||
constexpr Parser<InternalSubprogramPart> internalSubprogramPart; // R511
|
||||
constexpr Parser<ActionStmt> actionStmt; // R515
|
||||
constexpr Parser<Name> name; // R603
|
||||
constexpr Parser<LiteralConstant> literalConstant; // R605
|
||||
constexpr Parser<NamedConstant> namedConstant; // R606
|
||||
constexpr Parser<TypeParamValue> typeParamValue; // R701
|
||||
constexpr Parser<TypeSpec> typeSpec; // R702
|
||||
constexpr Parser<DeclarationTypeSpec> declarationTypeSpec; // R703
|
||||
constexpr Parser<IntrinsicTypeSpec> intrinsicTypeSpec; // R704
|
||||
constexpr Parser<IntegerTypeSpec> integerTypeSpec; // R705
|
||||
constexpr Parser<KindSelector> kindSelector; // R706
|
||||
constexpr Parser<SignedIntLiteralConstant> signedIntLiteralConstant; // R707
|
||||
constexpr Parser<IntLiteralConstant> intLiteralConstant; // R708
|
||||
constexpr Parser<KindParam> kindParam; // R709
|
||||
constexpr Parser<RealLiteralConstant> realLiteralConstant; // R714
|
||||
constexpr Parser<CharLength> charLength; // R723
|
||||
constexpr Parser<CharLiteralConstant> charLiteralConstant; // R724
|
||||
constexpr Parser<Initialization> initialization; // R743 & R805
|
||||
constexpr Parser<DerivedTypeSpec> derivedTypeSpec; // R754
|
||||
constexpr Parser<TypeDeclarationStmt> typeDeclarationStmt; // R801
|
||||
constexpr Parser<NullInit> nullInit; // R806
|
||||
constexpr Parser<AccessSpec> accessSpec; // R807
|
||||
constexpr Parser<LanguageBindingSpec> languageBindingSpec; // R808, R1528
|
||||
constexpr Parser<EntityDecl> entityDecl; // R803
|
||||
constexpr Parser<CoarraySpec> coarraySpec; // R809
|
||||
constexpr Parser<ArraySpec> arraySpec; // R815
|
||||
constexpr Parser<ExplicitShapeSpec> explicitShapeSpec; // R816
|
||||
constexpr Parser<DeferredShapeSpecList> deferredShapeSpecList; // R820
|
||||
constexpr Parser<AssumedImpliedSpec> assumedImpliedSpec; // R821
|
||||
constexpr Parser<IntentSpec> intentSpec; // R826
|
||||
constexpr Parser<DataStmt> dataStmt; // R837
|
||||
constexpr Parser<DataImpliedDo> dataImpliedDo; // R840
|
||||
constexpr Parser<ParameterStmt> parameterStmt; // R851
|
||||
constexpr Parser<OldParameterStmt> oldParameterStmt;
|
||||
constexpr Parser<Designator> designator; // R901
|
||||
constexpr Parser<Variable> variable; // R902
|
||||
constexpr Parser<Substring> substring; // R908
|
||||
constexpr Parser<DataRef> dataRef; // R911, R914, R917
|
||||
constexpr Parser<StructureComponent> structureComponent; // R913
|
||||
constexpr Parser<StatVariable> statVariable; // R929
|
||||
constexpr Parser<StatOrErrmsg> statOrErrmsg; // R942 & R1165
|
||||
constexpr Parser<DefinedOpName> definedOpName; // R1003, R1023, R1414, & R1415
|
||||
constexpr Parser<Expr> expr; // R1022
|
||||
constexpr Parser<SpecificationExpr> specificationExpr; // R1028
|
||||
constexpr Parser<AssignmentStmt> assignmentStmt; // R1032
|
||||
constexpr Parser<PointerAssignmentStmt> pointerAssignmentStmt; // R1033
|
||||
constexpr Parser<WhereStmt> whereStmt; // R1041, R1045, R1046
|
||||
constexpr Parser<WhereConstruct> whereConstruct; // R1042
|
||||
constexpr Parser<WhereBodyConstruct> whereBodyConstruct; // R1044
|
||||
constexpr Parser<ForallConstruct> forallConstruct; // R1050
|
||||
constexpr Parser<ForallAssignmentStmt> forallAssignmentStmt; // R1053
|
||||
constexpr Parser<ForallStmt> forallStmt; // R1055
|
||||
constexpr Parser<Selector> selector; // R1105
|
||||
constexpr Parser<EndSelectStmt> endSelectStmt; // R1143 & R1151 & R1155
|
||||
constexpr Parser<LoopControl> loopControl; // R1123
|
||||
constexpr Parser<ConcurrentHeader> concurrentHeader; // R1125
|
||||
constexpr Parser<EndDoStmt> endDoStmt; // R1132
|
||||
constexpr Parser<IoUnit> ioUnit; // R1201, R1203
|
||||
constexpr Parser<FileUnitNumber> fileUnitNumber; // R1202
|
||||
constexpr Parser<IoControlSpec> ioControlSpec; // R1213, R1214
|
||||
constexpr Parser<Format> format; // R1215
|
||||
constexpr Parser<InputItem> inputItem; // R1216
|
||||
constexpr Parser<OutputItem> outputItem; // R1217
|
||||
constexpr Parser<InputImpliedDo> inputImpliedDo; // R1218, R1219
|
||||
constexpr Parser<OutputImpliedDo> outputImpliedDo; // R1218, R1219
|
||||
constexpr Parser<PositionOrFlushSpec> positionOrFlushSpec; // R1227 & R1229
|
||||
constexpr Parser<FormatStmt> formatStmt; // R1301
|
||||
constexpr Parser<InterfaceBlock> interfaceBlock; // R1501
|
||||
constexpr Parser<GenericSpec> genericSpec; // R1508
|
||||
constexpr Parser<ProcInterface> procInterface; // R1513
|
||||
constexpr Parser<ProcDecl> procDecl; // R1515
|
||||
constexpr Parser<FunctionReference> functionReference; // R1520
|
||||
constexpr Parser<ActualArgSpec> actualArgSpec; // R1523
|
||||
constexpr Parser<PrefixSpec> prefixSpec; // R1527
|
||||
constexpr Parser<FunctionSubprogram> functionSubprogram; // R1529
|
||||
constexpr Parser<FunctionStmt> functionStmt; // R1530
|
||||
constexpr Parser<Suffix> suffix; // R1532
|
||||
constexpr Parser<EndFunctionStmt> endFunctionStmt; // R1533
|
||||
constexpr Parser<SubroutineSubprogram> subroutineSubprogram; // R1534
|
||||
constexpr Parser<SubroutineStmt> subroutineStmt; // R1535
|
||||
constexpr Parser<DummyArg> dummyArg; // R1536
|
||||
constexpr Parser<EndSubroutineStmt> endSubroutineStmt; // R1537
|
||||
constexpr Parser<EntryStmt> entryStmt; // R1541
|
||||
constexpr Parser<ContainsStmt> containsStmt; // R1543
|
||||
constexpr Parser<CompilerDirective> compilerDirective;
|
||||
|
||||
// For a parser p, indirect(p) returns a parser that builds an indirect
|
||||
// reference to p's return type.
|
||||
template<typename PA> inline constexpr auto indirect(const PA &p) {
|
||||
return construct<Indirection<typename PA::resultType>>{}(p);
|
||||
}
|
||||
|
||||
// R711 digit-string -> digit [digit]...
|
||||
// N.B. not a token -- no space is skipped
|
||||
constexpr DigitString digitString;
|
||||
|
|
131
flang/lib/parser/type-parsers.h
Normal file
131
flang/lib/parser/type-parsers.h
Normal file
|
@ -0,0 +1,131 @@
|
|||
#ifndef FORTRAN_PARSER_TYPE_PARSERS_H_
|
||||
#define FORTRAN_PARSER_TYPE_PARSERS_H_
|
||||
|
||||
#include "basic-parsers.h"
|
||||
#include "parse-tree.h"
|
||||
#include <optional>
|
||||
|
||||
namespace Fortran {
|
||||
namespace parser {
|
||||
|
||||
// Many parsers in the grammar are defined as instances of this Parser<>
|
||||
// template class, 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<typename A> struct Parser {
|
||||
using resultType = A;
|
||||
constexpr Parser() {}
|
||||
static inline std::optional<A> Parse(ParseState &);
|
||||
};
|
||||
|
||||
#define TYPE_PARSER(pexpr) \
|
||||
template<> \
|
||||
inline std::optional<typename decltype(pexpr)::resultType> \
|
||||
Parser<typename decltype(pexpr)::resultType>::Parse(ParseState &state) { \
|
||||
static constexpr auto parser = (pexpr); \
|
||||
return parser.Parse(state); \
|
||||
}
|
||||
|
||||
#define TYPE_CONTEXT_PARSER(contextText, pexpr) \
|
||||
TYPE_PARSER(instrumented((contextText), inContext((contextText), (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<T>{}
|
||||
// objects in the right-hand sides of productions.
|
||||
constexpr Parser<Program> program; // R501 - the "top level" production
|
||||
constexpr Parser<SpecificationPart> specificationPart; // R504
|
||||
constexpr Parser<ImplicitPart> implicitPart; // R505
|
||||
constexpr Parser<DeclarationConstruct> declarationConstruct; // R507
|
||||
constexpr Parser<SpecificationConstruct> specificationConstruct; // R508
|
||||
constexpr Parser<ExecutionPart> executionPart; // R509
|
||||
constexpr Parser<ExecutionPartConstruct> executionPartConstruct; // R510
|
||||
constexpr Parser<InternalSubprogramPart> internalSubprogramPart; // R511
|
||||
constexpr Parser<ActionStmt> actionStmt; // R515
|
||||
constexpr Parser<Name> name; // R603
|
||||
constexpr Parser<LiteralConstant> literalConstant; // R605
|
||||
constexpr Parser<NamedConstant> namedConstant; // R606
|
||||
constexpr Parser<TypeParamValue> typeParamValue; // R701
|
||||
constexpr Parser<TypeSpec> typeSpec; // R702
|
||||
constexpr Parser<DeclarationTypeSpec> declarationTypeSpec; // R703
|
||||
constexpr Parser<IntrinsicTypeSpec> intrinsicTypeSpec; // R704
|
||||
constexpr Parser<IntegerTypeSpec> integerTypeSpec; // R705
|
||||
constexpr Parser<KindSelector> kindSelector; // R706
|
||||
constexpr Parser<SignedIntLiteralConstant> signedIntLiteralConstant; // R707
|
||||
constexpr Parser<IntLiteralConstant> intLiteralConstant; // R708
|
||||
constexpr Parser<KindParam> kindParam; // R709
|
||||
constexpr Parser<RealLiteralConstant> realLiteralConstant; // R714
|
||||
constexpr Parser<CharLength> charLength; // R723
|
||||
constexpr Parser<CharLiteralConstant> charLiteralConstant; // R724
|
||||
constexpr Parser<Initialization> initialization; // R743 & R805
|
||||
constexpr Parser<DerivedTypeSpec> derivedTypeSpec; // R754
|
||||
constexpr Parser<TypeDeclarationStmt> typeDeclarationStmt; // R801
|
||||
constexpr Parser<NullInit> nullInit; // R806
|
||||
constexpr Parser<AccessSpec> accessSpec; // R807
|
||||
constexpr Parser<LanguageBindingSpec> languageBindingSpec; // R808, R1528
|
||||
constexpr Parser<EntityDecl> entityDecl; // R803
|
||||
constexpr Parser<CoarraySpec> coarraySpec; // R809
|
||||
constexpr Parser<ArraySpec> arraySpec; // R815
|
||||
constexpr Parser<ExplicitShapeSpec> explicitShapeSpec; // R816
|
||||
constexpr Parser<DeferredShapeSpecList> deferredShapeSpecList; // R820
|
||||
constexpr Parser<AssumedImpliedSpec> assumedImpliedSpec; // R821
|
||||
constexpr Parser<IntentSpec> intentSpec; // R826
|
||||
constexpr Parser<DataStmt> dataStmt; // R837
|
||||
constexpr Parser<DataImpliedDo> dataImpliedDo; // R840
|
||||
constexpr Parser<ParameterStmt> parameterStmt; // R851
|
||||
constexpr Parser<OldParameterStmt> oldParameterStmt;
|
||||
constexpr Parser<Designator> designator; // R901
|
||||
constexpr Parser<Variable> variable; // R902
|
||||
constexpr Parser<Substring> substring; // R908
|
||||
constexpr Parser<DataRef> dataRef; // R911, R914, R917
|
||||
constexpr Parser<StructureComponent> structureComponent; // R913
|
||||
constexpr Parser<StatVariable> statVariable; // R929
|
||||
constexpr Parser<StatOrErrmsg> statOrErrmsg; // R942 & R1165
|
||||
constexpr Parser<DefinedOpName> definedOpName; // R1003, R1023, R1414, & R1415
|
||||
constexpr Parser<Expr> expr; // R1022
|
||||
constexpr Parser<SpecificationExpr> specificationExpr; // R1028
|
||||
constexpr Parser<AssignmentStmt> assignmentStmt; // R1032
|
||||
constexpr Parser<PointerAssignmentStmt> pointerAssignmentStmt; // R1033
|
||||
constexpr Parser<WhereStmt> whereStmt; // R1041, R1045, R1046
|
||||
constexpr Parser<WhereConstruct> whereConstruct; // R1042
|
||||
constexpr Parser<WhereBodyConstruct> whereBodyConstruct; // R1044
|
||||
constexpr Parser<ForallConstruct> forallConstruct; // R1050
|
||||
constexpr Parser<ForallAssignmentStmt> forallAssignmentStmt; // R1053
|
||||
constexpr Parser<ForallStmt> forallStmt; // R1055
|
||||
constexpr Parser<Selector> selector; // R1105
|
||||
constexpr Parser<EndSelectStmt> endSelectStmt; // R1143 & R1151 & R1155
|
||||
constexpr Parser<LoopControl> loopControl; // R1123
|
||||
constexpr Parser<ConcurrentHeader> concurrentHeader; // R1125
|
||||
constexpr Parser<EndDoStmt> endDoStmt; // R1132
|
||||
constexpr Parser<IoUnit> ioUnit; // R1201, R1203
|
||||
constexpr Parser<FileUnitNumber> fileUnitNumber; // R1202
|
||||
constexpr Parser<IoControlSpec> ioControlSpec; // R1213, R1214
|
||||
constexpr Parser<Format> format; // R1215
|
||||
constexpr Parser<InputItem> inputItem; // R1216
|
||||
constexpr Parser<OutputItem> outputItem; // R1217
|
||||
constexpr Parser<InputImpliedDo> inputImpliedDo; // R1218, R1219
|
||||
constexpr Parser<OutputImpliedDo> outputImpliedDo; // R1218, R1219
|
||||
constexpr Parser<PositionOrFlushSpec> positionOrFlushSpec; // R1227 & R1229
|
||||
constexpr Parser<FormatStmt> formatStmt; // R1301
|
||||
constexpr Parser<InterfaceBlock> interfaceBlock; // R1501
|
||||
constexpr Parser<GenericSpec> genericSpec; // R1508
|
||||
constexpr Parser<ProcInterface> procInterface; // R1513
|
||||
constexpr Parser<ProcDecl> procDecl; // R1515
|
||||
constexpr Parser<FunctionReference> functionReference; // R1520
|
||||
constexpr Parser<ActualArgSpec> actualArgSpec; // R1523
|
||||
constexpr Parser<PrefixSpec> prefixSpec; // R1527
|
||||
constexpr Parser<FunctionSubprogram> functionSubprogram; // R1529
|
||||
constexpr Parser<FunctionStmt> functionStmt; // R1530
|
||||
constexpr Parser<Suffix> suffix; // R1532
|
||||
constexpr Parser<EndFunctionStmt> endFunctionStmt; // R1533
|
||||
constexpr Parser<SubroutineSubprogram> subroutineSubprogram; // R1534
|
||||
constexpr Parser<SubroutineStmt> subroutineStmt; // R1535
|
||||
constexpr Parser<DummyArg> dummyArg; // R1536
|
||||
constexpr Parser<EndSubroutineStmt> endSubroutineStmt; // R1537
|
||||
constexpr Parser<EntryStmt> entryStmt; // R1541
|
||||
constexpr Parser<ContainsStmt> containsStmt; // R1543
|
||||
constexpr Parser<CompilerDirective> compilerDirective;
|
||||
} // namespace parser
|
||||
} // namespace Fortran
|
||||
#endif // FORTRAN_PARSER_TYPE_PARSERS_H_
|
Loading…
Reference in a new issue