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