[cfe-commits] r38940 - in /cfe/cfe/trunk: AST/Expr.cpp AST/Sema.cpp Parse/ParseExpr.cpp Sema/Sema.cpp clang.xcodeproj/project.pbxproj include/clang/AST/Expr.h include/clang/Parse/Action.h

sabre at cs.uiuc.edu sabre at cs.uiuc.edu
Wed Jul 11 09:26:02 PDT 2007


Author: sabre
Date: Wed Jul 11 11:26:02 2007
New Revision: 38940

URL: http://llvm.org/viewvc/llvm-project?rev=38940&view=rev
Log:
Add AST nodes and actions for paren exprs and simple unary ops.

Added:
    cfe/cfe/trunk/AST/Expr.cpp   (with props)
Modified:
    cfe/cfe/trunk/AST/Sema.cpp
    cfe/cfe/trunk/Parse/ParseExpr.cpp
    cfe/cfe/trunk/Sema/Sema.cpp
    cfe/cfe/trunk/clang.xcodeproj/project.pbxproj
    cfe/cfe/trunk/include/clang/AST/Expr.h
    cfe/cfe/trunk/include/clang/Parse/Action.h

Added: cfe/cfe/trunk/AST/Expr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/AST/Expr.cpp?rev=38940&view=auto

==============================================================================
--- cfe/cfe/trunk/AST/Expr.cpp (added)
+++ cfe/cfe/trunk/AST/Expr.cpp Wed Jul 11 11:26:02 2007
@@ -0,0 +1,121 @@
+//===--- Expr.cpp - Expression AST Node Implementation --------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file was developed by Chris Lattner and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements the Expr class and subclasses.
+//
+//===----------------------------------------------------------------------===//
+
+#include "clang/AST/Expr.h"
+#include <iostream>
+using namespace llvm;
+using namespace clang;
+
+void Expr::dump() const {
+  if (this == 0)
+    std::cerr << "<null expr>";
+  else
+    dump_impl();
+}
+
+
+void IntegerConstant::dump_impl() const {
+  std::cerr << "1";
+}
+
+void FloatingConstant::dump_impl() const {
+  std::cerr << "1.0";
+}
+
+void ParenExpr::dump_impl() const {
+  std::cerr << "'('";
+  Val->dump();
+  std::cerr << "')'";
+}
+
+/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
+/// corresponds to, e.g. "sizeof" or "[pre]++".
+const char *UnaryOperator::getOpcodeStr(Opcode Op) {
+  switch (Op) {
+  default: assert(0 && "Unknown binary operator");
+  case PostInc: return "[post]++";
+  case PostDec: return "[post]--";
+  case PreInc:  return "[pre]++";
+  case PreDec:  return "[pre]--";
+  case AddrOf:  return "&";
+  case Deref:   return "*";
+  case Plus:    return "+";
+  case Minus:   return "-";
+  case Not:     return "~";
+  case LNot:    return "!";
+  case Real:    return "__real";
+  case Imag:    return "__imag";
+  }
+}
+
+void UnaryOperator::dump_impl() const {
+  std::cerr << "(" << getOpcodeStr(Opc);
+  Input->dump();
+  std::cerr << ")";
+}
+
+/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
+/// corresponds to, e.g. "<<=".
+const char *BinaryOperator::getOpcodeStr(Opcode Op) {
+  switch (Op) {
+  default: assert(0 && "Unknown binary operator");
+  case Mul:       return "*";
+  case Div:       return "/";
+  case Rem:       return "%";
+  case Add:       return "+";
+  case Sub:       return "-";
+  case Shl:       return "<<";
+  case Shr:       return ">>";
+  case LT:        return "<";
+  case GT:        return ">";
+  case LE:        return "<=";
+  case GE:        return ">=";
+  case EQ:        return "==";
+  case NE:        return "!=";
+  case And:       return "&";
+  case Xor:       return "^";
+  case Or:        return "|";
+  case LAnd:      return "&&";
+  case LOr:       return "||";
+  case Assign:    return "=";
+  case MulAssign: return "*=";
+  case DivAssign: return "/=";
+  case RemAssign: return "%=";
+  case AddAssign: return "+=";
+  case SubAssign: return "-=";
+  case ShlAssign: return "<<=";
+  case ShrAssign: return ">>=";
+  case AndAssign: return "&=";
+  case XorAssign: return "^=";
+  case OrAssign:  return "|=";
+  case Comma:     return ",";
+  }
+}
+
+void BinaryOperator::dump_impl() const {
+  std::cerr << "(";
+  LHS->dump();
+  std::cerr << " " << getOpcodeStr(Opc) << " ";
+  RHS->dump();
+  std::cerr << ")";
+}
+
+void ConditionalOperator::dump_impl() const {
+  std::cerr << "(";
+  Cond->dump();
+  std::cerr << " ? ";
+  LHS->dump();
+  std::cerr << " : ";
+  RHS->dump();
+  std::cerr << ")";
+}

