[flang] Fix comment in openmp-grammar.h.  Fix unparse of reduction operator.

Original-commit: flang-compiler/f18@f6a7a03492525bcdf31e61f3a71e28cbe5818e95
Reviewed-on: https://github.com/flang-compiler/f18/pull/96
diff --git a/flang/lib/parser/openmp-grammar.h b/flang/lib/parser/openmp-grammar.h
index 2921aee..cf2d785 100644
--- a/flang/lib/parser/openmp-grammar.h
+++ b/flang/lib/parser/openmp-grammar.h
@@ -12,14 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef OPENMP_PARSER_GRAMMAR_H_
-#define OPENMP_PARSER_GRAMMAR_H_
+#ifndef FORTRAN_PARSER_OPENMP_GRAMMAR_H_
+#define FORTRAN_PARSER_OPENMP_GRAMMAR_H_
 
-// 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 ParserCombinators.md for documentation on the parser combinator
-// library used here to implement an LL recursive descent recognizer.
+// Top-level grammar specification for OpenMP. 
+// See OpenMP-4.5-grammar.txt for documentation.
 
 #include "basic-parsers.h"
 #include "characters.h"
@@ -63,13 +60,13 @@
 // map-type-modifier -> ALWAYS
 // map-type -> TO | FROM | TOFROM | ALLOC | RELEASE | DELETE
 TYPE_PARSER(construct<OmpMapClause>(
-    maybe(maybe("ALWAYS"_tok >> maybe(","_ch)) >>
-        ("TO" >> pure(OmpMapClause::Type::To) / ":"_ch ||
-            "FROM" >> pure(OmpMapClause::Type::From) / ":"_ch ||
-            "TOFROM" >> pure(OmpMapClause::Type::Tofrom) / ":"_ch ||
-            "ALLOC" >> pure(OmpMapClause::Type::Alloc) / ":"_ch ||
-            "RELEASE" >> pure(OmpMapClause::Type::Release) / ":"_ch ||
-            "DELETE" >> pure(OmpMapClause::Type::Delete) / ":"_ch)),
+    maybe(maybe("ALWAYS" >> maybe(","_tok)) >>
+        ("TO" >> pure(OmpMapClause::Type::To) / ":"_tok ||
+            "FROM" >> pure(OmpMapClause::Type::From) / ":"_tok ||
+            "TOFROM" >> pure(OmpMapClause::Type::Tofrom) / ":"_tok ||
+            "ALLOC" >> pure(OmpMapClause::Type::Alloc) / ":"_tok ||
+            "RELEASE" >> pure(OmpMapClause::Type::Release) / ":"_tok ||
+            "DELETE" >> pure(OmpMapClause::Type::Delete) / ":"_tok)),
     nonemptyList(name)))
 
 // SCHEDULE ([modifier [, modifier]:]kind[, chunk_size])
