]> granicus.if.org Git - clang/commitdiff
Put (argument)-expression-list parsing in a separate function so that it can be re...
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Sat, 16 Aug 2008 20:03:01 +0000 (20:03 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Sat, 16 Aug 2008 20:03:01 +0000 (20:03 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54851 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Parse/Parser.h
lib/Parse/ParseExpr.cpp

index 83ec0a7a8c2c545a187fc565feedb6bf32fef781..2a6e505d64aeb3a420d59678a49618d69ac1e929 100644 (file)
@@ -386,6 +386,12 @@ private:
   ExprResult ParsePostfixExpressionSuffix(ExprResult LHS);
   ExprResult ParseSizeofAlignofExpression();
   ExprResult ParseBuiltinPrimaryExpression();
+
+  typedef llvm::SmallVector<ExprTy*, 8> ExprListTy;
+  typedef llvm::SmallVector<SourceLocation, 8> CommaLocsTy;
+
+  /// ParseExpressionList - Used for C/C++ (argument-)expression-list.
+  bool ParseExpressionList(ExprListTy &Exprs, CommaLocsTy &CommaLocs);
   
   /// ParenParseOption - Control what ParseParenExpression will parse.
   enum ParenParseOption {
index 4b45cb73f61807c31758481c68f8eb5a4d37508c..16bd1cba04e068ffb8b9d03ee938b9a6f3a0518c 100644 (file)
@@ -607,24 +607,15 @@ Parser::ExprResult Parser::ParsePostfixExpressionSuffix(ExprResult LHS) {
     }
       
     case tok::l_paren: {   // p-e: p-e '(' argument-expression-list[opt] ')'
-      llvm::SmallVector<ExprTy*, 8> ArgExprs;
-      llvm::SmallVector<SourceLocation, 8> CommaLocs;
+      ExprListTy ArgExprs;
+      CommaLocsTy CommaLocs;
       
       Loc = ConsumeParen();
       
       if (Tok.isNot(tok::r_paren)) {
-        while (1) {
-          ExprResult ArgExpr = ParseAssignmentExpression();
-          if (ArgExpr.isInvalid) {
-            SkipUntil(tok::r_paren);
-            return ExprResult(true);
-          } else
-            ArgExprs.push_back(ArgExpr.Val);
-          
-          if (Tok.isNot(tok::comma))
-            break;
-          // Move to the next argument, remember where the comma was.
-          CommaLocs.push_back(ConsumeToken());
+        if (ParseExpressionList(ArgExprs, CommaLocs)) {
+          SkipUntil(tok::r_paren);
+          return ExprResult(true);
         }
       }
         
@@ -1010,3 +1001,28 @@ Parser::ExprResult Parser::ParseStringLiteralExpression() {
   // Pass the set of string tokens, ready for concatenation, to the actions.
   return Actions.ActOnStringLiteral(&StringToks[0], StringToks.size());
 }
+
+/// ParseExpressionList - Used for C/C++ (argument-)expression-list.
+///
+///       argument-expression-list:
+///         assignment-expression
+///         argument-expression-list , assignment-expression
+///
+/// [C++] expression-list:
+/// [C++]   assignment-expression
+/// [C++]   expression-list , assignment-expression
+///
+bool Parser::ParseExpressionList(ExprListTy &Exprs, CommaLocsTy &CommaLocs) {
+  while (1) {
+    ExprResult Expr = ParseAssignmentExpression();
+    if (Expr.isInvalid)
+      return true;
+    else
+      Exprs.push_back(Expr.Val);
+
+    if (Tok.isNot(tok::comma))
+      return false;
+    // Move to the next argument, remember where the comma was.
+    CommaLocs.push_back(ConsumeToken());
+  }
+}