Propchange: cfe/cfe/trunk/AST/Expr.cpp

------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cfe/cfe/trunk/AST/Expr.cpp

------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: cfe/cfe/trunk/AST/Sema.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/AST/Sema.cpp?rev=38940&r1=38939&r2=38940&view=diff

==============================================================================
--- cfe/cfe/trunk/AST/Sema.cpp (original)
+++ cfe/cfe/trunk/AST/Sema.cpp Wed Jul 11 11:26:02 2007
@@ -40,10 +40,17 @@
   
   //===--------------------------------------------------------------------===//
   // Expression Parsing Callbacks.
+
+  // Primary Expressions.
   virtual ExprTy *ParseIntegerConstant(const LexerToken &Tok);
   virtual ExprTy *ParseFloatingConstant(const LexerToken &Tok);
+  virtual ExprTy *ParseParenExpr(SourceLocation L, SourceLocation R,
+                                 ExprTy *Val);
+  
+  // Binary/Unary Operators.  'Tok' is the token for the operator.
+  virtual ExprTy *ParseUnaryOp(const LexerToken &Tok, ExprTy *Input);
+  virtual ExprTy *ParsePostfixUnaryOp(const LexerToken &Tok, ExprTy *Input);
   
-  // Binary Operators.  'Tok' is the token
   virtual ExprTy *ParseBinOp(const LexerToken &Tok, ExprTy *LHS, ExprTy *RHS);
   
   /// ParseConditionalOp - Parse a ?: operation.  Note that 'LHS' may be null
@@ -106,6 +113,55 @@
   return new FloatingConstant();
 }
 