@@ -82,7 +79,7 @@
     "SIMD" >> pure(OmpScheduleModifierType::ModType::Simd)))
 
 TYPE_PARSER(construct<OmpScheduleModifier>(Parser<OmpScheduleModifierType>{},
-    maybe(","_ch >> Parser<OmpScheduleModifierType>{})))
+    maybe(","_tok >> Parser<OmpScheduleModifierType>{})))
 
 TYPE_PARSER(construct<OmpScheduleClause>(maybe(Parser<OmpScheduleModifier>{}),
     "STATIC" >> pure(OmpScheduleClause::ScheduleType::Static) ||
@@ -90,11 +87,11 @@
         "GUIDED" >> pure(OmpScheduleClause::ScheduleType::Guided) ||
         "AUTO" >> pure(OmpScheduleClause::ScheduleType::Auto) ||
         "RUNTIME" >> pure(OmpScheduleClause::ScheduleType::Runtime),
-    maybe(","_ch) >> scalarIntExpr))
+    maybe(","_tok) >> scalarIntExpr))
 
 // IF(directive-name-modifier: scalar-logical-expr)
 TYPE_PARSER(construct<OmpIfClause>(
-    ("PARALLEL"_tok >> pure(OmpIfClause::DirectiveNameModifier::Parallel) ||
+    maybe("PARALLEL"_tok >> pure(OmpIfClause::DirectiveNameModifier::Parallel) ||
         "TARGET ENTER DATA"_tok >>
             pure(OmpIfClause::DirectiveNameModifier::TargetEnterData) ||
         "TARGET EXIT DATA"_tok >>
@@ -106,7 +103,7 @@
         "TARGET"_tok >> pure(OmpIfClause::DirectiveNameModifier::Target) ||
         "TASKLOOP"_tok >> pure(OmpIfClause::DirectiveNameModifier::Taskloop) ||
         "TASK"_tok >> pure(OmpIfClause::DirectiveNameModifier::Task)) /
-        maybe(":"_ch),
+        maybe(":"_tok),
     scalarLogicalExpr))
 
 // REDUCTION(reduction-identifier: list)
@@ -130,7 +127,7 @@
     construct<OmpReductionOperator>(reductionProcedureOperator))
 
 TYPE_PARSER(construct<OmpReductionClause>(
-    Parser<OmpReductionOperator>{} / ":"_ch, nonemptyList(designator)))
+    Parser<OmpReductionOperator>{} / ":"_tok, nonemptyList(designator)))
 
 // DEPEND(SOURCE | SINK : vec | (IN | OUT | INOUT) : list
 TYPE_PARSER(construct<OmpDependSinkVecLength>(
@@ -146,11 +143,11 @@
 
 TYPE_CONTEXT_PARSER("Omp Depend clause"_en_US,
     construct<OmpDependClause>(construct<OmpDependClause::Sink>(
-        "SINK"_tok >> ":"_ch >> nonemptyList(Parser<OmpDependSinkVec>{}))) ||
+        "SINK"_tok >> ":"_tok >> nonemptyList(Parser<OmpDependSinkVec>{}))) ||
         construct<OmpDependClause>(
             construct<OmpDependClause::Source>("SOURCE"_tok)) ||
         construct<OmpDependClause>(construct<OmpDependClause::InOut>(
-            Parser<OmpDependenceType>{}, ":"_ch >> nonemptyList(designator))))
+            Parser<OmpDependenceType>{}, ":"_tok >> nonemptyList(designator))))
 
 // LINEAR(list: linear-step)
 TYPE_PARSER(construct<OmpLinearModifier>(
@@ -162,20 +159,20 @@
     construct<OmpLinearClause>(
         construct<OmpLinearClause>(construct<OmpLinearClause::WithModifier>(
             Parser<OmpLinearModifier>{}, parenthesized(nonemptyList(name)),
-            maybe(":"_ch >> scalarIntConstantExpr))) ||
+            maybe(":"_tok >> scalarIntConstantExpr))) ||
         construct<OmpLinearClause>(construct<OmpLinearClause::WithoutModifier>(
-            nonemptyList(name), maybe(":"_ch >> scalarIntConstantExpr)))))
+            nonemptyList(name), maybe(":"_tok >> scalarIntConstantExpr)))))
 
 // ALIGNED(list: alignment)
 TYPE_PARSER(construct<OmpAlignedClause>(
-    nonemptyList(name), maybe(":"_ch) >> scalarIntConstantExpr))
+    nonemptyList(name), maybe(":"_tok) >> scalarIntConstantExpr))
 
 TYPE_PARSER(construct<OmpNameList>(pure(OmpNameList::Kind::Object), name) ||
     construct<OmpNameList>("/" >> pure(OmpNameList::Kind::Common), name / "/"))
 
 TYPE_PARSER(
     construct<OmpClause>(construct<OmpClause::Defaultmap>("DEFAULTMAP"_tok >>
-        parenthesized("TOFROM"_tok >> ":"_ch >> "SCALAR"_tok))) ||
+        parenthesized("TOFROM"_tok >> ":"_tok >> "SCALAR"_tok))) ||
     construct<OmpClause>(construct<OmpClause::Inbranch>("INBRANCH"_tok)) ||
     construct<OmpClause>(construct<OmpClause::Mergeable>("MERGEABLE"_tok)) ||
     construct<OmpClause>(construct<OmpClause::Nogroup>("NOGROUP"_tok)) ||
