Parser.h revision 0ccb27ded12fd03eb6818a880f50901bb70254fe
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- Parser.h - C Language Parser ---------------------------*- C++ -*-===//
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//                     The LLVM Compiler Infrastructure
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
55f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// This file was developed by Chris Lattner and is distributed under
65f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// the University of Illinois Open Source License. See LICENSE.TXT for details.
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//  This file defines the Parser interface.
115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#ifndef LLVM_CLANG_PARSE_PARSER_H
155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define LLVM_CLANG_PARSE_PARSER_H
165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Lex/Preprocessor.h"
185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Parse/Action.h"
195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace clang {
215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class DeclSpec;
225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class Declarator;
235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class AttributeList;
245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class Scope;
255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// Parser - This implements a parser for the C family of languages.  After
275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// parsing units of the grammar, productions are invoked to handle whatever has
285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// been read.
295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass Parser {
315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Preprocessor &PP;
325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// Tok - The current token we are peeking head.  All parsing methods assume
345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// that this is valid.
35d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner  Token Tok;
365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  unsigned short ParenCount, BracketCount, BraceCount;
385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// Actions - These are the callbacks we invoke as we parse various constructs
405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// in the file.  This refers to the common base class between MinimalActions
415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// and SemaActions for those uses that don't matter.
425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Action &Actions;
435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Scope *CurScope;
455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Diagnostic &Diags;
469e344c65b1e8b83e1d3ada507cf653526ff2c005Chris Lattner
479e344c65b1e8b83e1d3ada507cf653526ff2c005Chris Lattner  /// ScopeCache - Cache scopes to reduce malloc traffic.
489e344c65b1e8b83e1d3ada507cf653526ff2c005Chris Lattner  enum { ScopeCacheSize = 16 };
499e344c65b1e8b83e1d3ada507cf653526ff2c005Chris Lattner  unsigned NumCachedScopes;
509e344c65b1e8b83e1d3ada507cf653526ff2c005Chris Lattner  Scope *ScopeCache[ScopeCacheSize];
515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Parser(Preprocessor &PP, Action &Actions);
535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ~Parser();
545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const LangOptions &getLang() const { return PP.getLangOptions(); }
565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  TargetInfo &getTargetInfo() const { return PP.getTargetInfo(); }
575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Action &getActions() const { return Actions; }
585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Type forwarding.  All of these are statically 'void*', but they may all be
605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // different actual classes based on the actions in place.
615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  typedef Action::ExprTy ExprTy;
625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  typedef Action::StmtTy StmtTy;
635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  typedef Action::DeclTy DeclTy;
645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  typedef Action::TypeTy TypeTy;
655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Parsing methods.
675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// ParseTranslationUnit - All in one method that initializes parses, and
695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// shuts down the parser.
705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseTranslationUnit();
715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// Initialize - Warm up the parser.
735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void Initialize();
755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// ParseTopLevelDecl - Parse one top-level declaration, return whatever the
775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// action tells us to.  This returns true if the EOF was encountered.
785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool ParseTopLevelDecl(DeclTy*& Result);
795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// Finalize - Shut down the parser.
815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void Finalize();
835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerprivate:
855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Low-Level token peeking and consumption methods.
875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //
885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// isTokenParen - Return true if the cur token is '(' or ')'.
905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool isTokenParen() const {
915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return Tok.getKind() == tok::l_paren || Tok.getKind() == tok::r_paren;
925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// isTokenBracket - Return true if the cur token is '[' or ']'.
945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool isTokenBracket() const {
955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return Tok.getKind() == tok::l_square || Tok.getKind() == tok::r_square;
965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// isTokenBrace - Return true if the cur token is '{' or '}'.
985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool isTokenBrace() const {
995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return Tok.getKind() == tok::l_brace || Tok.getKind() == tok::r_brace;
1005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// isTokenStringLiteral - True if this token is a string-literal.
1035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
1045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool isTokenStringLiteral() const {
1055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return Tok.getKind() == tok::string_literal ||
1065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           Tok.getKind() == tok::wide_string_literal;
1075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// ConsumeToken - Consume the current 'peek token' and lex the next one.
1105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// This does not work will all kinds of tokens: strings and specific other
1115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// tokens must be consumed with custom methods below.  This returns the
1125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// location of the consumed token.
1135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation ConsumeToken() {
1145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    assert(!isTokenStringLiteral() && !isTokenParen() && !isTokenBracket() &&
1155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           !isTokenBrace() &&
1165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           "Should consume special tokens with Consume*Token");
1175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    SourceLocation L = Tok.getLocation();
1185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PP.Lex(Tok);
1195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return L;
1205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// ConsumeAnyToken - Dispatch to the right Consume* method based on the
1235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// current token type.  This should only be used in cases where the type of
1245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// the token really isn't known, e.g. in error recovery.
1255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation ConsumeAnyToken() {
1265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (isTokenParen())
1275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return ConsumeParen();
1285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    else if (isTokenBracket())
1295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return ConsumeBracket();
1305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    else if (isTokenBrace())
1315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return ConsumeBrace();
1325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    else
1335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return ConsumeToken();
1345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// ConsumeParen - This consume method keeps the paren count up-to-date.
1375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
1385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation ConsumeParen() {
1395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    assert(isTokenParen() && "wrong consume method");
1405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (Tok.getKind() == tok::l_paren)
1415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      ++ParenCount;
1425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    else if (ParenCount)
1435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      --ParenCount;       // Don't let unbalanced )'s drive the count negative.
1445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    SourceLocation L = Tok.getLocation();
1455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PP.Lex(Tok);
1465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return L;
1475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// ConsumeBracket - This consume method keeps the bracket count up-to-date.
1505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
1515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation ConsumeBracket() {
1525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    assert(isTokenBracket() && "wrong consume method");
1535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (Tok.getKind() == tok::l_square)
1545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      ++BracketCount;
1555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    else if (BracketCount)
1565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      --BracketCount;     // Don't let unbalanced ]'s drive the count negative.
1575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    SourceLocation L = Tok.getLocation();
1595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PP.Lex(Tok);
1605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return L;
1615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// ConsumeBrace - This consume method keeps the brace count up-to-date.
1645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
1655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation ConsumeBrace() {
1665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    assert(isTokenBrace() && "wrong consume method");
1675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (Tok.getKind() == tok::l_brace)
1685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      ++BraceCount;
1695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    else if (BraceCount)
1705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      --BraceCount;     // Don't let unbalanced }'s drive the count negative.
1715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    SourceLocation L = Tok.getLocation();
1735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PP.Lex(Tok);
1745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return L;
1755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// ConsumeStringToken - Consume the current 'peek token', lexing a new one
1785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// and returning the token kind.  This method is specific to strings, as it
1795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// handles string literal concatenation, as per C99 5.1.1.2, translation
1805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// phase #6.
1815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation ConsumeStringToken() {
1825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    assert(isTokenStringLiteral() &&
1835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           "Should only consume string literals with this method");
1845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    SourceLocation L = Tok.getLocation();
1855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PP.Lex(Tok);
1865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return L;
1875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// MatchRHSPunctuation - For punctuation with a LHS and RHS (e.g. '['/']'),
1905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// this helper function matches and consumes the specified RHS token if
1915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// present.  If not present, it emits the specified diagnostic indicating
1925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// that the parser failed to match the RHS of the token at LHSLoc.  LHSName
1935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// should be the name of the unmatched LHS token.  This returns the location
1945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// of the consumed token.
1955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation MatchRHSPunctuation(tok::TokenKind RHSTok,
1965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                                     SourceLocation LHSLoc);
1975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// ExpectAndConsume - The parser expects that 'ExpectedTok' is next in the
1995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// input.  If so, it is consumed and false is returned.
2005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
2015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// If the input is malformed, this emits the specified diagnostic.  Next, if
2025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// SkipToTok is specified, it calls SkipUntil(SkipToTok).  Finally, true is
2035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// returned.
2045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool ExpectAndConsume(tok::TokenKind ExpectedTok, unsigned Diag,
2055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                        const char *DiagMsg = "",
2065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                        tok::TokenKind SkipToTok = tok::unknown);
2075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
2095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Scope manipulation
2105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// EnterScope - Start a new scope.
2125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void EnterScope(unsigned ScopeFlags);
2135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// ExitScope - Pop a scope off the scope stack.
2155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ExitScope();
2165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
2185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Diagnostic Emission and Error recovery.
2195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void Diag(SourceLocation Loc, unsigned DiagID,
2215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer            const std::string &Msg = std::string());
222d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner  void Diag(const Token &Tok, unsigned DiagID,
2235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer            const std::string &M = std::string()) {
2245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Diag(Tok.getLocation(), DiagID, M);
2255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// SkipUntil - Read tokens until we get to the specified token, then consume
22882c7e6d8215567935d3d52741ccca9876a8ea461Steve Naroff  /// it (unless DontConsume is true).  Because we cannot guarantee that the
2295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// token will ever occur, this skips to the next token, or to some likely
2305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// good stopping point.  If StopAtSemi is true, skipping will stop at a ';'
2315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// character.
2325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
2335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// If SkipUntil finds the specified token, it returns true, otherwise it
2345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// returns false.
2355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool SkipUntil(tok::TokenKind T, bool StopAtSemi = true,
2365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                 bool DontConsume = false) {
2375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return SkipUntil(&T, 1, StopAtSemi, DontConsume);
2385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool SkipUntil(tok::TokenKind T1, tok::TokenKind T2, bool StopAtSemi = true,
2405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                 bool DontConsume = false) {
2415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    tok::TokenKind TokArray[] = {T1, T2};
2425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return SkipUntil(TokArray, 2, StopAtSemi, DontConsume);
2435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool SkipUntil(const tok::TokenKind *Toks, unsigned NumToks,
2455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                 bool StopAtSemi = true, bool DontConsume = false);
2465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
2485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.9: External Definitions.
2495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  DeclTy *ParseExternalDeclaration();
2505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  DeclTy *ParseDeclarationOrFunctionDefinition();
2515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  DeclTy *ParseFunctionDefinition(Declarator &D);
2525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseKNRParamDeclarations(Declarator &D);
2535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseSimpleAsm();
2545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseAsmStringLiteral();
2555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Objective-C External Declarations
257dac269b65eed82182fc3e96566dedd6562dfe11eSteve Naroff  DeclTy *ParseObjCAtDirectives();
258dac269b65eed82182fc3e96566dedd6562dfe11eSteve Naroff  DeclTy *ParseObjCAtClassDeclaration(SourceLocation atLoc);
259dac269b65eed82182fc3e96566dedd6562dfe11eSteve Naroff  DeclTy *ParseObjCAtInterfaceDeclaration(SourceLocation atLoc,
260dac269b65eed82182fc3e96566dedd6562dfe11eSteve Naroff                                          AttributeList *prefixAttrs = 0);
261ddbff78fb719a645b04bd27099fa6ec8c4693b3cSteve Naroff  void ParseObjCClassInstanceVariables(DeclTy *interfaceDecl);
262dac269b65eed82182fc3e96566dedd6562dfe11eSteve Naroff  bool ParseObjCProtocolReferences();
263294494e1cce92043562b4680c613df7fd028c02eSteve Naroff  void ParseObjCInterfaceDeclList(DeclTy *interfaceDecl);
2647ef58fdbefddf693910e6403a71b3d367444c897Steve Naroff  DeclTy *ParseObjCAtProtocolDeclaration(SourceLocation atLoc);
265ac00b7f4a933e60e2f0afd83092339160adc140cFariborz Jahanian  DeclTy *ParseObjCAtImplementationDeclaration(SourceLocation atLoc);
266ac00b7f4a933e60e2f0afd83092339160adc140cFariborz Jahanian  DeclTy *ParseObjCAtEndDeclaration(SourceLocation atLoc);
267e992af01d14e2e31037562c123af0a71ae1ed374Fariborz Jahanian  DeclTy *ParseObjCAtAliasDeclaration(SourceLocation atLoc);
268ac00b7f4a933e60e2f0afd83092339160adc140cFariborz Jahanian  DeclTy *ParseObjCPropertySynthesize(SourceLocation atLoc);
269ac00b7f4a933e60e2f0afd83092339160adc140cFariborz Jahanian  DeclTy *ParseObjCPropertyDynamic(SourceLocation atLoc);
2705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
271294494e1cce92043562b4680c613df7fd028c02eSteve Naroff  IdentifierInfo *ParseObjCSelector();
27234870da70fa42b0391b79627ebd0cfc6eb22213bChris Lattner  // Definitions for Objective-c context sensitive keywords recognition.
27334870da70fa42b0391b79627ebd0cfc6eb22213bChris Lattner  enum ObjCTypeQual {
27434870da70fa42b0391b79627ebd0cfc6eb22213bChris Lattner    objc_in=0, objc_out, objc_inout, objc_oneway, objc_bycopy, objc_byref,
27534870da70fa42b0391b79627ebd0cfc6eb22213bChris Lattner    objc_NumQuals
27634870da70fa42b0391b79627ebd0cfc6eb22213bChris Lattner  };
27734870da70fa42b0391b79627ebd0cfc6eb22213bChris Lattner  IdentifierInfo *ObjcTypeQuals[objc_NumQuals];
2784fa7afd07421e7276d1717e4fdf43a5fdd65a622Steve Naroff  bool isObjCTypeQualifier();
279d0f97d1716a138a8d9e0df8e5af77334663723d8Fariborz Jahanian  // Definitions for ObjC2's @property attributes.
280d0f97d1716a138a8d9e0df8e5af77334663723d8Fariborz Jahanian  enum ObjCPropertyAttr {
281d0f97d1716a138a8d9e0df8e5af77334663723d8Fariborz Jahanian    objc_readonly=0, objc_getter, objc_setter, objc_assign,
282d0f97d1716a138a8d9e0df8e5af77334663723d8Fariborz Jahanian    objc_readwrite, objc_retain, objc_copy, objc_nonatomic, objc_NumAttrs
283d0f97d1716a138a8d9e0df8e5af77334663723d8Fariborz Jahanian  };
284d0f97d1716a138a8d9e0df8e5af77334663723d8Fariborz Jahanian  IdentifierInfo *ObjcPropertyAttrs[objc_NumAttrs];
285d0f97d1716a138a8d9e0df8e5af77334663723d8Fariborz Jahanian  bool isObjCPropertyAttribute();
286d0f97d1716a138a8d9e0df8e5af77334663723d8Fariborz Jahanian
287294494e1cce92043562b4680c613df7fd028c02eSteve Naroff  void ParseObjCTypeName();
288294494e1cce92043562b4680c613df7fd028c02eSteve Naroff  void ParseObjCMethodRequirement();
289ac00b7f4a933e60e2f0afd83092339160adc140cFariborz Jahanian  void ParseObjCMethodPrototype(bool decl);
290294494e1cce92043562b4680c613df7fd028c02eSteve Naroff  void ParseObjCMethodDecl(tok::TokenKind mType, SourceLocation mLoc);
291d0f97d1716a138a8d9e0df8e5af77334663723d8Fariborz Jahanian  void ParseObjCPropertyAttribute(DeclTy *interfaceDecl);
292d0f97d1716a138a8d9e0df8e5af77334663723d8Fariborz Jahanian  void ParseObjCPropertyDecl(DeclTy *interfaceDecl);
293294494e1cce92043562b4680c613df7fd028c02eSteve Naroff
2947ef58fdbefddf693910e6403a71b3d367444c897Steve Naroff  void ParseObjCInstanceMethodDefinition();
2957ef58fdbefddf693910e6403a71b3d367444c897Steve Naroff  void ParseObjCClassMethodDefinition();
2965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
2985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.5: Expressions.
2995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  typedef Action::ExprResult ExprResult;
3015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  typedef Action::StmtResult StmtResult;
3025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseExpression();
3045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseConstantExpression();
3055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseAssignmentExpression();  // Expr that doesn't include commas.
3065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
307d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner  ExprResult ParseExpressionWithLeadingIdentifier(const Token &Tok);
308d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner  ExprResult ParseAssignmentExprWithLeadingIdentifier(const Token &Tok);
309d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner  ExprResult ParseAssignmentExpressionWithLeadingStar(const Token &Tok);
3105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseRHSOfBinaryExpression(ExprResult LHS, unsigned MinPrec);
3125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseCastExpression(bool isUnaryExpression);
3135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParsePostfixExpressionSuffix(ExprResult LHS);
3145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseSizeofAlignofExpression();
3155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseBuiltinPrimaryExpression();
3165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// ParenParseOption - Control what ParseParenExpression will parse.
3185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  enum ParenParseOption {
3195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    SimpleExpr,      // Only parse '(' expression ')'
3205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    CompoundStmt,    // Also allow '(' compound-statement ')'
3215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    CompoundLiteral, // Also allow '(' type-name ')' '{' ... '}'
3225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    CastExpr         // Also allow '(' type-name ')' <anything>
3235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  };
3245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseParenExpression(ParenParseOption &ExprType, TypeTy *&CastTy,
3255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                                  SourceLocation &RParenLoc);
3265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseSimpleParenExpression() {  // Parse SimpleExpr only.
3285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    SourceLocation RParenLoc;
3295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return ParseSimpleParenExpression(RParenLoc);
3305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseSimpleParenExpression(SourceLocation &RParenLoc) {
3325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    ParenParseOption Op = SimpleExpr;
3335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    TypeTy *CastTy;
3345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return ParseParenExpression(Op, CastTy, RParenLoc);
3355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseStringLiteralExpression();
3375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
3395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C++ 5.2p1: C++ Casts
3405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseCXXCasts();
3415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
3435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C++ 2.13.5: C++ Boolean Literals
3445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseCXXBoolLiteral();
3455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
3475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.7.8: Initialization.
3485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseInitializer();
3495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseInitializerWithPotentialDesignator();
3505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
3525508518a2702b00be3b15a26d772bde968972f54Anders Carlsson  // Objective-C Expressions
3535508518a2702b00be3b15a26d772bde968972f54Anders Carlsson  ExprResult ParseObjCExpression();
3545508518a2702b00be3b15a26d772bde968972f54Anders Carlsson  ExprResult ParseObjCStringLiteral();
355f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson  ExprResult ParseObjCEncodeExpression();
35629b2cb1ff1a3dd78edd38e2f43ee7041d3e4ec3cAnders Carlsson  ExprResult ParseObjCProtocolExpression();
3570ccb27ded12fd03eb6818a880f50901bb70254feFariborz Jahanian  ExprResult ParseObjCMessageExpression();
358f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson
3595508518a2702b00be3b15a26d772bde968972f54Anders Carlsson  //===--------------------------------------------------------------------===//
3605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.8: Statements and Blocks.
3615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtResult ParseStatement() { return ParseStatementOrDeclaration(true); }
3635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtResult ParseStatementOrDeclaration(bool OnlyStatement = false);
3645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtResult ParseIdentifierStatement(bool OnlyStatement);
3655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtResult ParseCaseStatement();
3665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtResult ParseDefaultStatement();
36798414c1b7d1944a57156d52e29bd41c005de09acChris Lattner  StmtResult ParseCompoundStatement(bool isStmtExpr = false);
36898414c1b7d1944a57156d52e29bd41c005de09acChris Lattner  StmtResult ParseCompoundStatementBody(bool isStmtExpr = false);
3695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtResult ParseIfStatement();
3705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtResult ParseSwitchStatement();
3715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtResult ParseWhileStatement();
3725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtResult ParseDoStatement();
3735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtResult ParseForStatement();
3745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtResult ParseGotoStatement();
3755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtResult ParseContinueStatement();
3765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtResult ParseBreakStatement();
3775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtResult ParseReturnStatement();
3785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtResult ParseAsmStatement();
3795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseAsmOperandsOpt();
3805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
3825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.7: Declarations.
3835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  DeclTy *ParseDeclaration(unsigned Context);
3858f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner  DeclTy *ParseSimpleDeclaration(unsigned Context);
3865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  DeclTy *ParseInitDeclaratorListAfterFirstDeclarator(Declarator &D);
3875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseDeclarationSpecifiers(DeclSpec &DS);
3885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseSpecifierQualifierList(DeclSpec &DS);
3895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool ParseTag(DeclTy *&Decl, unsigned TagType, SourceLocation StartLoc);
3915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseEnumSpecifier(DeclSpec &DS);
3925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseEnumBody(SourceLocation StartLoc, DeclTy *TagDecl);
3935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseStructUnionSpecifier(DeclSpec &DS);
3945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseStructUnionBody(SourceLocation StartLoc, unsigned TagType,
3955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                            DeclTy *TagDecl);
39628a7ca80da5dd2d0fca75d9a3b7a5f4851712592Steve Naroff  void ParseStructDeclaration(DeclTy *TagDecl,
3974e6526b2de501f2bbc261fd8017c92c75bd8d8f7Steve Naroff                              llvm::SmallVectorImpl<DeclTy*> &FieldDecls);
3984e6526b2de501f2bbc261fd8017c92c75bd8d8f7Steve Naroff
3995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool isDeclarationSpecifier() const;
4005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool isTypeSpecifierQualifier() const;
4015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  TypeTy *ParseTypeName();
4035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  AttributeList *ParseAttributes();
404d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff  void ParseTypeofSpecifier(DeclSpec &DS);
4055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// ParseDeclarator - Parse and verify a newly-initialized declarator.
4075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseDeclarator(Declarator &D);
4085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseDeclaratorInternal(Declarator &D);
4095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseTypeQualifierListOpt(DeclSpec &DS);
4105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseDirectDeclarator(Declarator &D);
4115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseParenDeclarator(Declarator &D);
4125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseBracketDeclarator(Declarator &D);
4138f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner
4148f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner  //===--------------------------------------------------------------------===//
4158f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner  // C++ 7: Declarations [dcl.dcl]
4168f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner
4178f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner  DeclTy *ParseNamespace(unsigned Context);
4188f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner
4195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
4205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}  // end namespace clang
4225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif
424