+ASTBuilder::ExprTy *ASTBuilder::ParseParenExpr(SourceLocation L, 
+                                               SourceLocation R,
+                                               ExprTy *Val) {
+  // FIXME: This is obviously just for testing.
+  ((Expr*)Val)->dump();
+  if (!FullLocInfo) return Val;
+  
+  return new ParenExpr(L, R, (Expr*)Val);
+}
+
+// Unary Operators.  'Tok' is the token for the operator.
+ASTBuilder::ExprTy *ASTBuilder::ParseUnaryOp(const LexerToken &Tok, 
+                                             ExprTy *Input) {
+  UnaryOperator::Opcode Opc;
+  switch (Tok.getKind()) {
+  default: assert(0 && "Unknown unary op!");
+  case tok::plusplus:   Opc = UnaryOperator::PreInc; break;
+  case tok::minusminus: Opc = UnaryOperator::PreDec; break;
+  case tok::amp:        Opc = UnaryOperator::AddrOf; break;
+  case tok::star:       Opc = UnaryOperator::Deref; break;
+  case tok::plus:       Opc = UnaryOperator::Plus; break;
+  case tok::minus:      Opc = UnaryOperator::Minus; break;
+  case tok::tilde:      Opc = UnaryOperator::Not; break;
+  case tok::exclaim:    Opc = UnaryOperator::LNot; break;
+  case tok::kw___real:  Opc = UnaryOperator::Real; break;
+  case tok::kw___imag:  Opc = UnaryOperator::Imag; break;
+  }
+
+  if (!FullLocInfo)
+    return new UnaryOperator((Expr*)Input, Opc);
+  else
+    return new UnaryOperatorLOC(Tok.getLocation(), (Expr*)Input, Opc);
+}
+
+ASTBuilder::ExprTy *ASTBuilder::ParsePostfixUnaryOp(const LexerToken &Tok,
+                                                    ExprTy *Input) {
+  UnaryOperator::Opcode Opc;
+  switch (Tok.getKind()) {
+  default: assert(0 && "Unknown unary op!");
+  case tok::plusplus:   Opc = UnaryOperator::PostInc; break;
+  case tok::minusminus: Opc = UnaryOperator::PostDec; break;
+  }
+  
+  if (!FullLocInfo)
+    return new UnaryOperator((Expr*)Input, Opc);
+  else
+    return new UnaryOperatorLOC(Tok.getLocation(), (Expr*)Input, Opc);
+}
+
 // Binary Operators.  'Tok' is the token for the operator.
 ASTBuilder::ExprTy *ASTBuilder::ParseBinOp(const LexerToken &Tok, ExprTy *LHS,
                                            ExprTy *RHS) {

Modified: cfe/cfe/trunk/Parse/ParseExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/Parse/ParseExpr.cpp?rev=38940&r1=38939&r2=38940&view=diff

==============================================================================
--- cfe/cfe/trunk/Parse/ParseExpr.cpp (original)
+++ cfe/cfe/trunk/Parse/ParseExpr.cpp Wed Jul 11 11:26:02 2007
@@ -416,6 +416,7 @@
 ///
 Parser::ExprResult Parser::ParseCastExpression(bool isUnaryExpression) {
   ExprResult Res;
+  LexerToken SavedTok;
   
   // This handles all of cast-expression, unary-expression, postfix-expression,
   // and primary-expression.  We handle them together like this for efficiency
@@ -491,8 +492,12 @@
     return ParseBuiltinPrimaryExpression();
   case tok::plusplus:      // unary-expression: '++' unary-expression
   case tok::minusminus:    // unary-expression: '--' unary-expression
+    SavedTok = Tok;
     ConsumeToken();
-    return ParseCastExpression(true);
+    Res = ParseCastExpression(true);
+    if (!Res.isInvalid)
+      Res = Actions.ParseUnaryOp(SavedTok, Res.Val);
+    return Res;
   case tok::amp:           // unary-expression: '&' cast-expression
   case tok::star:          // unary-expression: '*' cast-expression
   case tok::plus:          // unary-expression: '+' cast-expression
@@ -500,10 +505,14 @@
   case tok::tilde:         // unary-expression: '~' cast-expression
   case tok::exclaim:       // unary-expression: '!' cast-expression
   case tok::kw___real:     // unary-expression: '__real' cast-expression [GNU]
-  case tok::kw___imag:     // unary-expression: '__real' cast-expression [GNU]
+  case tok::kw___imag:     // unary-expression: '__imag' cast-expression [GNU]
   //case tok::kw__extension__:  [TODO]
+    SavedTok = Tok;
     ConsumeToken();
-    return ParseCastExpression(false);
+    Res = ParseCastExpression(false);
+    if (!Res.isInvalid)
+      Res = Actions.ParseUnaryOp(SavedTok, Res.Val);
+    return Res;
     
   case tok::kw_sizeof:     // unary-expression: 'sizeof' unary-expression
                            // unary-expression: 'sizeof' '(' type-name ')'
@@ -594,6 +603,8 @@
       
     case tok::plusplus:    // postfix-expression: postfix-expression '++'
     case tok::minusminus:  // postfix-expression: postfix-expression '--'
+      if (!LHS.isInvalid)
+        LHS = Actions.ParsePostfixUnaryOp(Tok, LHS.Val);
       ConsumeToken();
       break;
     }
@@ -749,6 +760,7 @@
   // considered to be strings.
   while (isTokenStringLiteral())
     ConsumeStringToken();
+  // TODO: Build AST for string literals.
   return ExprResult(false);
 }
 
@@ -777,6 +789,7 @@
     Diag(Tok, diag::ext_gnu_statement_expr);
     ParseCompoundStatement();
     ExprType = CompoundStmt;
+    // TODO: Build AST for GNU compound stmt.
   } else if (ExprType >= CompoundLiteral && isTypeSpecifierQualifier()) {
     // Otherwise, this is a compound literal expression or cast expression.
     ParseTypeName();
@@ -789,9 +802,11 @@
         Diag(OpenLoc, diag::ext_c99_compound_literal);
       Result = ParseInitializer();
       ExprType = CompoundLiteral;
+      // TODO: Build AST for compound literal.
     } else if (ExprType == CastExpr) {
       // Note that this doesn't parse the subsequence cast-expression.
       ExprType = CastExpr;
+      // TODO: Build AST for cast in caller.
     } else {
       Diag(Tok, diag::err_expected_lbrace_in_compound_literal);
       return ExprResult(true);
@@ -800,6 +815,8 @@
   } else {
     Result = ParseExpression();
     ExprType = SimpleExpr;
+    if (!Result.isInvalid && Tok.getKind() == tok::r_paren)
+      Result = Actions.ParseParenExpr(OpenLoc, Tok.getLocation(), Result.Val);
   }
   
   // Match the ')'.