@@ -193,7 +190,7 @@
         "DEVICE"_tok >> parenthesized(scalarIntExpr))) ||
     construct<OmpClause>(
         construct<OmpClause::DistSchedule>("DIST_SCHEDULE"_tok >>
-            parenthesized("STATIC"_tok >> ","_ch >> scalarIntExpr))) ||
+            parenthesized("STATIC"_tok >> ","_tok >> scalarIntExpr))) ||
     construct<OmpClause>(construct<OmpClause::Final>(
         "FINAL"_tok >> parenthesized(scalarIntExpr))) ||
     construct<OmpClause>(
@@ -353,4 +350,4 @@
                                  indirect(Parser<OpenMPLoopConstruct>{}))))
 
 }  // namespace Fortran::parser
-#endif  // OPENMP_PARSER_GRAMMAR_H_
+#endif  // FORTRAN_PARSER_OPENMP_GRAMMAR_H_
diff --git a/flang/lib/parser/parse-tree.h b/flang/lib/parser/parse-tree.h
index 5ee51567..3f0778e 100644
--- a/flang/lib/parser/parse-tree.h
+++ b/flang/lib/parser/parse-tree.h
@@ -3286,8 +3286,8 @@
   std::variant<WithModifier, WithoutModifier> u;
 };
 
-// reduction-identifier -> Add, Subtract, Multiply, .and., .or., .eqv., .neqg.,
-// min, max, iand, ior, ieor
+// reduction-identifier -> "+", "-", "*", .AND., .OR., .EQV., .NEQV.,
+// MIN, MAX, IAND, IOR, IEOR
 struct OmpReductionOperator {
   UNION_CLASS_BOILERPLATE(OmpReductionOperator);
   ENUM_CLASS(ProcedureOperator, MIN, MAX, IAND, IOR, IEOR)
diff --git a/flang/lib/parser/unparse.cc b/flang/lib/parser/unparse.cc
index 39c2f73..9481e7d 100644
--- a/flang/lib/parser/unparse.cc
+++ b/flang/lib/parser/unparse.cc
@@ -1668,7 +1668,7 @@
     Word(" SCHEDULE(");
     Walk(std::get<std::optional<OmpScheduleModifier>>(x.t));
     Walk(std::get<OmpScheduleClause::ScheduleType>(x.t));
-    Walk(std::get<std::optional<ScalarIntExpr>>(x.t));
+    Walk(",", std::get<std::optional<ScalarIntExpr>>(x.t));
     Put(")");
   }
   void Unparse(const OmpAlignedClause &x) {
@@ -1693,6 +1693,18 @@
     Walk(":", x.step);
     Put(")");
   }
+  void Unparse(const OmpReductionOperator::BinaryOperator &x) {
+    switch (x) {
+    case OmpReductionOperator::BinaryOperator::Add: Put("+"); break;
+    case OmpReductionOperator::BinaryOperator::Subtract: Put("-"); break;
+    case OmpReductionOperator::BinaryOperator::Multiply: Put("*"); break;
+    case OmpReductionOperator::BinaryOperator::AND: Word(".AND."); break;
+    case OmpReductionOperator::BinaryOperator::OR: Word(".OR."); break;
+    case OmpReductionOperator::BinaryOperator::EQV: Word(".EQV."); break;
+    case OmpReductionOperator::BinaryOperator::NEQV: Word(".NEQV."); break;
+    default: break;
+    }
+  }
   void Unparse(const OmpReductionClause &x) {
     Word(" REDUCTION(");
     Walk(std::get<OmpReductionOperator>(x.t));
@@ -2081,8 +2093,6 @@
   WALK_NESTED_ENUM(OmpLinearModifier, Type)  // OMP linear-modifier
   WALK_NESTED_ENUM(
       OmpReductionOperator, ProcedureOperator)  // OMP reduction-identifier
-  WALK_NESTED_ENUM(
-      OmpReductionOperator, BinaryOperator)  // OMP reduction-identifier
   WALK_NESTED_ENUM(OmpDependenceType, Type)  // OMP dependence-type
   WALK_NESTED_ENUM(OmpMapClause, Type)  // OMP map-type
   WALK_NESTED_ENUM(OmpScheduleClause, ScheduleType)  // OMP schedule-type