parser.cpp 63 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968
  1. // Part of the Carbon Language project, under the Apache License v2.0 with LLVM
  2. // Exceptions. See /LICENSE for license information.
  3. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. #include "toolchain/parser/parser.h"
  5. #include <cstdlib>
  6. #include <memory>
  7. #include <optional>
  8. #include "common/check.h"
  9. #include "llvm/Support/PrettyStackTrace.h"
  10. #include "toolchain/lexer/token_kind.h"
  11. #include "toolchain/lexer/tokenized_buffer.h"
  12. #include "toolchain/parser/parse_node_kind.h"
  13. #include "toolchain/parser/parse_tree.h"
  14. namespace Carbon {
  15. // May be emitted a couple different ways as part of operator parsing.
  16. CARBON_DIAGNOSTIC(
  17. OperatorRequiresParentheses, Error,
  18. "Parentheses are required to disambiguate operator precedence.");
  19. CARBON_DIAGNOSTIC(ExpectedSemiAfterExpression, Error,
  20. "Expected `;` after expression.");
  21. CARBON_DIAGNOSTIC(ExpectedDeclarationName, Error,
  22. "`{0}` introducer should be followed by a name.", TokenKind);
  23. CARBON_DIAGNOSTIC(ExpectedDeclarationSemiOrDefinition, Error,
  24. "`{0}` should either end with a `;` for a declaration or "
  25. "have a `{{ ... }` block for a definition.",
  26. TokenKind);
  27. // A relative location for characters in errors.
  28. enum class RelativeLocation : int8_t {
  29. Around,
  30. After,
  31. Before,
  32. };
  33. // Adapts RelativeLocation for use with formatv.
  34. static auto operator<<(llvm::raw_ostream& out, RelativeLocation loc)
  35. -> llvm::raw_ostream& {
  36. switch (loc) {
  37. case RelativeLocation::Around:
  38. out << "around";
  39. break;
  40. case RelativeLocation::After:
  41. out << "after";
  42. break;
  43. case RelativeLocation::Before:
  44. out << "before";
  45. break;
  46. }
  47. return out;
  48. }
  49. class Parser::PrettyStackTraceParseState : public llvm::PrettyStackTraceEntry {
  50. public:
  51. explicit PrettyStackTraceParseState(const Parser* parser) : parser_(parser) {}
  52. ~PrettyStackTraceParseState() override = default;
  53. auto print(llvm::raw_ostream& output) const -> void override {
  54. output << "Parser stack:\n";
  55. for (int i = 0; i < static_cast<int>(parser_->state_stack_.size()); ++i) {
  56. const auto& entry = parser_->state_stack_[i];
  57. output << "\t" << i << ".\t" << entry.state;
  58. Print(output, entry.token);
  59. }
  60. output << "\tcursor\tposition_";
  61. Print(output, *parser_->position_);
  62. }
  63. private:
  64. auto Print(llvm::raw_ostream& output, TokenizedBuffer::Token token) const
  65. -> void {
  66. auto line = parser_->tokens_->GetLine(token);
  67. output << " @ " << parser_->tokens_->GetLineNumber(line) << ":"
  68. << parser_->tokens_->GetColumnNumber(token) << ":"
  69. << " token " << token << " : " << parser_->tokens_->GetKind(token)
  70. << "\n";
  71. }
  72. const Parser* parser_;
  73. };
  74. Parser::Parser(ParseTree& tree, TokenizedBuffer& tokens,
  75. TokenDiagnosticEmitter& emitter, llvm::raw_ostream* vlog_stream)
  76. : tree_(&tree),
  77. tokens_(&tokens),
  78. emitter_(&emitter),
  79. vlog_stream_(vlog_stream),
  80. position_(tokens_->tokens().begin()),
  81. end_(tokens_->tokens().end()) {
  82. CARBON_CHECK(position_ != end_) << "Empty TokenizedBuffer";
  83. --end_;
  84. CARBON_CHECK(tokens_->GetKind(*end_) == TokenKind::EndOfFile)
  85. << "TokenizedBuffer should end with EndOfFile, ended with "
  86. << tokens_->GetKind(*end_);
  87. }
  88. auto Parser::AddLeafNode(ParseNodeKind kind, TokenizedBuffer::Token token,
  89. bool has_error) -> void {
  90. tree_->node_impls_.push_back(
  91. ParseTree::NodeImpl(kind, has_error, token, /*subtree_size=*/1));
  92. if (has_error) {
  93. tree_->has_errors_ = true;
  94. }
  95. }
  96. auto Parser::AddNode(ParseNodeKind kind, TokenizedBuffer::Token token,
  97. int subtree_start, bool has_error) -> void {
  98. int subtree_size = tree_->size() - subtree_start + 1;
  99. tree_->node_impls_.push_back(
  100. ParseTree::NodeImpl(kind, has_error, token, subtree_size));
  101. if (has_error) {
  102. tree_->has_errors_ = true;
  103. }
  104. }
  105. auto Parser::ConsumeAndAddOpenParen(TokenizedBuffer::Token default_token,
  106. ParseNodeKind start_kind) -> void {
  107. if (auto open_paren = ConsumeIf(TokenKind::OpenParen)) {
  108. AddLeafNode(start_kind, *open_paren, /*has_error=*/false);
  109. } else {
  110. CARBON_DIAGNOSTIC(ExpectedParenAfter, Error, "Expected `(` after `{0}`.",
  111. TokenKind);
  112. emitter_->Emit(*position_, ExpectedParenAfter,
  113. tokens_->GetKind(default_token));
  114. AddLeafNode(start_kind, default_token, /*has_error=*/true);
  115. }
  116. }
  117. auto Parser::ConsumeAndAddCloseParen(StateStackEntry state,
  118. ParseNodeKind close_kind) -> void {
  119. // state.token should point at the introducer, with the paren one after the
  120. // introducer.
  121. auto expected_paren = *(TokenizedBuffer::TokenIterator(state.token) + 1);
  122. if (tokens_->GetKind(expected_paren) != TokenKind::OpenParen) {
  123. AddNode(close_kind, state.token, state.subtree_start, /*has_error=*/true);
  124. } else if (auto close_token = ConsumeIf(TokenKind::CloseParen)) {
  125. AddNode(close_kind, *close_token, state.subtree_start, state.has_error);
  126. } else {
  127. // TODO: Include the location of the matching open_paren in the diagnostic.
  128. CARBON_DIAGNOSTIC(ExpectedCloseParen, Error,
  129. "Unexpected tokens before `)`.");
  130. emitter_->Emit(*position_, ExpectedCloseParen);
  131. SkipTo(tokens_->GetMatchedClosingToken(expected_paren));
  132. AddNode(close_kind, Consume(), state.subtree_start, /*has_error=*/true);
  133. }
  134. }
  135. auto Parser::ConsumeAndAddLeafNodeIf(TokenKind token_kind,
  136. ParseNodeKind node_kind) -> bool {
  137. auto token = ConsumeIf(token_kind);
  138. if (!token) {
  139. return false;
  140. }
  141. AddLeafNode(node_kind, *token);
  142. return true;
  143. }
  144. auto Parser::ConsumeChecked(TokenKind kind) -> TokenizedBuffer::Token {
  145. CARBON_CHECK(PositionIs(kind))
  146. << "Required " << kind << ", found " << PositionKind();
  147. return Consume();
  148. }
  149. auto Parser::ConsumeIf(TokenKind kind)
  150. -> std::optional<TokenizedBuffer::Token> {
  151. if (!PositionIs(kind)) {
  152. return std::nullopt;
  153. }
  154. return Consume();
  155. }
  156. auto Parser::FindNextOf(std::initializer_list<TokenKind> desired_kinds)
  157. -> std::optional<TokenizedBuffer::Token> {
  158. auto new_position = position_;
  159. while (true) {
  160. TokenizedBuffer::Token token = *new_position;
  161. TokenKind kind = tokens_->GetKind(token);
  162. if (kind.IsOneOf(desired_kinds)) {
  163. return token;
  164. }
  165. // Step to the next token at the current bracketing level.
  166. if (kind.is_closing_symbol() || kind == TokenKind::EndOfFile) {
  167. // There are no more tokens at this level.
  168. return std::nullopt;
  169. } else if (kind.is_opening_symbol()) {
  170. new_position = TokenizedBuffer::TokenIterator(
  171. tokens_->GetMatchedClosingToken(token));
  172. // Advance past the closing token.
  173. ++new_position;
  174. } else {
  175. ++new_position;
  176. }
  177. }
  178. }
  179. auto Parser::SkipMatchingGroup() -> bool {
  180. if (!PositionKind().is_opening_symbol()) {
  181. return false;
  182. }
  183. SkipTo(tokens_->GetMatchedClosingToken(*position_));
  184. ++position_;
  185. return true;
  186. }
  187. auto Parser::SkipPastLikelyEnd(TokenizedBuffer::Token skip_root)
  188. -> std::optional<TokenizedBuffer::Token> {
  189. if (position_ == end_) {
  190. return std::nullopt;
  191. }
  192. TokenizedBuffer::Line root_line = tokens_->GetLine(skip_root);
  193. int root_line_indent = tokens_->GetIndentColumnNumber(root_line);
  194. // We will keep scanning through tokens on the same line as the root or
  195. // lines with greater indentation than root's line.
  196. auto is_same_line_or_indent_greater_than_root =
  197. [&](TokenizedBuffer::Token t) {
  198. TokenizedBuffer::Line l = tokens_->GetLine(t);
  199. if (l == root_line) {
  200. return true;
  201. }
  202. return tokens_->GetIndentColumnNumber(l) > root_line_indent;
  203. };
  204. do {
  205. if (PositionIs(TokenKind::CloseCurlyBrace)) {
  206. // Immediately bail out if we hit an unmatched close curly, this will
  207. // pop us up a level of the syntax grouping.
  208. return std::nullopt;
  209. }
  210. // We assume that a semicolon is always intended to be the end of the
  211. // current construct.
  212. if (auto semi = ConsumeIf(TokenKind::Semi)) {
  213. return semi;
  214. }
  215. // Skip over any matching group of tokens_->
  216. if (SkipMatchingGroup()) {
  217. continue;
  218. }
  219. // Otherwise just step forward one token.
  220. ++position_;
  221. } while (position_ != end_ &&
  222. is_same_line_or_indent_greater_than_root(*position_));
  223. return std::nullopt;
  224. }
  225. auto Parser::SkipTo(TokenizedBuffer::Token t) -> void {
  226. CARBON_CHECK(t >= *position_) << "Tried to skip backwards from " << position_
  227. << " to " << TokenizedBuffer::TokenIterator(t);
  228. position_ = TokenizedBuffer::TokenIterator(t);
  229. CARBON_CHECK(position_ != end_) << "Skipped past EOF.";
  230. }
  231. auto Parser::HandleCodeBlockState() -> void {
  232. PopAndDiscardState();
  233. PushState(ParserState::CodeBlockFinish);
  234. if (ConsumeAndAddLeafNodeIf(TokenKind::OpenCurlyBrace,
  235. ParseNodeKind::CodeBlockStart)) {
  236. PushState(ParserState::StatementScopeLoop);
  237. } else {
  238. AddLeafNode(ParseNodeKind::CodeBlockStart, *position_,
  239. /*has_error=*/true);
  240. // Recover by parsing a single statement.
  241. CARBON_DIAGNOSTIC(ExpectedCodeBlock, Error, "Expected braced code block.");
  242. emitter_->Emit(*position_, ExpectedCodeBlock);
  243. PushState(ParserState::Statement);
  244. }
  245. }
  246. // Determines whether the given token is considered to be the start of an
  247. // operand according to the rules for infix operator parsing.
  248. static auto IsAssumedStartOfOperand(TokenKind kind) -> bool {
  249. return kind.IsOneOf({TokenKind::OpenParen, TokenKind::Identifier,
  250. TokenKind::IntegerLiteral, TokenKind::RealLiteral,
  251. TokenKind::StringLiteral});
  252. }
  253. // Determines whether the given token is considered to be the end of an
  254. // operand according to the rules for infix operator parsing.
  255. static auto IsAssumedEndOfOperand(TokenKind kind) -> bool {
  256. return kind.IsOneOf({TokenKind::CloseParen, TokenKind::CloseCurlyBrace,
  257. TokenKind::CloseSquareBracket, TokenKind::Identifier,
  258. TokenKind::IntegerLiteral, TokenKind::RealLiteral,
  259. TokenKind::StringLiteral});
  260. }
  261. // Determines whether the given token could possibly be the start of an
  262. // operand. This is conservatively correct, and will never incorrectly return
  263. // `false`, but can incorrectly return `true`.
  264. static auto IsPossibleStartOfOperand(TokenKind kind) -> bool {
  265. return !kind.IsOneOf({TokenKind::CloseParen, TokenKind::CloseCurlyBrace,
  266. TokenKind::CloseSquareBracket, TokenKind::Comma,
  267. TokenKind::Semi, TokenKind::Colon});
  268. }
  269. auto Parser::IsLexicallyValidInfixOperator() -> bool {
  270. CARBON_CHECK(position_ != end_) << "Expected an operator token.";
  271. bool leading_space = tokens_->HasLeadingWhitespace(*position_);
  272. bool trailing_space = tokens_->HasTrailingWhitespace(*position_);
  273. // If there's whitespace on both sides, it's an infix operator.
  274. if (leading_space && trailing_space) {
  275. return true;
  276. }
  277. // If there's whitespace on exactly one side, it's not an infix operator.
  278. if (leading_space || trailing_space) {
  279. return false;
  280. }
  281. // Otherwise, for an infix operator, the preceding token must be any close
  282. // bracket, identifier, or literal and the next token must be an open paren,
  283. // identifier, or literal.
  284. if (position_ == tokens_->tokens().begin() ||
  285. !IsAssumedEndOfOperand(tokens_->GetKind(*(position_ - 1))) ||
  286. !IsAssumedStartOfOperand(tokens_->GetKind(*(position_ + 1)))) {
  287. return false;
  288. }
  289. return true;
  290. }
  291. auto Parser::IsTrailingOperatorInfix() -> bool {
  292. if (position_ == end_) {
  293. return false;
  294. }
  295. // An operator that follows the infix operator rules is parsed as
  296. // infix, unless the next token means that it can't possibly be.
  297. if (IsLexicallyValidInfixOperator() &&
  298. IsPossibleStartOfOperand(tokens_->GetKind(*(position_ + 1)))) {
  299. return true;
  300. }
  301. // A trailing operator with leading whitespace that's not valid as infix is
  302. // not valid at all. If the next token looks like the start of an operand,
  303. // then parse as infix, otherwise as postfix. Either way we'll produce a
  304. // diagnostic later on.
  305. if (tokens_->HasLeadingWhitespace(*position_) &&
  306. IsAssumedStartOfOperand(tokens_->GetKind(*(position_ + 1)))) {
  307. return true;
  308. }
  309. return false;
  310. }
  311. auto Parser::DiagnoseOperatorFixity(OperatorFixity fixity) -> void {
  312. if (fixity == OperatorFixity::Infix) {
  313. // Infix operators must satisfy the infix operator rules.
  314. if (!IsLexicallyValidInfixOperator()) {
  315. CARBON_DIAGNOSTIC(BinaryOperatorRequiresWhitespace, Error,
  316. "Whitespace missing {0} binary operator.",
  317. RelativeLocation);
  318. emitter_->Emit(*position_, BinaryOperatorRequiresWhitespace,
  319. tokens_->HasLeadingWhitespace(*position_)
  320. ? RelativeLocation::After
  321. : (tokens_->HasTrailingWhitespace(*position_)
  322. ? RelativeLocation::Before
  323. : RelativeLocation::Around));
  324. }
  325. } else {
  326. bool prefix = fixity == OperatorFixity::Prefix;
  327. // Whitespace is not permitted between a symbolic pre/postfix operator and
  328. // its operand.
  329. if (PositionKind().is_symbol() &&
  330. (prefix ? tokens_->HasTrailingWhitespace(*position_)
  331. : tokens_->HasLeadingWhitespace(*position_))) {
  332. CARBON_DIAGNOSTIC(UnaryOperatorHasWhitespace, Error,
  333. "Whitespace is not allowed {0} this unary operator.",
  334. RelativeLocation);
  335. emitter_->Emit(
  336. *position_, UnaryOperatorHasWhitespace,
  337. prefix ? RelativeLocation::After : RelativeLocation::Before);
  338. }
  339. // Pre/postfix operators must not satisfy the infix operator rules.
  340. if (IsLexicallyValidInfixOperator()) {
  341. CARBON_DIAGNOSTIC(UnaryOperatorRequiresWhitespace, Error,
  342. "Whitespace is required {0} this unary operator.",
  343. RelativeLocation);
  344. emitter_->Emit(
  345. *position_, UnaryOperatorRequiresWhitespace,
  346. prefix ? RelativeLocation::Before : RelativeLocation::After);
  347. }
  348. }
  349. }
  350. auto Parser::ConsumeListToken(ParseNodeKind comma_kind, TokenKind close_kind,
  351. bool already_has_error) -> ListTokenKind {
  352. if (!PositionIs(TokenKind::Comma) && !PositionIs(close_kind)) {
  353. // Don't error a second time on the same element.
  354. if (!already_has_error) {
  355. CARBON_DIAGNOSTIC(UnexpectedTokenAfterListElement, Error,
  356. "Expected `,` or `{0}`.", TokenKind);
  357. emitter_->Emit(*position_, UnexpectedTokenAfterListElement, close_kind);
  358. ReturnErrorOnState();
  359. }
  360. // Recover from the invalid token.
  361. auto end_of_element = FindNextOf({TokenKind::Comma, close_kind});
  362. // The lexer guarantees that parentheses are balanced.
  363. CARBON_CHECK(end_of_element)
  364. << "missing matching `" << close_kind.opening_symbol() << "` for `"
  365. << close_kind << "`";
  366. SkipTo(*end_of_element);
  367. }
  368. if (PositionIs(close_kind)) {
  369. return ListTokenKind::Close;
  370. } else {
  371. AddLeafNode(comma_kind, Consume());
  372. return PositionIs(close_kind) ? ListTokenKind::CommaClose
  373. : ListTokenKind::Comma;
  374. }
  375. }
  376. auto Parser::Parse() -> void {
  377. // Traces state_stack_. This runs even in opt because it's low overhead.
  378. PrettyStackTraceParseState pretty_stack(this);
  379. PushState(ParserState::DeclarationScopeLoop);
  380. // The package should always be the first token, if it's present. Any other
  381. // use is invalid.
  382. if (PositionIs(TokenKind::Package)) {
  383. PushState(ParserState::Package);
  384. }
  385. while (!state_stack_.empty()) {
  386. switch (state_stack_.back().state) {
  387. #define CARBON_PARSER_STATE(Name) \
  388. case ParserState::Name: \
  389. Handle##Name##State(); \
  390. break;
  391. #include "toolchain/parser/parser_state.def"
  392. }
  393. }
  394. AddLeafNode(ParseNodeKind::FileEnd, *position_);
  395. }
  396. auto Parser::GetDeclarationContext() -> DeclarationContext {
  397. // i == 0 is the file-level DeclarationScopeLoop. Additionally, i == 1 can be
  398. // skipped because it will never be a DeclarationScopeLoop.
  399. for (int i = state_stack_.size() - 1; i > 1; --i) {
  400. // The declaration context is always the state _above_ a
  401. // DeclarationScopeLoop.
  402. if (state_stack_[i].state == ParserState::DeclarationScopeLoop) {
  403. switch (state_stack_[i - 1].state) {
  404. case ParserState::TypeDefinitionFinishAsClass:
  405. return DeclarationContext::Class;
  406. case ParserState::TypeDefinitionFinishAsInterface:
  407. return DeclarationContext::Interface;
  408. case ParserState::TypeDefinitionFinishAsNamedConstraint:
  409. return DeclarationContext::NamedConstraint;
  410. default:
  411. llvm_unreachable("Missing handling for a declaration scope");
  412. }
  413. }
  414. }
  415. CARBON_CHECK(!state_stack_.empty() &&
  416. state_stack_[0].state == ParserState::DeclarationScopeLoop);
  417. return DeclarationContext::File;
  418. }
  419. auto Parser::HandleDeclarationError(StateStackEntry state,
  420. ParseNodeKind parse_node_kind,
  421. bool skip_past_likely_end) -> void {
  422. auto token = state.token;
  423. if (skip_past_likely_end) {
  424. if (auto semi = SkipPastLikelyEnd(token)) {
  425. token = *semi;
  426. }
  427. }
  428. AddNode(parse_node_kind, token, state.subtree_start,
  429. /*has_error=*/true);
  430. }
  431. auto Parser::HandleUnrecognizedDeclaration() -> void {
  432. CARBON_DIAGNOSTIC(UnrecognizedDeclaration, Error,
  433. "Unrecognized declaration introducer.");
  434. emitter_->Emit(*position_, UnrecognizedDeclaration);
  435. auto cursor = *position_;
  436. auto semi = SkipPastLikelyEnd(cursor);
  437. // Locate the EmptyDeclaration at the semi when found, but use the
  438. // original cursor location for an error when not.
  439. AddLeafNode(ParseNodeKind::EmptyDeclaration, semi ? *semi : cursor,
  440. /*has_error=*/true);
  441. }
  442. auto Parser::HandleBraceExpressionState() -> void {
  443. auto state = PopState();
  444. state.state = ParserState::BraceExpressionFinishAsUnknown;
  445. PushState(state);
  446. CARBON_CHECK(ConsumeAndAddLeafNodeIf(
  447. TokenKind::OpenCurlyBrace,
  448. ParseNodeKind::StructLiteralOrStructTypeLiteralStart));
  449. if (!PositionIs(TokenKind::CloseCurlyBrace)) {
  450. PushState(ParserState::BraceExpressionParameterAsUnknown);
  451. }
  452. }
  453. auto Parser::HandleBraceExpressionParameterError(StateStackEntry state,
  454. ParserState param_finish_state)
  455. -> void {
  456. bool is_type =
  457. param_finish_state == ParserState::BraceExpressionParameterFinishAsType;
  458. bool is_value =
  459. param_finish_state == ParserState::BraceExpressionParameterFinishAsValue;
  460. bool is_unknown = param_finish_state ==
  461. ParserState::BraceExpressionParameterFinishAsUnknown;
  462. CARBON_CHECK(is_type || is_value || is_unknown);
  463. CARBON_DIAGNOSTIC(ExpectedStructLiteralField, Error, "Expected {0}{1}{2}.",
  464. llvm::StringRef, llvm::StringRef, llvm::StringRef);
  465. emitter_->Emit(*position_, ExpectedStructLiteralField,
  466. (is_type || is_unknown) ? "`.field: field_type`" : "",
  467. is_unknown ? " or " : "",
  468. (is_value || is_unknown) ? "`.field = value`" : "");
  469. state.state = param_finish_state;
  470. state.has_error = true;
  471. PushState(state);
  472. }
  473. auto Parser::HandleBraceExpressionParameter(ParserState after_designator_state,
  474. ParserState param_finish_state)
  475. -> void {
  476. auto state = PopState();
  477. if (!PositionIs(TokenKind::Period)) {
  478. HandleBraceExpressionParameterError(state, param_finish_state);
  479. return;
  480. }
  481. state.state = after_designator_state;
  482. PushState(state);
  483. PushState(ParserState::DesignatorAsStruct);
  484. }
  485. auto Parser::HandleBraceExpressionParameterAsTypeState() -> void {
  486. HandleBraceExpressionParameter(
  487. ParserState::BraceExpressionParameterAfterDesignatorAsType,
  488. ParserState::BraceExpressionParameterFinishAsType);
  489. }
  490. auto Parser::HandleBraceExpressionParameterAsValueState() -> void {
  491. HandleBraceExpressionParameter(
  492. ParserState::BraceExpressionParameterAfterDesignatorAsValue,
  493. ParserState::BraceExpressionParameterFinishAsValue);
  494. }
  495. auto Parser::HandleBraceExpressionParameterAsUnknownState() -> void {
  496. HandleBraceExpressionParameter(
  497. ParserState::BraceExpressionParameterAfterDesignatorAsUnknown,
  498. ParserState::BraceExpressionParameterFinishAsUnknown);
  499. }
  500. auto Parser::HandleBraceExpressionParameterAfterDesignator(
  501. ParserState param_finish_state) -> void {
  502. auto state = PopState();
  503. if (state.has_error) {
  504. auto recovery_pos =
  505. FindNextOf({TokenKind::Equal, TokenKind::Colon, TokenKind::Comma});
  506. if (!recovery_pos || tokens_->GetKind(*recovery_pos) == TokenKind::Comma) {
  507. state.state = param_finish_state;
  508. PushState(state);
  509. return;
  510. }
  511. SkipTo(*recovery_pos);
  512. }
  513. // Work out the kind of this element.
  514. bool is_type;
  515. if (PositionIs(TokenKind::Colon)) {
  516. is_type = true;
  517. } else if (PositionIs(TokenKind::Equal)) {
  518. is_type = false;
  519. } else {
  520. HandleBraceExpressionParameterError(state, param_finish_state);
  521. return;
  522. }
  523. // If we're changing from unknown, update the related finish states.
  524. if (param_finish_state ==
  525. ParserState::BraceExpressionParameterFinishAsUnknown) {
  526. auto finish_state = PopState();
  527. CARBON_CHECK(finish_state.state ==
  528. ParserState::BraceExpressionFinishAsUnknown);
  529. if (is_type) {
  530. finish_state.state = ParserState::BraceExpressionFinishAsType;
  531. param_finish_state = ParserState::BraceExpressionParameterFinishAsType;
  532. } else {
  533. finish_state.state = ParserState::BraceExpressionFinishAsValue;
  534. param_finish_state = ParserState::BraceExpressionParameterFinishAsValue;
  535. }
  536. PushState(finish_state);
  537. }
  538. auto want_param_finish_state =
  539. is_type ? ParserState::BraceExpressionParameterFinishAsType
  540. : ParserState::BraceExpressionParameterFinishAsValue;
  541. if (param_finish_state != want_param_finish_state) {
  542. HandleBraceExpressionParameterError(state, param_finish_state);
  543. return;
  544. }
  545. // Struct type fields and value fields use the same grammar except
  546. // that one has a `:` separator and the other has an `=` separator.
  547. state.state = param_finish_state;
  548. state.token = Consume();
  549. PushState(state);
  550. PushState(ParserState::Expression);
  551. }
  552. auto Parser::HandleBraceExpressionParameterAfterDesignatorAsTypeState()
  553. -> void {
  554. HandleBraceExpressionParameterAfterDesignator(
  555. ParserState::BraceExpressionParameterFinishAsType);
  556. }
  557. auto Parser::HandleBraceExpressionParameterAfterDesignatorAsValueState()
  558. -> void {
  559. HandleBraceExpressionParameterAfterDesignator(
  560. ParserState::BraceExpressionParameterFinishAsValue);
  561. }
  562. auto Parser::HandleBraceExpressionParameterAfterDesignatorAsUnknownState()
  563. -> void {
  564. HandleBraceExpressionParameterAfterDesignator(
  565. ParserState::BraceExpressionParameterFinishAsUnknown);
  566. }
  567. auto Parser::HandleBraceExpressionParameterFinish(ParseNodeKind node_kind,
  568. ParserState param_state)
  569. -> void {
  570. auto state = PopState();
  571. if (state.has_error) {
  572. AddLeafNode(ParseNodeKind::StructFieldUnknown, state.token,
  573. /*has_error=*/true);
  574. } else {
  575. AddNode(node_kind, state.token, state.subtree_start, /*has_error=*/false);
  576. }
  577. if (ConsumeListToken(ParseNodeKind::StructComma, TokenKind::CloseCurlyBrace,
  578. state.has_error) == ListTokenKind::Comma) {
  579. PushState(param_state);
  580. }
  581. }
  582. auto Parser::HandleBraceExpressionParameterFinishAsTypeState() -> void {
  583. HandleBraceExpressionParameterFinish(
  584. ParseNodeKind::StructFieldType,
  585. ParserState::BraceExpressionParameterAsType);
  586. }
  587. auto Parser::HandleBraceExpressionParameterFinishAsValueState() -> void {
  588. HandleBraceExpressionParameterFinish(
  589. ParseNodeKind::StructFieldValue,
  590. ParserState::BraceExpressionParameterAsValue);
  591. }
  592. auto Parser::HandleBraceExpressionParameterFinishAsUnknownState() -> void {
  593. HandleBraceExpressionParameterFinish(
  594. ParseNodeKind::StructFieldUnknown,
  595. ParserState::BraceExpressionParameterAsUnknown);
  596. }
  597. auto Parser::HandleBraceExpressionFinish(ParseNodeKind node_kind) -> void {
  598. auto state = PopState();
  599. AddNode(node_kind, Consume(), state.subtree_start, state.has_error);
  600. }
  601. auto Parser::HandleBraceExpressionFinishAsTypeState() -> void {
  602. HandleBraceExpressionFinish(ParseNodeKind::StructTypeLiteral);
  603. }
  604. auto Parser::HandleBraceExpressionFinishAsValueState() -> void {
  605. HandleBraceExpressionFinish(ParseNodeKind::StructLiteral);
  606. }
  607. auto Parser::HandleBraceExpressionFinishAsUnknownState() -> void {
  608. HandleBraceExpressionFinish(ParseNodeKind::StructLiteral);
  609. }
  610. auto Parser::HandleCallExpressionState() -> void {
  611. auto state = PopState();
  612. state.state = ParserState::CallExpressionFinish;
  613. PushState(state);
  614. AddNode(ParseNodeKind::CallExpressionStart, Consume(), state.subtree_start,
  615. state.has_error);
  616. if (!PositionIs(TokenKind::CloseParen)) {
  617. PushState(ParserState::CallExpressionParameterFinish);
  618. PushState(ParserState::Expression);
  619. }
  620. }
  621. auto Parser::HandleCallExpressionParameterFinishState() -> void {
  622. auto state = PopState();
  623. if (state.has_error) {
  624. ReturnErrorOnState();
  625. }
  626. if (ConsumeListToken(ParseNodeKind::CallExpressionComma,
  627. TokenKind::CloseParen,
  628. state.has_error) == ListTokenKind::Comma) {
  629. PushState(ParserState::CallExpressionParameterFinish);
  630. PushState(ParserState::Expression);
  631. }
  632. }
  633. auto Parser::HandleCallExpressionFinishState() -> void {
  634. auto state = PopState();
  635. AddNode(ParseNodeKind::CallExpression, Consume(), state.subtree_start,
  636. state.has_error);
  637. }
  638. auto Parser::HandleCodeBlockFinishState() -> void {
  639. auto state = PopState();
  640. // If the block started with an open curly, this is a close curly.
  641. if (tokens_->GetKind(state.token) == TokenKind::OpenCurlyBrace) {
  642. AddNode(ParseNodeKind::CodeBlock, Consume(), state.subtree_start,
  643. state.has_error);
  644. } else {
  645. AddNode(ParseNodeKind::CodeBlock, state.token, state.subtree_start,
  646. /*has_error=*/true);
  647. }
  648. }
  649. auto Parser::HandleDeclarationNameAndParams(bool params_required) -> void {
  650. auto state = PopState();
  651. if (!ConsumeAndAddLeafNodeIf(TokenKind::Identifier,
  652. ParseNodeKind::DeclaredName)) {
  653. emitter_->Emit(*position_, ExpectedDeclarationName,
  654. tokens_->GetKind(state.token));
  655. ReturnErrorOnState();
  656. return;
  657. }
  658. if (PositionIs(TokenKind::OpenSquareBracket)) {
  659. PushState(ParserState::DeclarationNameAndParamsAfterDeduced);
  660. PushState(ParserState::ParameterListAsDeduced);
  661. } else if (PositionIs(TokenKind::OpenParen)) {
  662. PushState(ParserState::ParameterListAsRegular);
  663. } else if (params_required) {
  664. CARBON_DIAGNOSTIC(ParametersRequiredByIntroducer, Error,
  665. "`{0}` requires a `(` for parameters.", TokenKind);
  666. emitter_->Emit(*position_, ParametersRequiredByIntroducer,
  667. tokens_->GetKind(state.token));
  668. ReturnErrorOnState();
  669. }
  670. }
  671. auto Parser::HandleDeclarationNameAndParamsAsOptionalState() -> void {
  672. HandleDeclarationNameAndParams(/*params_required=*/false);
  673. }
  674. auto Parser::HandleDeclarationNameAndParamsAsRequiredState() -> void {
  675. HandleDeclarationNameAndParams(/*params_required=*/true);
  676. }
  677. auto Parser::HandleDeclarationNameAndParamsAfterDeducedState() -> void {
  678. PopAndDiscardState();
  679. if (PositionIs(TokenKind::OpenParen)) {
  680. PushState(ParserState::ParameterListAsRegular);
  681. } else {
  682. CARBON_DIAGNOSTIC(
  683. ParametersRequiredByDeduced, Error,
  684. "A `(` for parameters is required after deduced parameters.");
  685. emitter_->Emit(*position_, ParametersRequiredByDeduced);
  686. ReturnErrorOnState();
  687. }
  688. }
  689. auto Parser::HandleDeclarationScopeLoopState() -> void {
  690. // This maintains the current state unless we're at the end of the scope.
  691. switch (PositionKind()) {
  692. case TokenKind::CloseCurlyBrace:
  693. case TokenKind::EndOfFile: {
  694. // This is the end of the scope, so the loop state ends.
  695. PopAndDiscardState();
  696. break;
  697. }
  698. case TokenKind::Class: {
  699. PushState(ParserState::TypeIntroducerAsClass);
  700. break;
  701. }
  702. case TokenKind::Constraint: {
  703. PushState(ParserState::TypeIntroducerAsNamedConstraint);
  704. break;
  705. }
  706. case TokenKind::Fn: {
  707. PushState(ParserState::FunctionIntroducer);
  708. break;
  709. }
  710. case TokenKind::Interface: {
  711. PushState(ParserState::TypeIntroducerAsInterface);
  712. break;
  713. }
  714. case TokenKind::Semi: {
  715. AddLeafNode(ParseNodeKind::EmptyDeclaration, Consume());
  716. break;
  717. }
  718. case TokenKind::Var: {
  719. PushState(ParserState::VarAsSemicolon);
  720. break;
  721. }
  722. default: {
  723. HandleUnrecognizedDeclaration();
  724. break;
  725. }
  726. }
  727. }
  728. auto Parser::HandleDesignator(bool as_struct) -> void {
  729. auto state = PopState();
  730. // `.` identifier
  731. auto dot = ConsumeChecked(TokenKind::Period);
  732. if (!ConsumeAndAddLeafNodeIf(TokenKind::Identifier,
  733. ParseNodeKind::DesignatedName)) {
  734. CARBON_DIAGNOSTIC(ExpectedIdentifierAfterDot, Error,
  735. "Expected identifier after `.`.");
  736. emitter_->Emit(*position_, ExpectedIdentifierAfterDot);
  737. // If we see a keyword, assume it was intended to be the designated name.
  738. // TODO: Should keywords be valid in designators?
  739. if (PositionKind().is_keyword()) {
  740. AddLeafNode(ParseNodeKind::DesignatedName, Consume(),
  741. /*has_error=*/true);
  742. } else {
  743. AddLeafNode(ParseNodeKind::DesignatedName, *position_,
  744. /*has_error=*/true);
  745. // Indicate the error to the parent state so that it can avoid producing
  746. // more errors.
  747. ReturnErrorOnState();
  748. }
  749. }
  750. AddNode(as_struct ? ParseNodeKind::StructFieldDesignator
  751. : ParseNodeKind::DesignatorExpression,
  752. dot, state.subtree_start, state.has_error);
  753. }
  754. auto Parser::HandleDesignatorAsExpressionState() -> void {
  755. HandleDesignator(/*as_struct=*/false);
  756. }
  757. auto Parser::HandleDesignatorAsStructState() -> void {
  758. HandleDesignator(/*as_struct=*/true);
  759. }
  760. auto Parser::HandleExpressionState() -> void {
  761. auto state = PopState();
  762. // Check for a prefix operator.
  763. if (auto operator_precedence = PrecedenceGroup::ForLeading(PositionKind())) {
  764. if (PrecedenceGroup::GetPriority(state.ambient_precedence,
  765. *operator_precedence) !=
  766. OperatorPriority::RightFirst) {
  767. // The precedence rules don't permit this prefix operator in this
  768. // context. Diagnose this, but carry on and parse it anyway.
  769. emitter_->Emit(*position_, OperatorRequiresParentheses);
  770. } else {
  771. // Check that this operator follows the proper whitespace rules.
  772. DiagnoseOperatorFixity(OperatorFixity::Prefix);
  773. }
  774. PushStateForExpressionLoop(ParserState::ExpressionLoopForPrefix,
  775. state.ambient_precedence, *operator_precedence);
  776. ++position_;
  777. PushStateForExpression(*operator_precedence);
  778. } else {
  779. PushStateForExpressionLoop(ParserState::ExpressionLoop,
  780. state.ambient_precedence,
  781. PrecedenceGroup::ForPostfixExpression());
  782. PushState(ParserState::ExpressionInPostfix);
  783. }
  784. }
  785. auto Parser::HandleExpressionInPostfixState() -> void {
  786. auto state = PopState();
  787. // Continue to the loop state.
  788. state.state = ParserState::ExpressionInPostfixLoop;
  789. // Parses a primary expression, which is either a terminal portion of an
  790. // expression tree, such as an identifier or literal, or a parenthesized
  791. // expression.
  792. switch (PositionKind()) {
  793. case TokenKind::Identifier: {
  794. AddLeafNode(ParseNodeKind::NameReference, Consume());
  795. PushState(state);
  796. break;
  797. }
  798. case TokenKind::IntegerLiteral:
  799. case TokenKind::RealLiteral:
  800. case TokenKind::StringLiteral:
  801. case TokenKind::IntegerTypeLiteral:
  802. case TokenKind::UnsignedIntegerTypeLiteral:
  803. case TokenKind::FloatingPointTypeLiteral:
  804. case TokenKind::StringTypeLiteral: {
  805. AddLeafNode(ParseNodeKind::Literal, Consume());
  806. PushState(state);
  807. break;
  808. }
  809. case TokenKind::OpenCurlyBrace: {
  810. PushState(state);
  811. PushState(ParserState::BraceExpression);
  812. break;
  813. }
  814. case TokenKind::OpenParen: {
  815. PushState(state);
  816. PushState(ParserState::ParenExpression);
  817. break;
  818. }
  819. case TokenKind::SelfValueIdentifier: {
  820. AddLeafNode(ParseNodeKind::SelfValueIdentifier, Consume());
  821. PushState(state);
  822. break;
  823. }
  824. case TokenKind::SelfTypeIdentifier: {
  825. AddLeafNode(ParseNodeKind::SelfTypeIdentifier, Consume());
  826. PushState(state);
  827. break;
  828. }
  829. default: {
  830. // Add a node to keep the parse tree balanced.
  831. AddLeafNode(ParseNodeKind::InvalidParse, *position_, /*has_error=*/true);
  832. CARBON_DIAGNOSTIC(ExpectedExpression, Error, "Expected expression.");
  833. emitter_->Emit(*position_, ExpectedExpression);
  834. ReturnErrorOnState();
  835. break;
  836. }
  837. }
  838. }
  839. auto Parser::HandleExpressionInPostfixLoopState() -> void {
  840. // This is a cyclic state that repeats, so this state is typically pushed back
  841. // on.
  842. auto state = PopState();
  843. state.token = *position_;
  844. switch (PositionKind()) {
  845. case TokenKind::Period: {
  846. PushState(state);
  847. state.state = ParserState::DesignatorAsExpression;
  848. PushState(state);
  849. break;
  850. }
  851. case TokenKind::OpenParen: {
  852. PushState(state);
  853. state.state = ParserState::CallExpression;
  854. PushState(state);
  855. break;
  856. }
  857. default: {
  858. if (state.has_error) {
  859. ReturnErrorOnState();
  860. }
  861. break;
  862. }
  863. }
  864. }
  865. auto Parser::HandleExpressionLoopState() -> void {
  866. auto state = PopState();
  867. auto trailing_operator =
  868. PrecedenceGroup::ForTrailing(PositionKind(), IsTrailingOperatorInfix());
  869. if (!trailing_operator) {
  870. if (state.has_error) {
  871. ReturnErrorOnState();
  872. }
  873. return;
  874. }
  875. auto [operator_precedence, is_binary] = *trailing_operator;
  876. // TODO: If this operator is ambiguous with either the ambient precedence
  877. // or the LHS precedence, and there's a variant with a different fixity
  878. // that would work, use that one instead for error recovery.
  879. if (PrecedenceGroup::GetPriority(state.ambient_precedence,
  880. operator_precedence) !=
  881. OperatorPriority::RightFirst) {
  882. // The precedence rules don't permit this operator in this context. Try
  883. // again in the enclosing expression context.
  884. if (state.has_error) {
  885. ReturnErrorOnState();
  886. }
  887. return;
  888. }
  889. if (PrecedenceGroup::GetPriority(state.lhs_precedence, operator_precedence) !=
  890. OperatorPriority::LeftFirst) {
  891. // Either the LHS operator and this operator are ambiguous, or the
  892. // LHS operator is a unary operator that can't be nested within
  893. // this operator. Either way, parentheses are required.
  894. emitter_->Emit(*position_, OperatorRequiresParentheses);
  895. state.has_error = true;
  896. } else {
  897. DiagnoseOperatorFixity(is_binary ? OperatorFixity::Infix
  898. : OperatorFixity::Postfix);
  899. }
  900. state.token = Consume();
  901. state.lhs_precedence = operator_precedence;
  902. if (is_binary) {
  903. state.state = ParserState::ExpressionLoopForBinary;
  904. PushState(state);
  905. PushStateForExpression(operator_precedence);
  906. } else {
  907. AddNode(ParseNodeKind::PostfixOperator, state.token, state.subtree_start,
  908. state.has_error);
  909. state.has_error = false;
  910. PushState(state);
  911. }
  912. }
  913. auto Parser::HandleExpressionLoopForBinaryState() -> void {
  914. auto state = PopState();
  915. AddNode(ParseNodeKind::InfixOperator, state.token, state.subtree_start,
  916. state.has_error);
  917. state.state = ParserState::ExpressionLoop;
  918. state.has_error = false;
  919. PushState(state);
  920. }
  921. auto Parser::HandleExpressionLoopForPrefixState() -> void {
  922. auto state = PopState();
  923. AddNode(ParseNodeKind::PrefixOperator, state.token, state.subtree_start,
  924. state.has_error);
  925. state.state = ParserState::ExpressionLoop;
  926. state.has_error = false;
  927. PushState(state);
  928. }
  929. auto Parser::HandleExpressionStatementFinishState() -> void {
  930. auto state = PopState();
  931. if (auto semi = ConsumeIf(TokenKind::Semi)) {
  932. AddNode(ParseNodeKind::ExpressionStatement, *semi, state.subtree_start,
  933. state.has_error);
  934. return;
  935. }
  936. if (!state.has_error) {
  937. emitter_->Emit(*position_, ExpectedSemiAfterExpression);
  938. }
  939. if (auto semi_token = SkipPastLikelyEnd(state.token)) {
  940. AddNode(ParseNodeKind::ExpressionStatement, *semi_token,
  941. state.subtree_start,
  942. /*has_error=*/true);
  943. return;
  944. }
  945. // Found junk not even followed by a `;`, no node to add.
  946. ReturnErrorOnState();
  947. }
  948. auto Parser::HandleFunctionIntroducerState() -> void {
  949. auto state = PopState();
  950. AddLeafNode(ParseNodeKind::FunctionIntroducer, Consume());
  951. state.state = ParserState::FunctionAfterParameters;
  952. PushState(state);
  953. state.state = ParserState::DeclarationNameAndParamsAsRequired;
  954. PushState(state);
  955. }
  956. auto Parser::HandleFunctionAfterParametersState() -> void {
  957. auto state = PopState();
  958. // Regardless of whether there's a return type, we'll finish the signature.
  959. state.state = ParserState::FunctionSignatureFinish;
  960. PushState(state);
  961. // If there is a return type, parse the expression before adding the return
  962. // type nod.e
  963. if (PositionIs(TokenKind::MinusGreater)) {
  964. PushState(ParserState::FunctionReturnTypeFinish);
  965. ++position_;
  966. PushStateForExpression(PrecedenceGroup::ForType());
  967. }
  968. }
  969. auto Parser::HandleFunctionReturnTypeFinishState() -> void {
  970. auto state = PopState();
  971. AddNode(ParseNodeKind::ReturnType, state.token, state.subtree_start,
  972. state.has_error);
  973. }
  974. auto Parser::HandleFunctionSignatureFinishState() -> void {
  975. auto state = PopState();
  976. switch (PositionKind()) {
  977. case TokenKind::Semi: {
  978. AddNode(ParseNodeKind::FunctionDeclaration, Consume(),
  979. state.subtree_start, state.has_error);
  980. break;
  981. }
  982. case TokenKind::OpenCurlyBrace: {
  983. if (auto context = GetDeclarationContext();
  984. context == DeclarationContext::Interface ||
  985. context == DeclarationContext::NamedConstraint) {
  986. CARBON_DIAGNOSTIC(
  987. MethodImplNotAllowed, Error,
  988. "Method implementations are not allowed in interfaces.");
  989. emitter_->Emit(*position_, MethodImplNotAllowed);
  990. HandleDeclarationError(state, ParseNodeKind::FunctionDeclaration,
  991. /*skip_past_likely_end=*/true);
  992. break;
  993. }
  994. AddNode(ParseNodeKind::FunctionDefinitionStart, Consume(),
  995. state.subtree_start, state.has_error);
  996. // Any error is recorded on the FunctionDefinitionStart.
  997. state.has_error = false;
  998. state.state = ParserState::FunctionDefinitionFinish;
  999. PushState(state);
  1000. PushState(ParserState::StatementScopeLoop);
  1001. break;
  1002. }
  1003. default: {
  1004. if (!state.has_error) {
  1005. emitter_->Emit(*position_, ExpectedDeclarationSemiOrDefinition,
  1006. TokenKind::Fn);
  1007. }
  1008. // Only need to skip if we've not already found a new line.
  1009. bool skip_past_likely_end =
  1010. tokens_->GetLine(*position_) == tokens_->GetLine(state.token);
  1011. HandleDeclarationError(state, ParseNodeKind::FunctionDeclaration,
  1012. skip_past_likely_end);
  1013. break;
  1014. }
  1015. }
  1016. }
  1017. auto Parser::HandleFunctionDefinitionFinishState() -> void {
  1018. auto state = PopState();
  1019. AddNode(ParseNodeKind::FunctionDefinition, Consume(), state.subtree_start,
  1020. state.has_error);
  1021. }
  1022. auto Parser::HandlePackageState() -> void {
  1023. auto state = PopState();
  1024. AddLeafNode(ParseNodeKind::PackageIntroducer, Consume());
  1025. auto exit_on_parse_error = [&]() {
  1026. auto semi_token = SkipPastLikelyEnd(state.token);
  1027. return AddNode(ParseNodeKind::PackageDirective,
  1028. semi_token ? *semi_token : state.token, state.subtree_start,
  1029. /*has_error=*/true);
  1030. };
  1031. if (!ConsumeAndAddLeafNodeIf(TokenKind::Identifier,
  1032. ParseNodeKind::DeclaredName)) {
  1033. CARBON_DIAGNOSTIC(ExpectedIdentifierAfterPackage, Error,
  1034. "Expected identifier after `package`.");
  1035. emitter_->Emit(*position_, ExpectedIdentifierAfterPackage);
  1036. exit_on_parse_error();
  1037. return;
  1038. }
  1039. bool library_parsed = false;
  1040. if (auto library_token = ConsumeIf(TokenKind::Library)) {
  1041. auto library_start = tree_->size();
  1042. if (!ConsumeAndAddLeafNodeIf(TokenKind::StringLiteral,
  1043. ParseNodeKind::Literal)) {
  1044. CARBON_DIAGNOSTIC(
  1045. ExpectedLibraryName, Error,
  1046. "Expected a string literal to specify the library name.");
  1047. emitter_->Emit(*position_, ExpectedLibraryName);
  1048. exit_on_parse_error();
  1049. return;
  1050. }
  1051. AddNode(ParseNodeKind::PackageLibrary, *library_token, library_start,
  1052. /*has_error=*/false);
  1053. library_parsed = true;
  1054. }
  1055. switch (auto api_or_impl_token = tokens_->GetKind(*(position_))) {
  1056. case TokenKind::Api: {
  1057. AddLeafNode(ParseNodeKind::PackageApi, Consume());
  1058. break;
  1059. }
  1060. case TokenKind::Impl: {
  1061. AddLeafNode(ParseNodeKind::PackageImpl, Consume());
  1062. break;
  1063. }
  1064. default: {
  1065. if (!library_parsed && api_or_impl_token == TokenKind::StringLiteral) {
  1066. // If we come acroess a string literal and we didn't parse `library
  1067. // "..."` yet, then most probably the user forgot to add `library`
  1068. // before the library name.
  1069. CARBON_DIAGNOSTIC(MissingLibraryKeyword, Error,
  1070. "Missing `library` keyword.");
  1071. emitter_->Emit(*position_, MissingLibraryKeyword);
  1072. } else {
  1073. CARBON_DIAGNOSTIC(ExpectedApiOrImpl, Error,
  1074. "Expected a `api` or `impl`.");
  1075. emitter_->Emit(*position_, ExpectedApiOrImpl);
  1076. }
  1077. exit_on_parse_error();
  1078. return;
  1079. }
  1080. }
  1081. if (!PositionIs(TokenKind::Semi)) {
  1082. CARBON_DIAGNOSTIC(ExpectedSemiToEndPackageDirective, Error,
  1083. "Expected `;` to end package directive.");
  1084. emitter_->Emit(*position_, ExpectedSemiToEndPackageDirective);
  1085. exit_on_parse_error();
  1086. return;
  1087. }
  1088. AddNode(ParseNodeKind::PackageDirective, Consume(), state.subtree_start,
  1089. /*has_error=*/false);
  1090. }
  1091. auto Parser::HandleParameter(ParserState pattern_state,
  1092. ParserState finish_state) -> void {
  1093. PopAndDiscardState();
  1094. PushState(finish_state);
  1095. PushState(pattern_state);
  1096. }
  1097. auto Parser::HandleParameterAsDeducedState() -> void {
  1098. HandleParameter(ParserState::PatternAsDeducedParameter,
  1099. ParserState::ParameterFinishAsDeduced);
  1100. }
  1101. auto Parser::HandleParameterAsRegularState() -> void {
  1102. HandleParameter(ParserState::PatternAsParameter,
  1103. ParserState::ParameterFinishAsRegular);
  1104. }
  1105. auto Parser::HandleParameterFinish(TokenKind close_token,
  1106. ParserState param_state) -> void {
  1107. auto state = PopState();
  1108. if (state.has_error) {
  1109. ReturnErrorOnState();
  1110. }
  1111. if (ConsumeListToken(ParseNodeKind::ParameterListComma, close_token,
  1112. state.has_error) == ListTokenKind::Comma) {
  1113. PushState(param_state);
  1114. }
  1115. }
  1116. auto Parser::HandleParameterFinishAsDeducedState() -> void {
  1117. HandleParameterFinish(TokenKind::CloseSquareBracket,
  1118. ParserState::ParameterAsDeduced);
  1119. }
  1120. auto Parser::HandleParameterFinishAsRegularState() -> void {
  1121. HandleParameterFinish(TokenKind::CloseParen, ParserState::ParameterAsRegular);
  1122. }
  1123. auto Parser::HandleParameterList(ParseNodeKind parse_node_kind,
  1124. TokenKind open_token_kind,
  1125. TokenKind close_token_kind,
  1126. ParserState param_state,
  1127. ParserState finish_state) -> void {
  1128. PopAndDiscardState();
  1129. PushState(finish_state);
  1130. AddLeafNode(parse_node_kind, ConsumeChecked(open_token_kind));
  1131. if (!PositionIs(close_token_kind)) {
  1132. PushState(param_state);
  1133. }
  1134. }
  1135. auto Parser::HandleParameterListAsDeducedState() -> void {
  1136. HandleParameterList(
  1137. ParseNodeKind::DeducedParameterListStart, TokenKind::OpenSquareBracket,
  1138. TokenKind::CloseSquareBracket, ParserState::ParameterAsDeduced,
  1139. ParserState::ParameterListFinishAsDeduced);
  1140. }
  1141. auto Parser::HandleParameterListAsRegularState() -> void {
  1142. HandleParameterList(ParseNodeKind::ParameterListStart, TokenKind::OpenParen,
  1143. TokenKind::CloseParen, ParserState::ParameterAsRegular,
  1144. ParserState::ParameterListFinishAsRegular);
  1145. }
  1146. auto Parser::HandleParameterListFinish(ParseNodeKind parse_node_kind,
  1147. TokenKind token_kind) -> void {
  1148. auto state = PopState();
  1149. AddNode(parse_node_kind, ConsumeChecked(token_kind), state.subtree_start,
  1150. state.has_error);
  1151. }
  1152. auto Parser::HandleParameterListFinishAsDeducedState() -> void {
  1153. HandleParameterListFinish(ParseNodeKind::DeducedParameterList,
  1154. TokenKind::CloseSquareBracket);
  1155. }
  1156. auto Parser::HandleParameterListFinishAsRegularState() -> void {
  1157. HandleParameterListFinish(ParseNodeKind::ParameterList,
  1158. TokenKind::CloseParen);
  1159. }
  1160. auto Parser::HandleParenCondition(ParseNodeKind start_kind,
  1161. ParserState finish_state) -> void {
  1162. auto state = PopState();
  1163. ConsumeAndAddOpenParen(state.token, start_kind);
  1164. state.state = finish_state;
  1165. PushState(state);
  1166. PushState(ParserState::Expression);
  1167. }
  1168. auto Parser::HandleParenConditionAsIfState() -> void {
  1169. HandleParenCondition(ParseNodeKind::IfConditionStart,
  1170. ParserState::ParenConditionFinishAsIf);
  1171. }
  1172. auto Parser::HandleParenConditionAsWhileState() -> void {
  1173. HandleParenCondition(ParseNodeKind::WhileConditionStart,
  1174. ParserState::ParenConditionFinishAsWhile);
  1175. }
  1176. auto Parser::HandleParenConditionFinishAsIfState() -> void {
  1177. auto state = PopState();
  1178. ConsumeAndAddCloseParen(state, ParseNodeKind::IfCondition);
  1179. }
  1180. auto Parser::HandleParenConditionFinishAsWhileState() -> void {
  1181. auto state = PopState();
  1182. ConsumeAndAddCloseParen(state, ParseNodeKind::WhileCondition);
  1183. }
  1184. auto Parser::HandleParenExpressionState() -> void {
  1185. auto state = PopState();
  1186. // Advance past the open paren.
  1187. AddLeafNode(ParseNodeKind::ParenExpressionOrTupleLiteralStart,
  1188. ConsumeChecked(TokenKind::OpenParen));
  1189. if (PositionIs(TokenKind::CloseParen)) {
  1190. state.state = ParserState::ParenExpressionFinishAsTuple;
  1191. PushState(state);
  1192. } else {
  1193. state.state = ParserState::ParenExpressionFinishAsNormal;
  1194. PushState(state);
  1195. PushState(ParserState::ParenExpressionParameterFinishAsUnknown);
  1196. PushState(ParserState::Expression);
  1197. }
  1198. }
  1199. auto Parser::HandleParenExpressionParameterFinish(bool as_tuple) -> void {
  1200. auto state = PopState();
  1201. auto list_token_kind = ConsumeListToken(
  1202. ParseNodeKind::TupleLiteralComma, TokenKind::CloseParen, state.has_error);
  1203. if (list_token_kind == ListTokenKind::Close) {
  1204. return;
  1205. }
  1206. // If this is the first item and a comma was found, switch to tuple handling.
  1207. // Note this could be `(expr,)` so we may not reuse the current state, but
  1208. // it's still necessary to switch the parent.
  1209. if (!as_tuple) {
  1210. state.state = ParserState::ParenExpressionParameterFinishAsTuple;
  1211. auto finish_state = PopState();
  1212. CARBON_CHECK(finish_state.state ==
  1213. ParserState::ParenExpressionFinishAsNormal)
  1214. << "Unexpected parent state, found: " << finish_state.state;
  1215. finish_state.state = ParserState::ParenExpressionFinishAsTuple;
  1216. PushState(finish_state);
  1217. }
  1218. // On a comma, push another expression handler.
  1219. if (list_token_kind == ListTokenKind::Comma) {
  1220. PushState(state);
  1221. PushState(ParserState::Expression);
  1222. }
  1223. }
  1224. auto Parser::HandleParenExpressionParameterFinishAsUnknownState() -> void {
  1225. HandleParenExpressionParameterFinish(/*as_tuple=*/false);
  1226. }
  1227. auto Parser::HandleParenExpressionParameterFinishAsTupleState() -> void {
  1228. HandleParenExpressionParameterFinish(/*as_tuple=*/true);
  1229. }
  1230. auto Parser::HandleParenExpressionFinishAsNormalState() -> void {
  1231. auto state = PopState();
  1232. AddNode(ParseNodeKind::ParenExpression, Consume(), state.subtree_start,
  1233. state.has_error);
  1234. }
  1235. auto Parser::HandleParenExpressionFinishAsTupleState() -> void {
  1236. auto state = PopState();
  1237. AddNode(ParseNodeKind::TupleLiteral, Consume(), state.subtree_start,
  1238. state.has_error);
  1239. }
  1240. auto Parser::ConsumeIfPatternKeyword(TokenKind keyword_token,
  1241. ParserState keyword_state,
  1242. int subtree_start) -> void {
  1243. if (auto token = ConsumeIf(keyword_token)) {
  1244. PushState(StateStackEntry(
  1245. keyword_state, PrecedenceGroup::ForTopLevelExpression(),
  1246. PrecedenceGroup::ForTopLevelExpression(), *token, subtree_start));
  1247. }
  1248. }
  1249. auto Parser::HandlePattern(PatternKind pattern_kind) -> void {
  1250. auto state = PopState();
  1251. // Parameters may have keywords prefixing the pattern. They become the parent
  1252. // for the full PatternBinding.
  1253. if (pattern_kind != PatternKind::Variable) {
  1254. ConsumeIfPatternKeyword(TokenKind::Template, ParserState::PatternTemplate,
  1255. state.subtree_start);
  1256. ConsumeIfPatternKeyword(TokenKind::Addr, ParserState::PatternAddress,
  1257. state.subtree_start);
  1258. }
  1259. // Handle an invalid pattern introducer for parameters and variables.
  1260. auto on_error = [&]() {
  1261. switch (pattern_kind) {
  1262. case PatternKind::DeducedParameter:
  1263. case PatternKind::Parameter: {
  1264. CARBON_DIAGNOSTIC(ExpectedParameterName, Error,
  1265. "Expected parameter declaration.");
  1266. emitter_->Emit(*position_, ExpectedParameterName);
  1267. break;
  1268. }
  1269. case PatternKind::Variable: {
  1270. CARBON_DIAGNOSTIC(ExpectedVariableName, Error,
  1271. "Expected pattern in `var` declaration.");
  1272. emitter_->Emit(*position_, ExpectedVariableName);
  1273. break;
  1274. }
  1275. }
  1276. // Add a placeholder for the type.
  1277. AddLeafNode(ParseNodeKind::InvalidParse, *position_, /*has_error=*/true);
  1278. state.state = ParserState::PatternFinishAsRegular;
  1279. state.has_error = true;
  1280. PushState(state);
  1281. };
  1282. // The first item should be an identifier or, for deduced parameters, `self`.
  1283. bool has_name = false;
  1284. if (auto identifier = ConsumeIf(TokenKind::Identifier)) {
  1285. AddLeafNode(ParseNodeKind::DeclaredName, *identifier);
  1286. has_name = true;
  1287. } else if (pattern_kind == PatternKind::DeducedParameter) {
  1288. if (auto self = ConsumeIf(TokenKind::SelfValueIdentifier)) {
  1289. AddLeafNode(ParseNodeKind::SelfValueIdentifier, *self);
  1290. has_name = true;
  1291. }
  1292. }
  1293. if (!has_name) {
  1294. // Add a placeholder for the name.
  1295. AddLeafNode(ParseNodeKind::DeclaredName, *position_, /*has_error=*/true);
  1296. on_error();
  1297. return;
  1298. }
  1299. if (auto kind = PositionKind();
  1300. kind == TokenKind::Colon || kind == TokenKind::ColonExclaim) {
  1301. state.state = kind == TokenKind::Colon
  1302. ? ParserState::PatternFinishAsRegular
  1303. : ParserState::PatternFinishAsGeneric;
  1304. // Use the `:` or `:!` for the root node.
  1305. state.token = Consume();
  1306. PushState(state);
  1307. PushStateForExpression(PrecedenceGroup::ForType());
  1308. } else {
  1309. on_error();
  1310. return;
  1311. }
  1312. }
  1313. auto Parser::HandlePatternAsDeducedParameterState() -> void {
  1314. HandlePattern(PatternKind::DeducedParameter);
  1315. }
  1316. auto Parser::HandlePatternAsParameterState() -> void {
  1317. HandlePattern(PatternKind::Parameter);
  1318. }
  1319. auto Parser::HandlePatternAsVariableState() -> void {
  1320. HandlePattern(PatternKind::Variable);
  1321. }
  1322. auto Parser::HandlePatternFinish(ParseNodeKind node_kind) -> void {
  1323. auto state = PopState();
  1324. AddNode(node_kind, state.token, state.subtree_start, state.has_error);
  1325. // Propagate errors to the parent state so that they can take different
  1326. // actions on invalid patterns.
  1327. if (state.has_error) {
  1328. ReturnErrorOnState();
  1329. }
  1330. }
  1331. auto Parser::HandlePatternFinishAsGenericState() -> void {
  1332. HandlePatternFinish(ParseNodeKind::GenericPatternBinding);
  1333. }
  1334. auto Parser::HandlePatternFinishAsRegularState() -> void {
  1335. HandlePatternFinish(ParseNodeKind::PatternBinding);
  1336. }
  1337. auto Parser::HandlePatternAddressState() -> void {
  1338. auto state = PopState();
  1339. AddNode(ParseNodeKind::Address, state.token, state.subtree_start,
  1340. state.has_error);
  1341. // If an error was encountered, propagate it while adding a node.
  1342. if (state.has_error) {
  1343. ReturnErrorOnState();
  1344. }
  1345. }
  1346. auto Parser::HandlePatternTemplateState() -> void {
  1347. auto state = PopState();
  1348. AddNode(ParseNodeKind::Template, state.token, state.subtree_start,
  1349. state.has_error);
  1350. // If an error was encountered, propagate it while adding a node.
  1351. if (state.has_error) {
  1352. ReturnErrorOnState();
  1353. }
  1354. }
  1355. auto Parser::HandleStatementState() -> void {
  1356. PopAndDiscardState();
  1357. switch (PositionKind()) {
  1358. case TokenKind::Break: {
  1359. PushState(ParserState::StatementBreakFinish);
  1360. AddLeafNode(ParseNodeKind::BreakStatementStart, Consume());
  1361. break;
  1362. }
  1363. case TokenKind::Continue: {
  1364. PushState(ParserState::StatementContinueFinish);
  1365. AddLeafNode(ParseNodeKind::ContinueStatementStart, Consume());
  1366. break;
  1367. }
  1368. case TokenKind::For: {
  1369. PushState(ParserState::StatementForFinish);
  1370. PushState(ParserState::StatementForHeader);
  1371. ++position_;
  1372. break;
  1373. }
  1374. case TokenKind::If: {
  1375. PushState(ParserState::StatementIf);
  1376. break;
  1377. }
  1378. case TokenKind::Return: {
  1379. PushState(ParserState::StatementReturn);
  1380. break;
  1381. }
  1382. case TokenKind::Var: {
  1383. PushState(ParserState::VarAsSemicolon);
  1384. break;
  1385. }
  1386. case TokenKind::While: {
  1387. PushState(ParserState::StatementWhile);
  1388. break;
  1389. }
  1390. default: {
  1391. PushState(ParserState::ExpressionStatementFinish);
  1392. PushState(ParserState::Expression);
  1393. break;
  1394. }
  1395. }
  1396. }
  1397. auto Parser::HandleStatementBreakFinishState() -> void {
  1398. HandleStatementKeywordFinish(ParseNodeKind::BreakStatement);
  1399. }
  1400. auto Parser::HandleStatementContinueFinishState() -> void {
  1401. HandleStatementKeywordFinish(ParseNodeKind::ContinueStatement);
  1402. }
  1403. auto Parser::HandleStatementForHeaderState() -> void {
  1404. auto state = PopState();
  1405. ConsumeAndAddOpenParen(state.token, ParseNodeKind::ForHeaderStart);
  1406. state.state = ParserState::StatementForHeaderIn;
  1407. if (PositionIs(TokenKind::Var)) {
  1408. PushState(state);
  1409. PushState(ParserState::VarAsFor);
  1410. } else {
  1411. CARBON_DIAGNOSTIC(ExpectedVariableDeclaration, Error,
  1412. "Expected `var` declaration.");
  1413. emitter_->Emit(*position_, ExpectedVariableDeclaration);
  1414. if (auto next_in = FindNextOf({TokenKind::In})) {
  1415. SkipTo(*next_in);
  1416. ++position_;
  1417. }
  1418. state.has_error = true;
  1419. PushState(state);
  1420. }
  1421. }
  1422. auto Parser::HandleStatementForHeaderInState() -> void {
  1423. auto state = PopState();
  1424. state.state = ParserState::StatementForHeaderFinish;
  1425. PushState(state);
  1426. PushState(ParserState::Expression);
  1427. }
  1428. auto Parser::HandleStatementForHeaderFinishState() -> void {
  1429. auto state = PopState();
  1430. ConsumeAndAddCloseParen(state, ParseNodeKind::ForHeader);
  1431. PushState(ParserState::CodeBlock);
  1432. }
  1433. auto Parser::HandleStatementForFinishState() -> void {
  1434. auto state = PopState();
  1435. AddNode(ParseNodeKind::ForStatement, state.token, state.subtree_start,
  1436. state.has_error);
  1437. }
  1438. auto Parser::HandleStatementIfState() -> void {
  1439. PopAndDiscardState();
  1440. PushState(ParserState::StatementIfConditionFinish);
  1441. PushState(ParserState::ParenConditionAsIf);
  1442. ++position_;
  1443. }
  1444. auto Parser::HandleStatementIfConditionFinishState() -> void {
  1445. auto state = PopState();
  1446. state.state = ParserState::StatementIfThenBlockFinish;
  1447. PushState(state);
  1448. PushState(ParserState::CodeBlock);
  1449. }
  1450. auto Parser::HandleStatementIfThenBlockFinishState() -> void {
  1451. auto state = PopState();
  1452. if (ConsumeAndAddLeafNodeIf(TokenKind::Else,
  1453. ParseNodeKind::IfStatementElse)) {
  1454. state.state = ParserState::StatementIfElseBlockFinish;
  1455. PushState(state);
  1456. // `else if` is permitted as a special case.
  1457. PushState(PositionIs(TokenKind::If) ? ParserState::StatementIf
  1458. : ParserState::CodeBlock);
  1459. } else {
  1460. AddNode(ParseNodeKind::IfStatement, state.token, state.subtree_start,
  1461. state.has_error);
  1462. }
  1463. }
  1464. auto Parser::HandleStatementIfElseBlockFinishState() -> void {
  1465. auto state = PopState();
  1466. AddNode(ParseNodeKind::IfStatement, state.token, state.subtree_start,
  1467. state.has_error);
  1468. }
  1469. auto Parser::HandleStatementKeywordFinish(ParseNodeKind node_kind) -> void {
  1470. auto state = PopState();
  1471. auto semi = ConsumeIf(TokenKind::Semi);
  1472. if (!semi) {
  1473. CARBON_DIAGNOSTIC(ExpectedSemiAfter, Error, "Expected `;` after `{0}`.",
  1474. TokenKind);
  1475. emitter_->Emit(*position_, ExpectedSemiAfter,
  1476. tokens_->GetKind(state.token));
  1477. state.has_error = true;
  1478. // Recover to the next semicolon if possible, otherwise indicate the
  1479. // keyword for the error.
  1480. semi = SkipPastLikelyEnd(state.token);
  1481. if (!semi) {
  1482. semi = state.token;
  1483. }
  1484. }
  1485. AddNode(node_kind, *semi, state.subtree_start, state.has_error);
  1486. }
  1487. auto Parser::HandleStatementReturnState() -> void {
  1488. auto state = PopState();
  1489. state.state = ParserState::StatementReturnFinish;
  1490. PushState(state);
  1491. AddLeafNode(ParseNodeKind::ReturnStatementStart, Consume());
  1492. if (!PositionIs(TokenKind::Semi)) {
  1493. PushState(ParserState::Expression);
  1494. }
  1495. }
  1496. auto Parser::HandleStatementReturnFinishState() -> void {
  1497. HandleStatementKeywordFinish(ParseNodeKind::ReturnStatement);
  1498. }
  1499. auto Parser::HandleStatementScopeLoopState() -> void {
  1500. // This maintains the current state until we're at the end of the scope.
  1501. auto token_kind = PositionKind();
  1502. if (token_kind == TokenKind::CloseCurlyBrace) {
  1503. auto state = PopState();
  1504. if (state.has_error) {
  1505. ReturnErrorOnState();
  1506. }
  1507. } else {
  1508. PushState(ParserState::Statement);
  1509. }
  1510. }
  1511. auto Parser::HandleStatementWhileState() -> void {
  1512. PopAndDiscardState();
  1513. PushState(ParserState::StatementWhileConditionFinish);
  1514. PushState(ParserState::ParenConditionAsWhile);
  1515. ++position_;
  1516. }
  1517. auto Parser::HandleStatementWhileConditionFinishState() -> void {
  1518. auto state = PopState();
  1519. state.state = ParserState::StatementWhileBlockFinish;
  1520. PushState(state);
  1521. PushState(ParserState::CodeBlock);
  1522. }
  1523. auto Parser::HandleStatementWhileBlockFinishState() -> void {
  1524. auto state = PopState();
  1525. AddNode(ParseNodeKind::WhileStatement, state.token, state.subtree_start,
  1526. state.has_error);
  1527. }
  1528. auto Parser::HandleTypeIntroducer(ParseNodeKind introducer_kind,
  1529. ParserState after_params_state) -> void {
  1530. auto state = PopState();
  1531. AddLeafNode(introducer_kind, Consume());
  1532. state.state = after_params_state;
  1533. PushState(state);
  1534. state.state = ParserState::DeclarationNameAndParamsAsOptional;
  1535. PushState(state);
  1536. }
  1537. auto Parser::HandleTypeIntroducerAsClassState() -> void {
  1538. HandleTypeIntroducer(ParseNodeKind::ClassIntroducer,
  1539. ParserState::TypeAfterParamsAsClass);
  1540. }
  1541. auto Parser::HandleTypeIntroducerAsInterfaceState() -> void {
  1542. HandleTypeIntroducer(ParseNodeKind::InterfaceIntroducer,
  1543. ParserState::TypeAfterParamsAsInterface);
  1544. }
  1545. auto Parser::HandleTypeIntroducerAsNamedConstraintState() -> void {
  1546. HandleTypeIntroducer(ParseNodeKind::NamedConstraintIntroducer,
  1547. ParserState::TypeAfterParamsAsNamedConstraint);
  1548. }
  1549. auto Parser::HandleTypeAfterParams(ParseNodeKind declaration_kind,
  1550. ParseNodeKind definition_start_kind,
  1551. ParserState definition_finish_state)
  1552. -> void {
  1553. auto state = PopState();
  1554. if (state.has_error) {
  1555. HandleDeclarationError(state, declaration_kind,
  1556. /*skip_past_likely_end=*/true);
  1557. return;
  1558. }
  1559. if (auto semi = ConsumeIf(TokenKind::Semi)) {
  1560. AddNode(declaration_kind, *semi, state.subtree_start, state.has_error);
  1561. return;
  1562. }
  1563. if (!PositionIs(TokenKind::OpenCurlyBrace)) {
  1564. emitter_->Emit(*position_, ExpectedDeclarationSemiOrDefinition,
  1565. tokens_->GetKind(state.token));
  1566. HandleDeclarationError(state, declaration_kind,
  1567. /*skip_past_likely_end=*/true);
  1568. return;
  1569. }
  1570. state.state = definition_finish_state;
  1571. PushState(state);
  1572. PushState(ParserState::DeclarationScopeLoop);
  1573. AddNode(definition_start_kind, Consume(), state.subtree_start,
  1574. state.has_error);
  1575. }
  1576. auto Parser::HandleTypeAfterParamsAsClassState() -> void {
  1577. HandleTypeAfterParams(ParseNodeKind::ClassDeclaration,
  1578. ParseNodeKind::ClassDefinitionStart,
  1579. ParserState::TypeDefinitionFinishAsClass);
  1580. }
  1581. auto Parser::HandleTypeAfterParamsAsInterfaceState() -> void {
  1582. HandleTypeAfterParams(ParseNodeKind::InterfaceDeclaration,
  1583. ParseNodeKind::InterfaceDefinitionStart,
  1584. ParserState::TypeDefinitionFinishAsInterface);
  1585. }
  1586. auto Parser::HandleTypeAfterParamsAsNamedConstraintState() -> void {
  1587. HandleTypeAfterParams(ParseNodeKind::NamedConstraintDeclaration,
  1588. ParseNodeKind::NamedConstraintDefinitionStart,
  1589. ParserState::TypeDefinitionFinishAsNamedConstraint);
  1590. }
  1591. auto Parser::HandleTypeDefinitionFinish(ParseNodeKind definition_kind) -> void {
  1592. auto state = PopState();
  1593. AddNode(definition_kind, Consume(), state.subtree_start, state.has_error);
  1594. }
  1595. auto Parser::HandleTypeDefinitionFinishAsClassState() -> void {
  1596. HandleTypeDefinitionFinish(ParseNodeKind::ClassDefinition);
  1597. }
  1598. auto Parser::HandleTypeDefinitionFinishAsInterfaceState() -> void {
  1599. HandleTypeDefinitionFinish(ParseNodeKind::InterfaceDefinition);
  1600. }
  1601. auto Parser::HandleTypeDefinitionFinishAsNamedConstraintState() -> void {
  1602. HandleTypeDefinitionFinish(ParseNodeKind::NamedConstraintDefinition);
  1603. }
  1604. auto Parser::HandleVar(ParserState finish_state) -> void {
  1605. PopAndDiscardState();
  1606. // These will start at the `var`.
  1607. PushState(finish_state);
  1608. PushState(ParserState::VarAfterPattern);
  1609. AddLeafNode(ParseNodeKind::VariableIntroducer, Consume());
  1610. // This will start at the pattern.
  1611. PushState(ParserState::PatternAsVariable);
  1612. }
  1613. auto Parser::HandleVarAsSemicolonState() -> void {
  1614. HandleVar(ParserState::VarFinishAsSemicolon);
  1615. }
  1616. auto Parser::HandleVarAsForState() -> void {
  1617. HandleVar(ParserState::VarFinishAsFor);
  1618. }
  1619. auto Parser::HandleVarAfterPatternState() -> void {
  1620. auto state = PopState();
  1621. if (state.has_error) {
  1622. if (auto after_pattern = FindNextOf({TokenKind::Equal, TokenKind::Semi})) {
  1623. SkipTo(*after_pattern);
  1624. }
  1625. }
  1626. if (auto equals = ConsumeIf(TokenKind::Equal)) {
  1627. AddLeafNode(ParseNodeKind::VariableInitializer, *equals);
  1628. PushState(ParserState::Expression);
  1629. }
  1630. }
  1631. auto Parser::HandleVarFinishAsSemicolonState() -> void {
  1632. auto state = PopState();
  1633. auto end_token = state.token;
  1634. if (PositionIs(TokenKind::Semi)) {
  1635. end_token = Consume();
  1636. } else {
  1637. emitter_->Emit(*position_, ExpectedSemiAfterExpression);
  1638. state.has_error = true;
  1639. if (auto semi_token = SkipPastLikelyEnd(state.token)) {
  1640. end_token = *semi_token;
  1641. }
  1642. }
  1643. AddNode(ParseNodeKind::VariableDeclaration, end_token, state.subtree_start,
  1644. state.has_error);
  1645. }
  1646. auto Parser::HandleVarFinishAsForState() -> void {
  1647. auto state = PopState();
  1648. auto end_token = state.token;
  1649. if (PositionIs(TokenKind::In)) {
  1650. end_token = Consume();
  1651. } else if (PositionIs(TokenKind::Colon)) {
  1652. CARBON_DIAGNOSTIC(ExpectedInNotColon, Error,
  1653. "`:` should be replaced by `in`.");
  1654. emitter_->Emit(*position_, ExpectedInNotColon);
  1655. state.has_error = true;
  1656. end_token = Consume();
  1657. } else {
  1658. CARBON_DIAGNOSTIC(ExpectedIn, Error,
  1659. "Expected `in` after loop `var` declaration.");
  1660. emitter_->Emit(*position_, ExpectedIn);
  1661. state.has_error = true;
  1662. }
  1663. AddNode(ParseNodeKind::ForIn, end_token, state.subtree_start,
  1664. state.has_error);
  1665. }
  1666. } // namespace Carbon