[formcalc] Minor parser cleanups

This CL makes minor clarity cleanups to the formcalc parser and attempts
to record the productions each method is processing.

Change-Id: Ie12bb55647abf06251d1734fd05d08a964a32ebc
Reviewed-on: https://pdfium-review.googlesource.com/27550
Reviewed-by: Ryan Harrison <rharrison@chromium.org>
Commit-Queue: dsinclair <dsinclair@chromium.org>
diff --git a/xfa/fxfa/fm2js/cxfa_fmparser.cpp b/xfa/fxfa/fm2js/cxfa_fmparser.cpp
index b67f94f..ccd107b 100644
--- a/xfa/fxfa/fm2js/cxfa_fmparser.cpp
+++ b/xfa/fxfa/fm2js/cxfa_fmparser.cpp
@@ -89,15 +89,17 @@
   return expressions;
 }
 
+// Func := 'func' Identifier '(' ParameterList ')' do ExpressionList 'endfunc'
+// ParamterList := (Not actually defined in the grammar) .....
+//                 (Identifier (',' Identifier)*)?
 std::unique_ptr<CXFA_FMExpression> CXFA_FMParser::ParseFunction() {
   AutoRestorer<unsigned long> restorer(&m_parse_depth);
   if (HasError() || !IncrementParseDepthAndCheck())
     return nullptr;
 
   WideStringView ident;
-  std::vector<WideStringView> arguments;
   std::vector<std::unique_ptr<CXFA_FMExpression>> expressions;
-  if (!NextToken())
+  if (!CheckThenNext(TOKfunc))
     return nullptr;
   if (m_token.m_type != TOKidentifier) {
     m_error = true;
@@ -109,6 +111,8 @@
   }
   if (!CheckThenNext(TOKlparen))
     return nullptr;
+
+  std::vector<WideStringView> arguments;
   if (m_token.m_type == TOKrparen) {
     if (!NextToken())
       return nullptr;
@@ -126,16 +130,13 @@
           return nullptr;
         continue;
       }
-      if (m_token.m_type == TOKrparen) {
-        if (!NextToken())
-          return nullptr;
-      } else {
-        if (!CheckThenNext(TOKrparen))
-          return nullptr;
-      }
+      if (!CheckThenNext(TOKrparen))
+        return nullptr;
+
       break;
     }
   }
+
   if (!CheckThenNext(TOKdo))
     return nullptr;
   if (m_token.m_type == TOKendfunc) {
@@ -151,6 +152,9 @@
       false, ident, std::move(arguments), std::move(expressions));
 }
 
+// Expression := IfExpression | WhileExpression | ForExpression |
+//               ForEachExpression | AssignmentExpression |
+//               DeclarationExpression | SimpleExpression
 std::unique_ptr<CXFA_FMExpression> CXFA_FMParser::ParseExpression() {
   AutoRestorer<unsigned long> restorer(&m_parse_depth);
   if (HasError() || !IncrementParseDepthAndCheck())
@@ -203,6 +207,9 @@
   return expr;
 }
 
+// Declaration := 'var' Variable | 'var' Variable '=' SimpleExpression |
+//           'Func' Identifier '(' ParameterList ')' do ExpressionList 'EndFunc'
+// TODO(dsinclair): We appear to be handling the 'func' case elsewhere.
 std::unique_ptr<CXFA_FMExpression> CXFA_FMParser::ParseDeclarationExpression() {
   AutoRestorer<unsigned long> restorer(&m_parse_depth);
   if (HasError() || !IncrementParseDepthAndCheck())
@@ -233,6 +240,7 @@
   return pdfium::MakeUnique<CXFA_FMVarExpression>(ident, std::move(expr));
 }
 
+// SimpleExpression := LogicalOrExpression
 std::unique_ptr<CXFA_FMSimpleExpression>
 CXFA_FMParser::ParseSimpleExpression() {
   if (HasError())
@@ -241,6 +249,7 @@
   return ParseLogicalOrExpression();
 }
 
+// Exp := SimpleExpression ( '=' SimpleExpression )?
 std::unique_ptr<CXFA_FMExpression> CXFA_FMParser::ParseExpExpression() {
   AutoRestorer<unsigned long> restorer(&m_parse_depth);
   if (HasError() || !IncrementParseDepthAndCheck())
@@ -264,6 +273,8 @@
   return pdfium::MakeUnique<CXFA_FMExpExpression>(std::move(pExp1));
 }
 