@@ -807,5 +824,6 @@
     SkipUntil(tok::r_paren);
   else
     MatchRHSPunctuation(tok::r_paren, OpenLoc);
+  
   return Result;
 }

Modified: cfe/cfe/trunk/Sema/Sema.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/Sema/Sema.cpp?rev=38940&r1=38939&r2=38940&view=diff

==============================================================================
--- cfe/cfe/trunk/Sema/Sema.cpp (original)
+++ cfe/cfe/trunk/Sema/Sema.cpp Wed Jul 11 11:26:02 2007
@@ -40,10 +40,17 @@
   
   //===--------------------------------------------------------------------===//
   // Expression Parsing Callbacks.
+
+  // Primary Expressions.
   virtual ExprTy *ParseIntegerConstant(const LexerToken &Tok);
   virtual ExprTy *ParseFloatingConstant(const LexerToken &Tok);
+  virtual ExprTy *ParseParenExpr(SourceLocation L, SourceLocation R,
+                                 ExprTy *Val);
+  
+  // Binary/Unary Operators.  'Tok' is the token for the operator.
+  virtual ExprTy *ParseUnaryOp(const LexerToken &Tok, ExprTy *Input);
+  virtual ExprTy *ParsePostfixUnaryOp(const LexerToken &Tok, ExprTy *Input);
   
-  // Binary Operators.  'Tok' is the token
   virtual ExprTy *ParseBinOp(const LexerToken &Tok, ExprTy *LHS, ExprTy *RHS);
   
   /// ParseConditionalOp - Parse a ?: operation.  Note that 'LHS' may be null
@@ -106,6 +113,55 @@
   return new FloatingConstant();
 }
 
+ASTBuilder::ExprTy *ASTBuilder::ParseParenExpr(SourceLocation L, 
+                                               SourceLocation R,
+                                               ExprTy *Val) {
+  // FIXME: This is obviously just for testing.
+  ((Expr*)Val)->dump();
+  if (!FullLocInfo) return Val;
+  
+  return new ParenExpr(L, R, (Expr*)Val);
+}
+
+// Unary Operators.  'Tok' is the token for the operator.
+ASTBuilder::ExprTy *ASTBuilder::ParseUnaryOp(const LexerToken &Tok, 
+                                             ExprTy *Input) {
+  UnaryOperator::Opcode Opc;
+  switch (Tok.getKind()) {
+  default: assert(0 && "Unknown unary op!");
+  case tok::plusplus:   Opc = UnaryOperator::PreInc; break;
+  case tok::minusminus: Opc = UnaryOperator::PreDec; break;
+  case tok::amp:        Opc = UnaryOperator::AddrOf; break;
+  case tok::star:       Opc = UnaryOperator::Deref; break;
+  case tok::plus:       Opc = UnaryOperator::Plus; break;
+  case tok::minus:      Opc = UnaryOperator::Minus; break;
+  case tok::tilde:      Opc = UnaryOperator::Not; break;
+  case tok::exclaim:    Opc = UnaryOperator::LNot; break;
+  case tok::kw___real:  Opc = UnaryOperator::Real; break;
+  case tok::kw___imag:  Opc = UnaryOperator::Imag; break;
+  }
+
+  if (!FullLocInfo)
+    return new UnaryOperator((Expr*)Input, Opc);
+  else
+    return new UnaryOperatorLOC(Tok.getLocation(), (Expr*)Input, Opc);
+}
+
+ASTBuilder::ExprTy *ASTBuilder::ParsePostfixUnaryOp(const LexerToken &Tok,
+                                                    ExprTy *Input) {
+  UnaryOperator::Opcode Opc;
+  switch (Tok.getKind()) {
+  default: assert(0 && "Unknown unary op!");
+  case tok::plusplus:   Opc = UnaryOperator::PostInc; break;
+  case tok::minusminus: Opc = UnaryOperator::PostDec; break;
+  }
+  
+  if (!FullLocInfo)
+    return new UnaryOperator((Expr*)Input, Opc);
+  else
+    return new UnaryOperatorLOC(Tok.getLocation(), (Expr*)Input, Opc);
+}
+
 // Binary Operators.  'Tok' is the token for the operator.
 ASTBuilder::ExprTy *ASTBuilder::ParseBinOp(const LexerToken &Tok, ExprTy *LHS,
                                            ExprTy *RHS) {

Modified: cfe/cfe/trunk/clang.xcodeproj/project.pbxproj
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/clang.xcodeproj/project.pbxproj?rev=38940&r1=38939&r2=38940&view=diff

==============================================================================
--- cfe/cfe/trunk/clang.xcodeproj/project.pbxproj (original)
+++ cfe/cfe/trunk/clang.xcodeproj/project.pbxproj Wed Jul 11 11:26:02 2007
@@ -19,6 +19,7 @@
 		DE06E8140A8FF9330050E87E /* Action.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DE06E8130A8FF9330050E87E /* Action.h */; };
 		DE0FCA210A95710600248FD5 /* EmptyAction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DE0FCA200A95710600248FD5 /* EmptyAction.cpp */; };
 		DE0FCA630A95859D00248FD5 /* Expr.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DE0FCA620A95859D00248FD5 /* Expr.h */; };
