Parser.h revision d62701bc5321049353017e9abf1963edd57646aa
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- Parser.h - C Language Parser ---------------------------*- C++ -*-===//
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//                     The LLVM Compiler Infrastructure
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// 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;
22a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  class ObjCDeclSpec;
235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class Declarator;
245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class AttributeList;
255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class Scope;
265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// Parser - This implements a parser for the C family of languages.  After
285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// parsing units of the grammar, productions are invoked to handle whatever has
295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// been read.
305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass Parser {
325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Preprocessor &PP;
335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// Tok - The current token we are peeking head.  All parsing methods assume
355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// that this is valid.
36d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner  Token Tok;
375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  unsigned short ParenCount, BracketCount, BraceCount;
395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// Actions - These are the callbacks we invoke as we parse various constructs
415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// in the file.  This refers to the common base class between MinimalActions
425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// and SemaActions for those uses that don't matter.
435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Action &Actions;
445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Scope *CurScope;
465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Diagnostic &Diags;
479e344c65b1e8b83e1d3ada507cf653526ff2c005Chris Lattner
489e344c65b1e8b83e1d3ada507cf653526ff2c005Chris Lattner  /// ScopeCache - Cache scopes to reduce malloc traffic.
499e344c65b1e8b83e1d3ada507cf653526ff2c005Chris Lattner  enum { ScopeCacheSize = 16 };
509e344c65b1e8b83e1d3ada507cf653526ff2c005Chris Lattner  unsigned NumCachedScopes;
519e344c65b1e8b83e1d3ada507cf653526ff2c005Chris Lattner  Scope *ScopeCache[ScopeCacheSize];
525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Parser(Preprocessor &PP, Action &Actions);
545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ~Parser();
555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const LangOptions &getLang() const { return PP.getLangOptions(); }
575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  TargetInfo &getTargetInfo() const { return PP.getTargetInfo(); }
585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Action &getActions() const { return Actions; }
595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Type forwarding.  All of these are statically 'void*', but they may all be
615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // different actual classes based on the actions in place.
625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  typedef Action::ExprTy ExprTy;
635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  typedef Action::StmtTy StmtTy;
645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  typedef Action::DeclTy DeclTy;
655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  typedef Action::TypeTy TypeTy;
665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Parsing methods.
685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// ParseTranslationUnit - All in one method that initializes parses, and
705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// shuts down the parser.
715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseTranslationUnit();
725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// Initialize - Warm up the parser.
745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void Initialize();
765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
771f6443255894429fba384de0d5b6389ef578a5e9Steve Naroff  /// ParseTopLevelDecl - Parse one top-level declaration. Returns true if
781f6443255894429fba384de0d5b6389ef578a5e9Steve Naroff  /// the EOF was encountered.
7989307ffaf8acf4d6fdffd72b607ca4fbcfdffc9dSteve Naroff  bool ParseTopLevelDecl(DeclTy*& Result);
805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// Finalize - Shut down the parser.
825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void Finalize();
845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerprivate:
865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Low-Level token peeking and consumption methods.
885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //
895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// isTokenParen - Return true if the cur token is '(' or ')'.
915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool isTokenParen() const {
925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return Tok.getKind() == tok::l_paren || Tok.getKind() == tok::r_paren;
935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// isTokenBracket - Return true if the cur token is '[' or ']'.
955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool isTokenBracket() const {
965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return Tok.getKind() == tok::l_square || Tok.getKind() == tok::r_square;
975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// isTokenBrace - Return true if the cur token is '{' or '}'.
995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool isTokenBrace() const {
1005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return Tok.getKind() == tok::l_brace || Tok.getKind() == tok::r_brace;
1015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// isTokenStringLiteral - True if this token is a string-literal.
1045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
1055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool isTokenStringLiteral() const {
1065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return Tok.getKind() == tok::string_literal ||
1075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           Tok.getKind() == tok::wide_string_literal;
1085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// ConsumeToken - Consume the current 'peek token' and lex the next one.
1115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// This does not work will all kinds of tokens: strings and specific other
1125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// tokens must be consumed with custom methods below.  This returns the
1135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// location of the consumed token.
1145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation ConsumeToken() {
1155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    assert(!isTokenStringLiteral() && !isTokenParen() && !isTokenBracket() &&
1165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           !isTokenBrace() &&
1175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           "Should consume special tokens with Consume*Token");
1185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    SourceLocation L = Tok.getLocation();
1195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PP.Lex(Tok);
1205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return L;
1215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// ConsumeAnyToken - Dispatch to the right Consume* method based on the
1245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// current token type.  This should only be used in cases where the type of
1255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// the token really isn't known, e.g. in error recovery.
1265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation ConsumeAnyToken() {
1275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (isTokenParen())
1285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return ConsumeParen();
1295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    else if (isTokenBracket())
1305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return ConsumeBracket();
1315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    else if (isTokenBrace())
1325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return ConsumeBrace();
133d62701bc5321049353017e9abf1963edd57646aaSteve Naroff    else if (isTokenStringLiteral())
134d62701bc5321049353017e9abf1963edd57646aaSteve Naroff      return ConsumeStringToken();
1355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    else
1365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return ConsumeToken();
1375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// ConsumeParen - This consume method keeps the paren count up-to-date.
1405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
1415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation ConsumeParen() {
1425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    assert(isTokenParen() && "wrong consume method");
1435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (Tok.getKind() == tok::l_paren)
1445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      ++ParenCount;
1455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    else if (ParenCount)
1465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      --ParenCount;       // Don't let unbalanced )'s drive the count negative.
1475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    SourceLocation L = Tok.getLocation();
1485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PP.Lex(Tok);
1495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return L;
1505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// ConsumeBracket - This consume method keeps the bracket count up-to-date.
1535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
1545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation ConsumeBracket() {
1555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    assert(isTokenBracket() && "wrong consume method");
1565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (Tok.getKind() == tok::l_square)
1575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      ++BracketCount;
1585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    else if (BracketCount)
1595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      --BracketCount;     // Don't let unbalanced ]'s drive the count negative.
1605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    SourceLocation L = Tok.getLocation();
1625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PP.Lex(Tok);
1635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return L;
1645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// ConsumeBrace - This consume method keeps the brace count up-to-date.
1675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
1685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation ConsumeBrace() {
1695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    assert(isTokenBrace() && "wrong consume method");
1705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (Tok.getKind() == tok::l_brace)
1715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      ++BraceCount;
1725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    else if (BraceCount)
1735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      --BraceCount;     // Don't let unbalanced }'s drive the count negative.
1745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    SourceLocation L = Tok.getLocation();
1765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PP.Lex(Tok);
1775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return L;
1785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// ConsumeStringToken - Consume the current 'peek token', lexing a new one
1815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// and returning the token kind.  This method is specific to strings, as it
1825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// handles string literal concatenation, as per C99 5.1.1.2, translation
1835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// phase #6.
1845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation ConsumeStringToken() {
1855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    assert(isTokenStringLiteral() &&
1865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           "Should only consume string literals with this method");
1875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    SourceLocation L = Tok.getLocation();
1885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PP.Lex(Tok);
1895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return L;
1905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// MatchRHSPunctuation - For punctuation with a LHS and RHS (e.g. '['/']'),
1935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// this helper function matches and consumes the specified RHS token if
1945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// present.  If not present, it emits the specified diagnostic indicating
1955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// that the parser failed to match the RHS of the token at LHSLoc.  LHSName
1965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// should be the name of the unmatched LHS token.  This returns the location
1975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// of the consumed token.
1985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation MatchRHSPunctuation(tok::TokenKind RHSTok,
1995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                                     SourceLocation LHSLoc);
2005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// ExpectAndConsume - The parser expects that 'ExpectedTok' is next in the
2025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// input.  If so, it is consumed and false is returned.
2035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
2045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// If the input is malformed, this emits the specified diagnostic.  Next, if
2055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// SkipToTok is specified, it calls SkipUntil(SkipToTok).  Finally, true is
2065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// returned.
2075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool ExpectAndConsume(tok::TokenKind ExpectedTok, unsigned Diag,
2085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                        const char *DiagMsg = "",
2095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                        tok::TokenKind SkipToTok = tok::unknown);
2105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
2125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Scope manipulation
2135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// EnterScope - Start a new scope.
2155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void EnterScope(unsigned ScopeFlags);
2165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// ExitScope - Pop a scope off the scope stack.
2185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ExitScope();
2195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
2215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Diagnostic Emission and Error recovery.
2225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void Diag(SourceLocation Loc, unsigned DiagID,
2245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer            const std::string &Msg = std::string());
225d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner  void Diag(const Token &Tok, unsigned DiagID,
2265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer            const std::string &M = std::string()) {
2275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Diag(Tok.getLocation(), DiagID, M);
2285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// SkipUntil - Read tokens until we get to the specified token, then consume
23182c7e6d8215567935d3d52741ccca9876a8ea461Steve Naroff  /// it (unless DontConsume is true).  Because we cannot guarantee that the
2325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// token will ever occur, this skips to the next token, or to some likely
2335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// good stopping point.  If StopAtSemi is true, skipping will stop at a ';'
2345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// character.
2355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
2365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// If SkipUntil finds the specified token, it returns true, otherwise it
2375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// returns false.
2385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool SkipUntil(tok::TokenKind T, bool StopAtSemi = true,
2395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                 bool DontConsume = false) {
2405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return SkipUntil(&T, 1, StopAtSemi, DontConsume);
2415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool SkipUntil(tok::TokenKind T1, tok::TokenKind T2, bool StopAtSemi = true,
2435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                 bool DontConsume = false) {
2445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    tok::TokenKind TokArray[] = {T1, T2};
2455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return SkipUntil(TokArray, 2, StopAtSemi, DontConsume);
2465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool SkipUntil(const tok::TokenKind *Toks, unsigned NumToks,
2485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                 bool StopAtSemi = true, bool DontConsume = false);
2496a0ef4b83c91a6d6d5acb4ed5577c4659fe022a3Anders Carlsson
2506a0ef4b83c91a6d6d5acb4ed5577c4659fe022a3Anders Carlsson  typedef Action::ExprResult ExprResult;
2516a0ef4b83c91a6d6d5acb4ed5577c4659fe022a3Anders Carlsson  typedef Action::StmtResult StmtResult;
2526a0ef4b83c91a6d6d5acb4ed5577c4659fe022a3Anders Carlsson
2535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
2545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.9: External Definitions.
2555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  DeclTy *ParseExternalDeclaration();
2565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  DeclTy *ParseDeclarationOrFunctionDefinition();
2575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  DeclTy *ParseFunctionDefinition(Declarator &D);
2585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseKNRParamDeclarations(Declarator &D);
2595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseSimpleAsm();
2606a0ef4b83c91a6d6d5acb4ed5577c4659fe022a3Anders Carlsson  ExprResult ParseAsmStringLiteral();
2615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2623536b443bc50d58a79f14fca9b6842541a434854Steve Naroff  // Objective-C External Declarations
263dac269b65eed82182fc3e96566dedd6562dfe11eSteve Naroff  DeclTy *ParseObjCAtDirectives();
264dac269b65eed82182fc3e96566dedd6562dfe11eSteve Naroff  DeclTy *ParseObjCAtClassDeclaration(SourceLocation atLoc);
265dac269b65eed82182fc3e96566dedd6562dfe11eSteve Naroff  DeclTy *ParseObjCAtInterfaceDeclaration(SourceLocation atLoc,
266dac269b65eed82182fc3e96566dedd6562dfe11eSteve Naroff                                          AttributeList *prefixAttrs = 0);
26760fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  void ParseObjCClassInstanceVariables(DeclTy *interfaceDecl,
26860fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                                       SourceLocation atLoc);
269f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  bool ParseObjCProtocolReferences(llvm::SmallVectorImpl<IdentifierInfo*> &,
270f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff                                   SourceLocation &endProtoLoc);
27125e077d59a8e8e43b65882b69610a3d5e2aaf53cFariborz Jahanian  void ParseObjCInterfaceDeclList(DeclTy *interfaceDecl,
27225e077d59a8e8e43b65882b69610a3d5e2aaf53cFariborz Jahanian				  tok::ObjCKeywordKind contextKey);
2737ef58fdbefddf693910e6403a71b3d367444c897Steve Naroff  DeclTy *ParseObjCAtProtocolDeclaration(SourceLocation atLoc);
2743536b443bc50d58a79f14fca9b6842541a434854Steve Naroff
275a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  DeclTy *ObjCImpDecl;
2760416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff
277ac00b7f4a933e60e2f0afd83092339160adc140cFariborz Jahanian  DeclTy *ParseObjCAtImplementationDeclaration(SourceLocation atLoc);
278ac00b7f4a933e60e2f0afd83092339160adc140cFariborz Jahanian  DeclTy *ParseObjCAtEndDeclaration(SourceLocation atLoc);
279e992af01d14e2e31037562c123af0a71ae1ed374Fariborz Jahanian  DeclTy *ParseObjCAtAliasDeclaration(SourceLocation atLoc);
280ac00b7f4a933e60e2f0afd83092339160adc140cFariborz Jahanian  DeclTy *ParseObjCPropertySynthesize(SourceLocation atLoc);
281ac00b7f4a933e60e2f0afd83092339160adc140cFariborz Jahanian  DeclTy *ParseObjCPropertyDynamic(SourceLocation atLoc);
2825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2834b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian  IdentifierInfo *ParseObjCSelector(SourceLocation &MethodLocation);
28434870da70fa42b0391b79627ebd0cfc6eb22213bChris Lattner  // Definitions for Objective-c context sensitive keywords recognition.
28534870da70fa42b0391b79627ebd0cfc6eb22213bChris Lattner  enum ObjCTypeQual {
28634870da70fa42b0391b79627ebd0cfc6eb22213bChris Lattner    objc_in=0, objc_out, objc_inout, objc_oneway, objc_bycopy, objc_byref,
28734870da70fa42b0391b79627ebd0cfc6eb22213bChris Lattner    objc_NumQuals
28834870da70fa42b0391b79627ebd0cfc6eb22213bChris Lattner  };
289a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  IdentifierInfo *ObjCTypeQuals[objc_NumQuals];
290d0f97d1716a138a8d9e0df8e5af77334663723d8Fariborz Jahanian  // Definitions for ObjC2's @property attributes.
291d0f97d1716a138a8d9e0df8e5af77334663723d8Fariborz Jahanian  enum ObjCPropertyAttr {
292d0f97d1716a138a8d9e0df8e5af77334663723d8Fariborz Jahanian    objc_readonly=0, objc_getter, objc_setter, objc_assign,
293d0f97d1716a138a8d9e0df8e5af77334663723d8Fariborz Jahanian    objc_readwrite, objc_retain, objc_copy, objc_nonatomic, objc_NumAttrs
294d0f97d1716a138a8d9e0df8e5af77334663723d8Fariborz Jahanian  };
295a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  IdentifierInfo *ObjCPropertyAttrs[objc_NumAttrs];
296d0f97d1716a138a8d9e0df8e5af77334663723d8Fariborz Jahanian  bool isObjCPropertyAttribute();
2970196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian
2980196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  IdentifierInfo *ObjCForCollectionInKW;
299335a2d4122e41343fe11a775889b8bec5b14be60Fariborz Jahanian  bool isTokIdentifier_in() const;
300d0f97d1716a138a8d9e0df8e5af77334663723d8Fariborz Jahanian
301a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  TypeTy *ParseObjCTypeName(ObjCDeclSpec &DS);
302294494e1cce92043562b4680c613df7fd028c02eSteve Naroff  void ParseObjCMethodRequirement();
30325e077d59a8e8e43b65882b69610a3d5e2aaf53cFariborz Jahanian  DeclTy *ParseObjCMethodPrototype(DeclTy *classOrCat,
30400933591a2795d09dd1acff12a2d21bce7cb12c5Fariborz Jahanian   	    tok::ObjCKeywordKind MethodImplKind = tok::objc_not_keyword);
305bef1185418705e16012b3dd50cd7c260c8d6b79cSteve Naroff  DeclTy *ParseObjCMethodDecl(SourceLocation mLoc, tok::TokenKind mType,
3061f7b6f88f18d7f6b10265acec5d41c4ed1897487Fariborz Jahanian                              DeclTy *classDecl,
30700933591a2795d09dd1acff12a2d21bce7cb12c5Fariborz Jahanian            tok::ObjCKeywordKind MethodImplKind = tok::objc_not_keyword);
308a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  void ParseObjCPropertyAttribute(ObjCDeclSpec &DS);
30982a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  DeclTy *ParseObjCPropertyDecl(DeclTy *interfaceDecl, SourceLocation AtLoc);
310294494e1cce92043562b4680c613df7fd028c02eSteve Naroff
31171c0a951d08dc7a2a057df8c15f22b36f6aa47c7Steve Naroff  DeclTy *ParseObjCMethodDefinition();
312bcfb06ac6da1aa3c74ac1ef7a49c2807522366e7Steve Naroff
3135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
3145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.5: Expressions.
3155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseExpression();
3175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseConstantExpression();
3185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseAssignmentExpression();  // Expr that doesn't include commas.
3195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
320d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner  ExprResult ParseExpressionWithLeadingIdentifier(const Token &Tok);
321b384d329e0b727d4f2effa28fbb9aba2ac420e7bFariborz Jahanian  ExprResult ParseExpressionWithLeadingAt(SourceLocation AtLoc);
322d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner  ExprResult ParseAssignmentExprWithLeadingIdentifier(const Token &Tok);
323d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner  ExprResult ParseAssignmentExpressionWithLeadingStar(const Token &Tok);
3245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseRHSOfBinaryExpression(ExprResult LHS, unsigned MinPrec);
3265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseCastExpression(bool isUnaryExpression);
3275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParsePostfixExpressionSuffix(ExprResult LHS);
3285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseSizeofAlignofExpression();
3295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseBuiltinPrimaryExpression();
3305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// ParenParseOption - Control what ParseParenExpression will parse.
3325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  enum ParenParseOption {
3335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    SimpleExpr,      // Only parse '(' expression ')'
3345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    CompoundStmt,    // Also allow '(' compound-statement ')'
3355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    CompoundLiteral, // Also allow '(' type-name ')' '{' ... '}'
3365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    CastExpr         // Also allow '(' type-name ')' <anything>
3375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  };
3385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseParenExpression(ParenParseOption &ExprType, TypeTy *&CastTy,
3395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                                  SourceLocation &RParenLoc);
3405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseSimpleParenExpression() {  // Parse SimpleExpr only.
3425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    SourceLocation RParenLoc;
3435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return ParseSimpleParenExpression(RParenLoc);
3445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseSimpleParenExpression(SourceLocation &RParenLoc) {
3465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    ParenParseOption Op = SimpleExpr;
3475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    TypeTy *CastTy;
3485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return ParseParenExpression(Op, CastTy, RParenLoc);
3495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseStringLiteralExpression();
3515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
3535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C++ 5.2p1: C++ Casts
3545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseCXXCasts();
3555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
3575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C++ 2.13.5: C++ Boolean Literals
3585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseCXXBoolLiteral();
3595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
3615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.7.8: Initialization.
3625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseInitializer();
3635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ExprResult ParseInitializerWithPotentialDesignator();
3645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
3665508518a2702b00be3b15a26d772bde968972f54Anders Carlsson  // Objective-C Expressions
36714dd98a7952c9559e0d17fff8272bf3be67135afChris Lattner
36814dd98a7952c9559e0d17fff8272bf3be67135afChris Lattner  bool isTokObjCMessageIdentifierReceiver() const {
36914dd98a7952c9559e0d17fff8272bf3be67135afChris Lattner    if (!Tok.is(tok::identifier))
37014dd98a7952c9559e0d17fff8272bf3be67135afChris Lattner      return false;
37114dd98a7952c9559e0d17fff8272bf3be67135afChris Lattner
37214dd98a7952c9559e0d17fff8272bf3be67135afChris Lattner    if (Actions.isTypeName(*Tok.getIdentifierInfo(), CurScope))
37314dd98a7952c9559e0d17fff8272bf3be67135afChris Lattner      return true;
37414dd98a7952c9559e0d17fff8272bf3be67135afChris Lattner
37514dd98a7952c9559e0d17fff8272bf3be67135afChris Lattner    return Tok.isNamedIdentifier("super");
37614dd98a7952c9559e0d17fff8272bf3be67135afChris Lattner  }
37714dd98a7952c9559e0d17fff8272bf3be67135afChris Lattner
378a642beb9f143130588dcf622f5f7020832b22707Steve Naroff  ExprResult ParseObjCAtExpression(SourceLocation AtLocation);
379beaf299a2701c5559a4e5d76b0c40f805afb8e6aSteve Naroff  ExprResult ParseObjCStringLiteral(SourceLocation AtLoc);
380674af9541256dc3ef803e3723027a8b028f1f7a2Chris Lattner  ExprResult ParseObjCEncodeExpression(SourceLocation AtLoc);
3812a35fa9b5e0f9d9429c04adb2e1249b6fd425e7aFariborz Jahanian  ExprResult ParseObjCSelectorExpression(SourceLocation AtLoc);
3822a35fa9b5e0f9d9429c04adb2e1249b6fd425e7aFariborz Jahanian  ExprResult ParseObjCProtocolExpression(SourceLocation AtLoc);
3830ccb27ded12fd03eb6818a880f50901bb70254feFariborz Jahanian  ExprResult ParseObjCMessageExpression();
384699b66138ac307a32e238463e0eff513ff17d337Chris Lattner  ExprResult ParseObjCMessageExpressionBody(SourceLocation LBracloc,
385699b66138ac307a32e238463e0eff513ff17d337Chris Lattner                                            IdentifierInfo *ReceiverName,
386699b66138ac307a32e238463e0eff513ff17d337Chris Lattner                                            ExprTy *ReceiverExpr);
387699b66138ac307a32e238463e0eff513ff17d337Chris Lattner
3885508518a2702b00be3b15a26d772bde968972f54Anders Carlsson  //===--------------------------------------------------------------------===//
3895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.8: Statements and Blocks.
3905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtResult ParseStatement() { return ParseStatementOrDeclaration(true); }
3925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtResult ParseStatementOrDeclaration(bool OnlyStatement = false);
3935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtResult ParseIdentifierStatement(bool OnlyStatement);
3945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtResult ParseCaseStatement();
3955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtResult ParseDefaultStatement();
39698414c1b7d1944a57156d52e29bd41c005de09acChris Lattner  StmtResult ParseCompoundStatement(bool isStmtExpr = false);
39798414c1b7d1944a57156d52e29bd41c005de09acChris Lattner  StmtResult ParseCompoundStatementBody(bool isStmtExpr = false);
3985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtResult ParseIfStatement();
3995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtResult ParseSwitchStatement();
4005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtResult ParseWhileStatement();
4015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtResult ParseDoStatement();
4025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtResult ParseForStatement();
4035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtResult ParseGotoStatement();
4045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtResult ParseContinueStatement();
4055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtResult ParseBreakStatement();
4065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtResult ParseReturnStatement();
407d62701bc5321049353017e9abf1963edd57646aaSteve Naroff  StmtResult ParseAsmStatement(bool &msAsm);
408d62701bc5321049353017e9abf1963edd57646aaSteve Naroff  StmtResult FuzzyParseMicrosoftAsmStatement();
40964515f31850024a263e8f55f81e9ea4b39925cfaSteve Naroff  StmtResult ParseObjCAtStatement(SourceLocation atLoc);
41064515f31850024a263e8f55f81e9ea4b39925cfaSteve Naroff  StmtResult ParseObjCTryStmt(SourceLocation atLoc, bool &processAtKeyword);
41139f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian  StmtResult ParseObjCThrowStmt(SourceLocation atLoc);
412c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian  StmtResult ParseObjCSynchronizedStmt(SourceLocation atLoc);
413b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  void ParseAsmOperandsOpt(llvm::SmallVectorImpl<std::string> &Names,
414b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson                           llvm::SmallVectorImpl<ExprTy*> &Constraints,
415b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson                           llvm::SmallVectorImpl<ExprTy*> &Exprs);
416b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson
4175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
4195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.7: Declarations.
4205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  DeclTy *ParseDeclaration(unsigned Context);
4228f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner  DeclTy *ParseSimpleDeclaration(unsigned Context);
4235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  DeclTy *ParseInitDeclaratorListAfterFirstDeclarator(Declarator &D);
424f9ed3157c93495474003a5ec360039030fd42e9cFariborz Jahanian  DeclTy *ParseFunctionStatementBody(DeclTy *Decl,
425f9ed3157c93495474003a5ec360039030fd42e9cFariborz Jahanian                                     SourceLocation L, SourceLocation R);
4265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseDeclarationSpecifiers(DeclSpec &DS);
4275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseSpecifierQualifierList(DeclSpec &DS);
42819d74e1494fe399f0e2a94e9419c095f8214851bFariborz Jahanian
429a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  void ParseObjCTypeQualifierList(ObjCDeclSpec &DS);
4305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool ParseTag(DeclTy *&Decl, unsigned TagType, SourceLocation StartLoc);
4325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseEnumSpecifier(DeclSpec &DS);
4335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseEnumBody(SourceLocation StartLoc, DeclTy *TagDecl);
4345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseStructUnionSpecifier(DeclSpec &DS);
4355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseStructUnionBody(SourceLocation StartLoc, unsigned TagType,
4365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                            DeclTy *TagDecl);
43728a7ca80da5dd2d0fca75d9a3b7a5f4851712592Steve Naroff  void ParseStructDeclaration(DeclTy *TagDecl,
4384e6526b2de501f2bbc261fd8017c92c75bd8d8f7Steve Naroff                              llvm::SmallVectorImpl<DeclTy*> &FieldDecls);
4394e6526b2de501f2bbc261fd8017c92c75bd8d8f7Steve Naroff
4405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool isDeclarationSpecifier() const;
4415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool isTypeSpecifierQualifier() const;
4425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  TypeTy *ParseTypeName();
444d62701bc5321049353017e9abf1963edd57646aaSteve Naroff  void FuzzyParseMicrosoftDeclspec();
4455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  AttributeList *ParseAttributes();
446d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff  void ParseTypeofSpecifier(DeclSpec &DS);
4475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// ParseDeclarator - Parse and verify a newly-initialized declarator.
4495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseDeclarator(Declarator &D);
4505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseDeclaratorInternal(Declarator &D);
4515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseTypeQualifierListOpt(DeclSpec &DS);
4525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseDirectDeclarator(Declarator &D);
4535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseParenDeclarator(Declarator &D);
4545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void ParseBracketDeclarator(Declarator &D);
4558f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner
4568f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner  //===--------------------------------------------------------------------===//
4578f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner  // C++ 7: Declarations [dcl.dcl]
4588f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner
4598f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner  DeclTy *ParseNamespace(unsigned Context);
460c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner  DeclTy *ParseLinkage(unsigned Context);
4618f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner
4625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
4635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}  // end namespace clang
4655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif
467