+// LogicalOr := LogicalAndExpression |
+//              LogicalOrExpression LogicalOrOperator LogicalAndExpression
 std::unique_ptr<CXFA_FMSimpleExpression>
 CXFA_FMParser::ParseLogicalOrExpression() {
   AutoRestorer<unsigned long> restorer(&m_parse_depth);
@@ -274,6 +285,7 @@
   if (!e1)
     return nullptr;
 
+  // TODO(dsinclair): Is this for() needed?
   for (;;) {
     switch (m_token.m_type) {
       case TOKor:
@@ -298,6 +310,8 @@
   return e1;
 }
 
+// LogicalAnd := EqualityExpression |
+//               LogicalAndExpression LogicalAndOperator EqualityExpression
 std::unique_ptr<CXFA_FMSimpleExpression>
 CXFA_FMParser::ParseLogicalAndExpression() {
   AutoRestorer<unsigned long> restorer(&m_parse_depth);
@@ -308,6 +322,7 @@
   if (!e1)
     return nullptr;
 
+  // TODO(dsinclair): Is this for() needed?
   for (;;) {
     switch (m_token.m_type) {
       case TOKand:
@@ -331,6 +346,8 @@
   return e1;
 }
 
+// Equality := RelationExpression |
+//             EqualityExpression EqulaityOperator RelationalExpression
 std::unique_ptr<CXFA_FMSimpleExpression>
 CXFA_FMParser::ParseEqualityExpression() {
   AutoRestorer<unsigned long> restorer(&m_parse_depth);
@@ -340,6 +357,8 @@
   std::unique_ptr<CXFA_FMSimpleExpression> e1 = ParseRelationalExpression();
   if (!e1)
     return nullptr;
+
+  // TODO(dsinclair): Is this for() needed?
   for (;;) {
     std::unique_ptr<CXFA_FMSimpleExpression> e2;
     switch (m_token.m_type) {
@@ -375,6 +394,8 @@
   return e1;
 }
 
+// Relational := AdditiveExpression |
+//               RelationalExpression RelationalOperator AdditiveExpression
 std::unique_ptr<CXFA_FMSimpleExpression>
 CXFA_FMParser::ParseRelationalExpression() {
   AutoRestorer<unsigned long> restorer(&m_parse_depth);
@@ -385,6 +406,7 @@
   if (!e1)
     return nullptr;
 
+  // TODO(dsinclair): Is this for() needed?
   for (;;) {
     std::unique_ptr<CXFA_FMSimpleExpression> e2;
     switch (m_token.m_type) {
@@ -444,6 +466,8 @@
   return e1;
 }
 
+// Additive := MultiplicativeExpression |
+//             AdditiveExpression AdditiveOperator MultiplicativeExpression
 std::unique_ptr<CXFA_FMSimpleExpression>
 CXFA_FMParser::ParseAddtiveExpression() {
   AutoRestorer<unsigned long> restorer(&m_parse_depth);
@@ -454,6 +478,7 @@
   if (!e1)
     return nullptr;
 
+  // TODO(dsinclair): Is this for() needed?
   for (;;) {
     std::unique_ptr<CXFA_FMSimpleExpression> e2;
     switch (m_token.m_type) {
@@ -487,6 +512,8 @@
   return e1;
 }
 
+// Multiplicative := UnaryExpression |
+//                 MultiplicateExpression MultiplicativeOperator UnaryExpression
 std::unique_ptr<CXFA_FMSimpleExpression>
 CXFA_FMParser::ParseMultiplicativeExpression() {
   AutoRestorer<unsigned long> restorer(&m_parse_depth);
@@ -497,6 +524,7 @@
   if (!e1)
     return nullptr;
 
+  // TODO(dsinclair): Is this for() needed?
   for (;;) {
     std::unique_ptr<CXFA_FMSimpleExpression> e2;
     switch (m_token.m_type) {
@@ -530,6 +558,7 @@
   return e1;
 }
 
+// Unary := PrimaryExpression | UnaryOperator UnaryExpression
 std::unique_ptr<CXFA_FMSimpleExpression> CXFA_FMParser::ParseUnaryExpression() {
   AutoRestorer<unsigned long> restorer(&m_parse_depth);
   if (HasError() || !IncrementParseDepthAndCheck())
@@ -576,6 +605,8 @@
   return expr;
 }
 
+// Primary := Literal | FunctionCall | Accessor ('.*' )? |
+//           '(' SimpleExpression ')'
 std::unique_ptr<CXFA_FMSimpleExpression>
 CXFA_FMParser::ParsePrimaryExpression() {
   AutoRestorer<unsigned long> restorer(&m_parse_depth);
@@ -636,6 +667,8 @@
   }
 }
 
+// TODO(dsinclair): Make this match up to the grammar
+// I believe this is parsing the accessor ( '.' | '..' | '.#' )
 std::unique_ptr<CXFA_FMSimpleExpression> CXFA_FMParser::ParsePostExpression(
     std::unique_ptr<CXFA_FMSimpleExpression> expr) {
   AutoRestorer<unsigned long> restorer(&m_parse_depth);
@@ -833,27 +866,30 @@
   return expr;
 }
 
+// Index := '[' ('*' | '+' SimpleExpression | '-' SimpleExpression) ']'
 std::unique_ptr<CXFA_FMSimpleExpression> CXFA_FMParser::ParseIndexExpression() {
   AutoRestorer<unsigned long> restorer(&m_parse_depth);
   if (HasError() || !IncrementParseDepthAndCheck())
     return nullptr;
-  if (!NextToken())
+  if (!CheckThenNext(TOKlbracket))
     return nullptr;
 
-  std::unique_ptr<CXFA_FMSimpleExpression> s;
-  XFA_FM_AccessorIndex accessorIndex = ACCESSOR_NO_RELATIVEINDEX;
-  std::unique_ptr<CXFA_FMSimpleExpression> pExp;
   if (m_token.m_type == TOKmul) {
-    pExp = pdfium::MakeUnique<CXFA_FMIndexExpression>(accessorIndex,
-                                                      std::move(s), true);
+    auto pExp = pdfium::MakeUnique<CXFA_FMIndexExpression>(
+        ACCESSOR_NO_RELATIVEINDEX, nullptr, true);
     if (!pExp || !NextToken())
       return nullptr;
+
+    // TODO(dsinclair): This should CheckThenNext(TOKrbracket) but need to clean
+    // up the callsites.
     if (m_token.m_type != TOKrbracket) {
       m_error = true;
       return nullptr;
     }
     return pExp;
   }
+
+  XFA_FM_AccessorIndex accessorIndex = ACCESSOR_NO_RELATIVEINDEX;
   if (m_token.m_type == TOKplus) {
     accessorIndex = ACCESSOR_POSITIVE_INDEX;
     if (!NextToken())
@@ -863,7 +899,8 @@
     if (!NextToken())
       return nullptr;
   }
-  s = ParseSimpleExpression();
+
+  std::unique_ptr<CXFA_FMSimpleExpression> s = ParseSimpleExpression();
   if (!s)
     return nullptr;
   if (m_token.m_type != TOKrbracket) {
@@ -874,6 +911,7 @@
                                                     false);
 }
 
+// Paren := '(' SimpleExpression ')'
 std::unique_ptr<CXFA_FMSimpleExpression> CXFA_FMParser::ParseParenExpression() {
   AutoRestorer<unsigned long> restorer(&m_parse_depth);
   if (HasError() || !IncrementParseDepthAndCheck())
@@ -896,26 +934,20 @@
   return pExp1;
 }
 
+// If := 'if' '(' SimpleExpression ')' 'then' ExpressionList
+//       ('elseif' '(' SimpleExpression ')' 'then' ExpressionList)*
+//       ('else' ExpressionList)?
+//       'endif'
 std::unique_ptr<CXFA_FMExpression> CXFA_FMParser::ParseIfExpression() {
   AutoRestorer<unsigned long> restorer(&m_parse_depth);
   if (HasError() || !IncrementParseDepthAndCheck())
     return nullptr;
-  if (!NextToken() || !CheckThenNext(TOKlparen))
+
+  // This should be CheckThenNext(TOKif) but we come in here for elseif as well.
+  if (!NextToken())
     return nullptr;
 
-  std::unique_ptr<CXFA_FMSimpleExpression> pExpression;
-  while (m_token.m_type != TOKrparen) {
-    pExpression = ParseSimpleExpression();
-    if (!pExpression)
-      return nullptr;
-    if (m_token.m_type != TOKcomma)
-      break;
-    if (!NextToken())
-      return nullptr;
-  }
-  if (!CheckThenNext(TOKrparen))
-    return nullptr;
-
+  std::unique_ptr<CXFA_FMSimpleExpression> pExpression = ParseParenExpression();
   if (m_token.m_type != TOKthen) {
     m_error = true;
     return nullptr;
@@ -980,11 +1012,12 @@
                                                  std::move(pElseExpression));
 }
 
+// While := 'while' '(' SimpleExpression ')' 'do' ExpressionList 'endwhile'
 std::unique_ptr<CXFA_FMExpression> CXFA_FMParser::ParseWhileExpression() {
   AutoRestorer<unsigned long> restorer(&m_parse_depth);
   if (HasError() || !IncrementParseDepthAndCheck())
     return nullptr;
-  if (!NextToken())
+  if (!CheckThenNext(TOKwhile))
     return nullptr;
 
   std::unique_ptr<CXFA_FMSimpleExpression> pCondition = ParseParenExpression();
@@ -1000,39 +1033,25 @@
       std::move(pCondition),
       pdfium::MakeUnique<CXFA_FMBlockExpression>(std::move(exprs)));
 }
-
-std::unique_ptr<CXFA_FMSimpleExpression>
-CXFA_FMParser::ParseSubassignmentInForExpression() {
-  AutoRestorer<unsigned long> restorer(&m_parse_depth);
-  if (HasError() || !IncrementParseDepthAndCheck())
-    return nullptr;
-
-  if (m_token.m_type != TOKidentifier) {
-    m_error = true;
-    return nullptr;
-  }
-  std::unique_ptr<CXFA_FMSimpleExpression> expr = ParseSimpleExpression();
-  if (!expr)
-    return nullptr;
-  return expr;
-}
-
+// For := 'for' Assignment 'upto' Accessor ('step' SimpleExpression)?
+//            'do' ExpressionList 'endfor' |
+//         'for' Assignment 'downto' Accessor ('step' SimpleExpression)?
+//            'do' ExpressionList 'endfor'
 std::unique_ptr<CXFA_FMExpression> CXFA_FMParser::ParseForExpression() {
   AutoRestorer<unsigned long> restorer(&m_parse_depth);
   if (HasError() || !IncrementParseDepthAndCheck())
     return nullptr;
-
-  WideStringView wsVariant;
-  if (!NextToken())
+  if (!CheckThenNext(TOKfor))
     return nullptr;
+
   if (m_token.m_type != TOKidentifier) {
     m_error = true;
     return nullptr;
   }
-
-  wsVariant = m_token.m_string;
+  WideStringView wsVariant = m_token.m_string;
   if (!NextToken())
     return nullptr;
+
   if (m_token.m_type != TOKassign) {
     m_error = true;
     return nullptr;
@@ -1094,7 +1113,7 @@
   AutoRestorer<unsigned long> restorer(&m_parse_depth);
   if (HasError() || !IncrementParseDepthAndCheck())
     return nullptr;
-  if (!NextToken())
+  if (!CheckThenNext(TOKforeach))
     return nullptr;
 
   if (m_token.m_type != TOKidentifier) {
@@ -1145,7 +1164,7 @@
   AutoRestorer<unsigned long> restorer(&m_parse_depth);
   if (HasError() || !IncrementParseDepthAndCheck())
     return nullptr;
-  if (!NextToken())
+  if (!CheckThenNext(TOKdo))
     return nullptr;
 
   auto exprs = ParseExpressionList();
diff --git a/xfa/fxfa/fm2js/cxfa_fmparser.h b/xfa/fxfa/fm2js/cxfa_fmparser.h
index 9aff8d7..103667d 100644
--- a/xfa/fxfa/fm2js/cxfa_fmparser.h
+++ b/xfa/fxfa/fm2js/cxfa_fmparser.h
@@ -42,7 +42,6 @@
   std::unique_ptr<CXFA_FMExpression> ParseDoExpression();
   std::unique_ptr<CXFA_FMSimpleExpression> ParseParenExpression();
   std::unique_ptr<CXFA_FMSimpleExpression> ParseSimpleExpression();
-  std::unique_ptr<CXFA_FMSimpleExpression> ParseSubassignmentInForExpression();
   std::unique_ptr<CXFA_FMSimpleExpression> ParseLogicalOrExpression();
   std::unique_ptr<CXFA_FMSimpleExpression> ParseLogicalAndExpression();
   std::unique_ptr<CXFA_FMSimpleExpression> ParseEqualityExpression();