+		DE0FCB340A9C21F100248FD5 /* Expr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DE0FCB330A9C21F100248FD5 /* Expr.cpp */; };
 		DE1F22030A7D852A00FBF588 /* Parser.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DE1F22020A7D852A00FBF588 /* Parser.h */; };
 		DE1F24820A7DCD3800FBF588 /* Declarations.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DE1F24810A7DCD3800FBF588 /* Declarations.h */; };
 		DEAEE98B0A5A2B970045101B /* MultipleIncludeOpt.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DEAEE98A0A5A2B970045101B /* MultipleIncludeOpt.h */; };
@@ -119,6 +120,7 @@
 		DE06E8130A8FF9330050E87E /* Action.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = Action.h; path = clang/Parse/Action.h; sourceTree = "<group>"; };
 		DE0FCA200A95710600248FD5 /* EmptyAction.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = EmptyAction.cpp; path = Parse/EmptyAction.cpp; sourceTree = "<group>"; };
 		DE0FCA620A95859D00248FD5 /* Expr.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = Expr.h; path = clang/AST/Expr.h; sourceTree = "<group>"; };
+		DE0FCB330A9C21F100248FD5 /* Expr.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Expr.cpp; path = AST/Expr.cpp; sourceTree = "<group>"; };
 		DE1F22020A7D852A00FBF588 /* Parser.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = Parser.h; path = clang/Parse/Parser.h; sourceTree = "<group>"; };
 		DE1F24810A7DCD3800FBF588 /* Declarations.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = Declarations.h; path = clang/Parse/Declarations.h; sourceTree = "<group>"; };
 		DEAEE98A0A5A2B970045101B /* MultipleIncludeOpt.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MultipleIncludeOpt.h; sourceTree = "<group>"; };
@@ -268,6 +270,7 @@
 			children = (
 				DEC8DAAC0A94400300353FCA /* ASTStreamer.cpp */,
 				DEC8D9B50A9434FA00353FCA /* Builder.cpp */,
+				DE0FCB330A9C21F100248FD5 /* Expr.cpp */,
 			);
 			name = AST;
 			sourceTree = "<group>";
@@ -411,6 +414,7 @@
 				DEC8DA1E0A94388B00353FCA /* PrintParserCallbacks.cpp in Sources */,
 				DEC8DAAD0A94400300353FCA /* ASTStreamer.cpp in Sources */,
 				DE0FCA210A95710600248FD5 /* EmptyAction.cpp in Sources */,
