From 8fa4baa5e80d26f23733a82f4c53168feddafab2 Mon Sep 17 00:00:00 2001 From: peter klausler Date: Wed, 25 Apr 2018 14:14:02 -0700 Subject: [PATCH] [flang] Use first() more. Original-commit: flang-compiler/f18@a2f2fdf869bd9a73a3b900d599f7adca2b02a8cd Reviewed-on: https://github.com/flang-compiler/f18/pull/73 Tree-same-pre-rewrite: false --- flang/lib/parser/grammar.h | 328 ++++++++++++++++++++++----------------------- 1 file changed, 159 insertions(+), 169 deletions(-) diff --git a/flang/lib/parser/grammar.h b/flang/lib/parser/grammar.h index f27c1d3..6a23530 100644 --- a/flang/lib/parser/grammar.h +++ b/flang/lib/parser/grammar.h @@ -360,14 +360,14 @@ constexpr auto obsoleteExecutionPartConstruct = recovery( errorRecovery)); TYPE_CONTEXT_PARSER("execution part construct"_en_US, - recovery(construct(executableConstruct) || - construct( - statement(indirect(formatStmt))) || - construct(statement(indirect(entryStmt))) || - construct(statement(indirect(dataStmt))) || + recovery( + first(construct(executableConstruct), + construct(statement(indirect(formatStmt))), + construct(statement(indirect(entryStmt))), + construct(statement(indirect(dataStmt))), extension(construct( statement(indirect(Parser{}))) || - obsoleteExecutionPartConstruct), + obsoleteExecutionPartConstruct)), construct(executionPartErrorRecovery))) // R509 execution-part -> executable-construct [execution-part-construct]... @@ -1105,15 +1105,15 @@ TYPE_PARSER(construct(intLiteralConstant) || // null-init | initial-data-target | structure-constructor // TODO: Some structure constructors can be misrecognized as array // references into constant subobjects. -TYPE_PARSER(construct(scalar(Parser{})) || - construct(nullInit) || - construct(Parser{}) || - construct(scalar(constantSubobject)) || - construct(signedRealLiteralConstant) || - construct(signedIntLiteralConstant) || +TYPE_PARSER(first(construct(scalar(Parser{})), + construct(nullInit), + construct(Parser{}), + construct(scalar(constantSubobject)), + construct(signedRealLiteralConstant), + construct(signedIntLiteralConstant), extension( - construct(Parser{})) || - construct(initialDataTarget)) + construct(Parser{})), + construct(initialDataTarget))) // R848 dimension-stmt -> // DIMENSION [::] array-name ( array-spec ) @@ -1202,17 +1202,17 @@ TYPE_CONTEXT_PARSER("IMPLICIT statement"_en_US, // type specs, DOUBLE PRECISION, and DOUBLE COMPLEX need not be considered. constexpr auto noKindSelector = construct>(); constexpr auto implicitSpecDeclarationTypeSpecRetry = - construct( + construct(first( construct( - construct("INTEGER" >> noKindSelector)) || + construct("INTEGER" >> noKindSelector)), construct( - construct("REAL" >> noKindSelector)) || - construct(construct( - "COMPLEX" >> noKindSelector)) || + construct("REAL" >> noKindSelector)), + construct( + construct("COMPLEX" >> noKindSelector)), construct(construct( - "CHARACTER" >> construct>())) || + "CHARACTER" >> construct>())), construct(construct( - "LOGICAL" >> noKindSelector))); + "LOGICAL" >> noKindSelector)))); TYPE_PARSER(construct(declarationTypeSpec, parenthesized(nonemptyList(Parser{}))) || @@ -1486,27 +1486,27 @@ TYPE_PARSER(construct("STAT =" >> statVariable) || // structure-constructor | function-reference | type-param-inquiry | // type-param-name | ( expr ) constexpr auto primary = instrumented("primary"_en_US, - construct(indirect(Parser{})) || - construct(literalConstant) || - construct(construct(parenthesized(expr))) || - construct(indirect(functionReference) / !"("_tok) || - construct(designator / !"("_tok) || - construct(Parser{}) || - construct(Parser{}) || - construct(indirect(Parser{})) || // occulted + first(construct(indirect(Parser{})), + construct(literalConstant), + construct(construct(parenthesized(expr))), + construct(indirect(functionReference) / !"("_tok), + construct(designator / !"("_tok), + construct(Parser{}), + construct(Parser{}), + construct(indirect(Parser{})), // occulted // PGI/XLF extension: COMPLEX constructor (x,y) extension(construct(parenthesized( - construct(expr, "," >> expr)))) || + construct(expr, "," >> expr)))), extension(construct("%LOC" >> - parenthesized(construct(indirect(variable)))))); + parenthesized(construct(indirect(variable))))))); // R1002 level-1-expr -> [defined-unary-op] primary // TODO: Reasonable extension: permit multiple defined-unary-ops -constexpr auto level1Expr = - construct(construct(definedOpName, primary)) || - primary || - extension(construct(construct("+" >> primary))) || - extension(construct(construct("-" >> primary))); +constexpr auto level1Expr = first( + construct(construct(definedOpName, primary)), + primary, + extension(construct(construct("+" >> primary))), + extension(construct(construct("-" >> primary)))); // R1004 mult-operand -> level-1-expr [power-op mult-operand] // R1007 power-op -> ** @@ -2302,76 +2302,70 @@ constexpr auto fileNameExpr = scalarDefaultCharExpr; constexpr auto statusExpr = construct(scalarDefaultCharExpr); constexpr auto errLabel = construct(label); -TYPE_PARSER(construct(maybe("UNIT ="_tok) >> fileUnitNumber) || +TYPE_PARSER(first(construct(maybe("UNIT ="_tok) >> fileUnitNumber), construct(construct( "ACCESS =" >> pure(ConnectSpec::CharExpr::Kind::Access), - scalarDefaultCharExpr)) || + scalarDefaultCharExpr)), construct(construct( "ACTION =" >> pure(ConnectSpec::CharExpr::Kind::Action), - scalarDefaultCharExpr)) || + scalarDefaultCharExpr)), construct(construct( "ASYNCHRONOUS =" >> pure(ConnectSpec::CharExpr::Kind::Asynchronous), - scalarDefaultCharExpr)) || - + scalarDefaultCharExpr)), construct(construct( "BLANK =" >> pure(ConnectSpec::CharExpr::Kind::Blank), - scalarDefaultCharExpr)) || + scalarDefaultCharExpr)), construct(construct( "DECIMAL =" >> pure(ConnectSpec::CharExpr::Kind::Decimal), - scalarDefaultCharExpr)) || - + scalarDefaultCharExpr)), construct(construct( "DELIM =" >> pure(ConnectSpec::CharExpr::Kind::Delim), - scalarDefaultCharExpr)) || + scalarDefaultCharExpr)), construct(construct( "ENCODING =" >> pure(ConnectSpec::CharExpr::Kind::Encoding), - scalarDefaultCharExpr)) || - construct("ERR =" >> errLabel) || - construct("FILE =" >> fileNameExpr) || - extension(construct("NAME =" >> fileNameExpr)) || - + scalarDefaultCharExpr)), + construct("ERR =" >> errLabel), + construct("FILE =" >> fileNameExpr), + extension(construct("NAME =" >> fileNameExpr)), construct(construct( "FORM =" >> pure(ConnectSpec::CharExpr::Kind::Form), - scalarDefaultCharExpr)) || - construct("IOMSG =" >> msgVariable) || - construct("IOSTAT =" >> statVariable) || + scalarDefaultCharExpr)), + construct("IOMSG =" >> msgVariable), + construct("IOSTAT =" >> statVariable), construct(construct( - "NEWUNIT =" >> scalar(integer(variable)))) || - + "NEWUNIT =" >> scalar(integer(variable)))), construct(construct( "PAD =" >> pure(ConnectSpec::CharExpr::Kind::Pad), - scalarDefaultCharExpr)) || + scalarDefaultCharExpr)), construct(construct( "POSITION =" >> pure(ConnectSpec::CharExpr::Kind::Position), - scalarDefaultCharExpr)) || + scalarDefaultCharExpr)), construct( - construct("RECL =" >> scalarIntExpr)) || - + construct("RECL =" >> scalarIntExpr)), construct(construct( "ROUND =" >> pure(ConnectSpec::CharExpr::Kind::Round), - scalarDefaultCharExpr)) || - + scalarDefaultCharExpr)), construct(construct( "SIGN =" >> pure(ConnectSpec::CharExpr::Kind::Sign), - scalarDefaultCharExpr)) || - construct("STATUS =" >> statusExpr) || + scalarDefaultCharExpr)), + construct("STATUS =" >> statusExpr), extension(construct(construct( "CONVERT =" >> pure(ConnectSpec::CharExpr::Kind::Convert), scalarDefaultCharExpr)) || construct(construct( "DISPOSE =" >> pure(ConnectSpec::CharExpr::Kind::Dispose), - scalarDefaultCharExpr)))) + scalarDefaultCharExpr))))) // R1209 close-spec -> // [UNIT =] file-unit-number | IOSTAT = scalar-int-variable | // IOMSG = iomsg-variable | ERR = label | // STATUS = scalar-default-char-expr -constexpr auto closeSpec = - construct(maybe("UNIT ="_tok) >> fileUnitNumber) || - construct("IOSTAT =" >> statVariable) || - construct("IOMSG =" >> msgVariable) || - construct("ERR =" >> errLabel) || - construct("STATUS =" >> statusExpr); +constexpr auto closeSpec = first( + construct(maybe("UNIT ="_tok) >> fileUnitNumber), + construct("IOSTAT =" >> statVariable), + construct("IOMSG =" >> msgVariable), + construct("ERR =" >> errLabel), + construct("STATUS =" >> statusExpr)); // R1208 close-stmt -> CLOSE ( close-spec-list ) TYPE_CONTEXT_PARSER("CLOSE statement"_en_US, @@ -2418,50 +2412,46 @@ constexpr auto idVariable = construct(scalarIntVariable); // SIZE = scalar-int-variable constexpr auto endLabel = construct(label); constexpr auto eorLabel = construct(label); -TYPE_PARSER(construct("UNIT =" >> ioUnit) || - construct("FMT =" >> format) || - construct("NML =" >> name) || +TYPE_PARSER(first(construct("UNIT =" >> ioUnit), + construct("FMT =" >> format), + construct("NML =" >> name), construct( "ADVANCE =" >> construct( pure(IoControlSpec::CharExpr::Kind::Advance), - scalarDefaultCharExpr)) || + scalarDefaultCharExpr)), construct(construct( - "ASYNCHRONOUS =" >> scalarDefaultCharConstantExpr)) || - construct( - "BLANK =" >> construct( - pure(IoControlSpec::CharExpr::Kind::Blank), - scalarDefaultCharExpr)) || + "ASYNCHRONOUS =" >> scalarDefaultCharConstantExpr)), + construct("BLANK =" >> + construct( + pure(IoControlSpec::CharExpr::Kind::Blank), scalarDefaultCharExpr)), construct( "DECIMAL =" >> construct( pure(IoControlSpec::CharExpr::Kind::Decimal), - scalarDefaultCharExpr)) || - construct( - "DELIM =" >> construct( - pure(IoControlSpec::CharExpr::Kind::Delim), - scalarDefaultCharExpr)) || - construct("END =" >> endLabel) || - construct("EOR =" >> eorLabel) || - construct("ERR =" >> errLabel) || - construct("ID =" >> idVariable) || - construct("IOMSG = " >> msgVariable) || - construct("IOSTAT = " >> statVariable) || + scalarDefaultCharExpr)), + construct("DELIM =" >> + construct( + pure(IoControlSpec::CharExpr::Kind::Delim), scalarDefaultCharExpr)), + construct("END =" >> endLabel), + construct("EOR =" >> eorLabel), + construct("ERR =" >> errLabel), + construct("ID =" >> idVariable), + construct("IOMSG = " >> msgVariable), + construct("IOSTAT = " >> statVariable), construct("PAD =" >> construct( - pure(IoControlSpec::CharExpr::Kind::Pad), scalarDefaultCharExpr)) || - construct( - "POS =" >> construct(scalarIntExpr)) || - construct( - "REC =" >> construct(scalarIntExpr)) || + pure(IoControlSpec::CharExpr::Kind::Pad), scalarDefaultCharExpr)), construct( - "ROUND =" >> construct( - pure(IoControlSpec::CharExpr::Kind::Round), - scalarDefaultCharExpr)) || + "POS =" >> construct(scalarIntExpr)), construct( - "SIGN =" >> construct( - pure(IoControlSpec::CharExpr::Kind::Sign), - scalarDefaultCharExpr)) || + "REC =" >> construct(scalarIntExpr)), + construct("ROUND =" >> + construct( + pure(IoControlSpec::CharExpr::Kind::Round), scalarDefaultCharExpr)), + construct("SIGN =" >> + construct( + pure(IoControlSpec::CharExpr::Kind::Sign), scalarDefaultCharExpr)), construct( - "SIZE =" >> construct(scalarIntVariable))) + "SIZE =" >> construct(scalarIntVariable)))) // R1211 write-stmt -> WRITE ( io-control-spec-list ) [output-item-list] constexpr auto outputItemList = @@ -2525,13 +2515,13 @@ TYPE_CONTEXT_PARSER("WAIT statement"_en_US, // IOSTAT = scalar-int-variable constexpr auto idExpr = construct(scalarIntExpr); -TYPE_PARSER(construct(maybe("UNIT ="_tok) >> fileUnitNumber) || - construct("END =" >> endLabel) || - construct("EOR =" >> eorLabel) || - construct("ERR =" >> errLabel) || - construct("ID =" >> idExpr) || - construct("IOMSG =" >> msgVariable) || - construct("IOSTAT =" >> statVariable)) +TYPE_PARSER(first(construct(maybe("UNIT ="_tok) >> fileUnitNumber), + construct("END =" >> endLabel), + construct("EOR =" >> eorLabel), + construct("ERR =" >> errLabel), + construct("ID =" >> idExpr), + construct("IOMSG =" >> msgVariable), + construct("IOSTAT =" >> statVariable))) template std::list singletonList(A &&x) { std::list result; @@ -2604,122 +2594,122 @@ TYPE_CONTEXT_PARSER("FLUSH statement"_en_US, // STREAM = scalar-default-char-variable | // STATUS = scalar-default-char-variable | // WRITE = scalar-default-char-variable -TYPE_PARSER(construct(maybe("UNIT ="_tok) >> fileUnitNumber) || - construct("FILE =" >> fileNameExpr) || +TYPE_PARSER(first(construct(maybe("UNIT ="_tok) >> fileUnitNumber), + construct("FILE =" >> fileNameExpr), construct( "ACCESS =" >> construct( pure(InquireSpec::CharVar::Kind::Access), - scalarDefaultCharVariable)) || + scalarDefaultCharVariable)), construct( "ACTION =" >> construct( pure(InquireSpec::CharVar::Kind::Action), - scalarDefaultCharVariable)) || + scalarDefaultCharVariable)), construct( "ASYNCHRONOUS =" >> construct( pure(InquireSpec::CharVar::Kind::Asynchronous), - scalarDefaultCharVariable)) || + scalarDefaultCharVariable)), construct("BLANK =" >> construct(pure(InquireSpec::CharVar::Kind::Blank), - scalarDefaultCharVariable)) || + scalarDefaultCharVariable)), construct( "DECIMAL =" >> construct( pure(InquireSpec::CharVar::Kind::Decimal), - scalarDefaultCharVariable)) || + scalarDefaultCharVariable)), construct("DELIM =" >> construct(pure(InquireSpec::CharVar::Kind::Delim), - scalarDefaultCharVariable)) || + scalarDefaultCharVariable)), construct( "DIRECT =" >> construct( pure(InquireSpec::CharVar::Kind::Direct), - scalarDefaultCharVariable)) || + scalarDefaultCharVariable)), construct( "ENCODING =" >> construct( pure(InquireSpec::CharVar::Kind::Encoding), - scalarDefaultCharVariable)) || - construct("ERR =" >> errLabel) || + scalarDefaultCharVariable)), + construct("ERR =" >> errLabel), construct("EXIST =" >> construct( - pure(InquireSpec::LogVar::Kind::Exist), scalarLogicalVariable)) || + pure(InquireSpec::LogVar::Kind::Exist), scalarLogicalVariable)), construct("FORM =" >> - construct(pure(InquireSpec::CharVar::Kind::Form), - scalarDefaultCharVariable)) || + construct( + pure(InquireSpec::CharVar::Kind::Form), scalarDefaultCharVariable)), construct( "FORMATTED =" >> construct( pure(InquireSpec::CharVar::Kind::Formatted), - scalarDefaultCharVariable)) || - construct("ID =" >> idExpr) || + scalarDefaultCharVariable)), + construct("ID =" >> idExpr), construct("IOMSG =" >> construct(pure(InquireSpec::CharVar::Kind::Iomsg), - scalarDefaultCharVariable)) || + scalarDefaultCharVariable)), construct("IOSTAT =" >> construct(pure(InquireSpec::IntVar::Kind::Iostat), - scalar(integer(variable)))) || + scalar(integer(variable)))), construct("NAME =" >> - construct(pure(InquireSpec::CharVar::Kind::Name), - scalarDefaultCharVariable)) || + construct( + pure(InquireSpec::CharVar::Kind::Name), scalarDefaultCharVariable)), construct("NAMED =" >> construct( - pure(InquireSpec::LogVar::Kind::Named), scalarLogicalVariable)) || + pure(InquireSpec::LogVar::Kind::Named), scalarLogicalVariable)), construct("NEXTREC =" >> construct(pure(InquireSpec::IntVar::Kind::Nextrec), - scalar(integer(variable)))) || + scalar(integer(variable)))), construct("NUMBER =" >> construct(pure(InquireSpec::IntVar::Kind::Number), - scalar(integer(variable)))) || + scalar(integer(variable)))), construct("OPENED =" >> construct( - pure(InquireSpec::LogVar::Kind::Opened), scalarLogicalVariable)) || + pure(InquireSpec::LogVar::Kind::Opened), scalarLogicalVariable)), construct("PAD =" >> - construct(pure(InquireSpec::CharVar::Kind::Pad), - scalarDefaultCharVariable)) || + construct( + pure(InquireSpec::CharVar::Kind::Pad), scalarDefaultCharVariable)), construct("PENDING =" >> construct( - pure(InquireSpec::LogVar::Kind::Pending), scalarLogicalVariable)) || + pure(InquireSpec::LogVar::Kind::Pending), scalarLogicalVariable)), construct("POS =" >> construct( - pure(InquireSpec::IntVar::Kind::Pos), scalar(integer(variable)))) || + pure(InquireSpec::IntVar::Kind::Pos), scalar(integer(variable)))), construct( "POSITION =" >> construct( pure(InquireSpec::CharVar::Kind::Position), - scalarDefaultCharVariable)) || + scalarDefaultCharVariable)), construct("READ =" >> - construct(pure(InquireSpec::CharVar::Kind::Read), - scalarDefaultCharVariable)) || + construct( + pure(InquireSpec::CharVar::Kind::Read), scalarDefaultCharVariable)), construct( "READWRITE =" >> construct( pure(InquireSpec::CharVar::Kind::Readwrite), - scalarDefaultCharVariable)) || + scalarDefaultCharVariable)), construct("RECL =" >> - construct(pure(InquireSpec::IntVar::Kind::Recl), - scalar(integer(variable)))) || + construct( + pure(InquireSpec::IntVar::Kind::Recl), scalar(integer(variable)))), construct("ROUND =" >> construct(pure(InquireSpec::CharVar::Kind::Round), - scalarDefaultCharVariable)) || + scalarDefaultCharVariable)), construct( "SEQUENTIAL =" >> construct( pure(InquireSpec::CharVar::Kind::Sequential), - scalarDefaultCharVariable)) || + scalarDefaultCharVariable)), construct("SIGN =" >> - construct(pure(InquireSpec::CharVar::Kind::Sign), - scalarDefaultCharVariable)) || + construct( + pure(InquireSpec::CharVar::Kind::Sign), scalarDefaultCharVariable)), construct("SIZE =" >> - construct(pure(InquireSpec::IntVar::Kind::Size), - scalar(integer(variable)))) || + construct( + pure(InquireSpec::IntVar::Kind::Size), scalar(integer(variable)))), construct( "STREAM =" >> construct( pure(InquireSpec::CharVar::Kind::Stream), - scalarDefaultCharVariable)) || + scalarDefaultCharVariable)), construct( "STATUS =" >> construct( pure(InquireSpec::CharVar::Kind::Status), - scalarDefaultCharVariable)) || + scalarDefaultCharVariable)), construct( "UNFORMATTED =" >> construct( pure(InquireSpec::CharVar::Kind::Unformatted), - scalarDefaultCharVariable)) || + scalarDefaultCharVariable)), construct("WRITE =" >> construct(pure(InquireSpec::CharVar::Kind::Write), - scalarDefaultCharVariable))) + scalarDefaultCharVariable)))) // R1230 inquire-stmt -> // INQUIRE ( inquire-spec-list ) | @@ -3048,19 +3038,19 @@ TYPE_PARSER(construct("MODULE PROCEDURE"_sptok >> // R1509 defined-io-generic-spec -> // READ ( FORMATTED ) | READ ( UNFORMATTED ) | // WRITE ( FORMATTED ) | WRITE ( UNFORMATTED ) -TYPE_PARSER(construct( - "OPERATOR" >> parenthesized(Parser{})) || +TYPE_PARSER(first(construct( + "OPERATOR" >> parenthesized(Parser{})), + construct( + construct("ASSIGNMENT ( = )"_tok)), construct( - construct("ASSIGNMENT ( = )"_tok)) || + construct("READ ( FORMATTED )"_tok)), construct( - construct("READ ( FORMATTED )"_tok)) || + construct("READ ( UNFORMATTED )"_tok)), construct( - construct("READ ( UNFORMATTED )"_tok)) || + construct("WRITE ( FORMATTED )"_tok)), construct( - construct("WRITE ( FORMATTED )"_tok)) || - construct(construct( - "WRITE ( UNFORMATTED )"_tok)) || - construct(name)) + construct("WRITE ( UNFORMATTED )"_tok)), + construct(name))) // R1510 generic-stmt -> // GENERIC [, access-spec] :: generic-spec => specific-procedure-list @@ -3143,14 +3133,14 @@ TYPE_PARSER(construct(star >> label)) // R1527 prefix-spec -> // declaration-type-spec | ELEMENTAL | IMPURE | MODULE | // NON_RECURSIVE | PURE | RECURSIVE -TYPE_PARSER(construct(declarationTypeSpec) || - construct(construct("ELEMENTAL"_tok)) || - construct(construct("IMPURE"_tok)) || - construct(construct("MODULE"_tok)) || +TYPE_PARSER(first(construct(declarationTypeSpec), + construct(construct("ELEMENTAL"_tok)), + construct(construct("IMPURE"_tok)), + construct(construct("MODULE"_tok)), construct( - construct("NON_RECURSIVE"_tok)) || - construct(construct("PURE"_tok)) || - construct(construct("RECURSIVE"_tok))) + construct("NON_RECURSIVE"_tok)), + construct(construct("PURE"_tok)), + construct(construct("RECURSIVE"_tok)))) // R1529 function-subprogram -> // function-stmt [specification-part] [execution-part] -- 2.7.4