+				DE0FCB340A9C21F100248FD5 /* Expr.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

Modified: cfe/cfe/trunk/include/clang/AST/Expr.h
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/include/clang/AST/Expr.h?rev=38940&r1=38939&r2=38940&view=diff

==============================================================================
--- cfe/cfe/trunk/include/clang/AST/Expr.h (original)
+++ cfe/cfe/trunk/include/clang/AST/Expr.h Wed Jul 11 11:26:02 2007
@@ -26,16 +26,75 @@
 public:
   Expr() {}
   virtual ~Expr() {}
+  
+  // FIXME: Change to non-virtual method that uses visitor pattern to do this.
+  void dump() const;
+  
+private:
+  virtual void dump_impl() const = 0;
 };
 
+//===----------------------------------------------------------------------===//
+// Primary Expressions.
+//===----------------------------------------------------------------------===//
+
 class IntegerConstant : public Expr {
 public:
   IntegerConstant() {}
+  virtual void dump_impl() const;
 };
 
 class FloatingConstant : public Expr {
 public:
   FloatingConstant() {}
+  virtual void dump_impl() const;
+};
+
+/// ParenExpr - This represents a parethesized expression, e.g. "(1)".  This
+/// AST node is only formed if full location information is requested.
+class ParenExpr : public Expr {
+  SourceLocation L, R;
+  Expr *Val;
+public:
+  ParenExpr(SourceLocation l, SourceLocation r, Expr *val)
+    : L(l), R(r), Val(val) {}
+  virtual void dump_impl() const;
+};
+
+
+/// UnaryOperator - This represents the unary-expression's (except sizeof), the
+/// postinc/postdec operators from postfix-expression, and various extensions.
+class UnaryOperator : public Expr {
+public:
+  enum Opcode {
+    PostInc, PostDec, // [C99 6.5.2.4] Postfix increment and decrement operators
+    PreInc, PreDec,   // [C99 6.5.3.1] Prefix increment and decrement operators.
+    AddrOf, Deref,    // [C99 6.5.3.2] Address and indirection operators.
+    Plus, Minus,      // [C99 6.5.3.3] Unary arithmetic operators.
+    Not, LNot,        // [C99 6.5.3.3] Unary arithmetic operators.
+    Real, Imag        // "__real expr"/"__imag expr" Extension.
+  };
+
+  UnaryOperator(Expr *input, Opcode opc)
+    : Input(input), Opc(opc) {}
+  
+  /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
+  /// corresponds to, e.g. "sizeof" or "[pre]++"
+  static const char *getOpcodeStr(Opcode Op);
+  
+  virtual void dump_impl() const;
+  
+private:
+  Expr *Input;
+  Opcode Opc;
+};
+
+class UnaryOperatorLOC : public UnaryOperator {
+  SourceLocation Loc;
+public:
+  UnaryOperatorLOC(SourceLocation loc, Expr *Input, Opcode Opc)
+   : UnaryOperator(Input, Opc), Loc(loc) {}
+
 };
 
 class BinaryOperator : public Expr {
@@ -64,6 +123,12 @@
   BinaryOperator(Expr *lhs, Expr *rhs, Opcode opc)
     : LHS(lhs), RHS(rhs), Opc(opc) {}
 
+  /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
+  /// corresponds to, e.g. "<<=".
+  static const char *getOpcodeStr(Opcode Op);
+  
+  virtual void dump_impl() const;
+
 private:
   Expr *LHS, *RHS;
   Opcode Opc;
@@ -85,6 +150,7 @@
 public:
   ConditionalOperator(Expr *cond, Expr *lhs, Expr *rhs)
     : Cond(cond), LHS(lhs), RHS(rhs) {}
+  virtual void dump_impl() const;
 };
 
 /// ConditionalOperatorLOC - ConditionalOperator with full location info.

Modified: cfe/cfe/trunk/include/clang/Parse/Action.h
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/include/clang/Parse/Action.h?rev=38940&r1=38939&r2=38940&view=diff

==============================================================================
--- cfe/cfe/trunk/include/clang/Parse/Action.h (original)
+++ cfe/cfe/trunk/include/clang/Parse/Action.h Wed Jul 11 11:26:02 2007
@@ -73,8 +73,19 @@
   // Primary Expressions.
   virtual ExprTy *ParseIntegerConstant(const LexerToken &Tok) { return 0; }
   virtual ExprTy *ParseFloatingConstant(const LexerToken &Tok) { return 0; }
-  
-  // Binary Operators.  'Tok' is the token
+
+  virtual ExprTy *ParseParenExpr(SourceLocation L, SourceLocation R,
+                                 ExprTy *Val) {
+    return Val;
+  }
+
+  // Binary/Unary Operators.  'Tok' is the token for the operator.
+  virtual ExprTy *ParseUnaryOp(const LexerToken &Tok, ExprTy *Input) {
+    return 0;
+  }
+  virtual ExprTy *ParsePostfixUnaryOp(const LexerToken &Tok, ExprTy *Input) {
+    return 0;
+  }
   virtual ExprTy *ParseBinOp(const LexerToken &Tok, ExprTy *LHS, ExprTy *RHS) {
     return 0;
   }





More information about the cfe-commits mailing list