parser.cpp 63 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959
  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(
  521. state, ParserState::BraceExpressionParameterFinishAsUnknown);
  522. return;
  523. }
  524. // If we're changing from unknown, update the related finish states.
  525. if (param_finish_state ==
  526. ParserState::BraceExpressionParameterFinishAsUnknown) {
  527. auto finish_state = PopState();
  528. CARBON_CHECK(finish_state.state ==
  529. ParserState::BraceExpressionFinishAsUnknown);
  530. if (is_type) {
  531. finish_state.state = ParserState::BraceExpressionFinishAsType;
  532. param_finish_state = ParserState::BraceExpressionParameterFinishAsType;
  533. } else {
  534. finish_state.state = ParserState::BraceExpressionFinishAsValue;
  535. param_finish_state = ParserState::BraceExpressionParameterFinishAsValue;
  536. }
  537. PushState(finish_state);
  538. }
  539. auto want_param_finish_state =
  540. is_type ? ParserState::BraceExpressionParameterFinishAsType
  541. : ParserState::BraceExpressionParameterFinishAsValue;
  542. if (param_finish_state != want_param_finish_state) {
  543. HandleBraceExpressionParameterError(state, param_finish_state);
  544. return;
  545. }
  546. // Struct type fields and value fields use the same grammar except
  547. // that one has a `:` separator and the other has an `=` separator.
  548. state.state = param_finish_state;
  549. state.token = Consume();
  550. PushState(state);
  551. PushState(ParserState::Expression);
  552. }
  553. auto Parser::HandleBraceExpressionParameterAfterDesignatorAsTypeState()
  554. -> void {
  555. HandleBraceExpressionParameterAfterDesignator(
  556. ParserState::BraceExpressionParameterFinishAsType);
  557. }
  558. auto Parser::HandleBraceExpressionParameterAfterDesignatorAsValueState()
  559. -> void {
  560. HandleBraceExpressionParameterAfterDesignator(
  561. ParserState::BraceExpressionParameterFinishAsValue);
  562. }
  563. auto Parser::HandleBraceExpressionParameterAfterDesignatorAsUnknownState()
  564. -> void {
  565. HandleBraceExpressionParameterAfterDesignator(
  566. ParserState::BraceExpressionParameterFinishAsUnknown);
  567. }
  568. auto Parser::HandleBraceExpressionParameterFinish(ParseNodeKind node_kind,
  569. ParserState param_state)
  570. -> void {
  571. auto state = PopState();
  572. if (state.has_error) {
  573. AddLeafNode(ParseNodeKind::StructFieldUnknown, state.token,
  574. /*has_error=*/true);
  575. } else {
  576. AddNode(node_kind, state.token, state.subtree_start, /*has_error=*/false);
  577. }
  578. if (ConsumeListToken(ParseNodeKind::StructComma, TokenKind::CloseCurlyBrace,
  579. state.has_error) == ListTokenKind::Comma) {
  580. PushState(param_state);
  581. }
  582. }
  583. auto Parser::HandleBraceExpressionParameterFinishAsTypeState() -> void {
  584. HandleBraceExpressionParameterFinish(
  585. ParseNodeKind::StructFieldType,
  586. ParserState::BraceExpressionParameterAsType);
  587. }
  588. auto Parser::HandleBraceExpressionParameterFinishAsValueState() -> void {
  589. HandleBraceExpressionParameterFinish(
  590. ParseNodeKind::StructFieldValue,
  591. ParserState::BraceExpressionParameterAsValue);
  592. }
  593. auto Parser::HandleBraceExpressionParameterFinishAsUnknownState() -> void {
  594. HandleBraceExpressionParameterFinish(
  595. ParseNodeKind::StructFieldUnknown,
  596. ParserState::BraceExpressionParameterAsUnknown);
  597. }
  598. auto Parser::HandleBraceExpressionFinish(ParseNodeKind node_kind) -> void {
  599. auto state = PopState();
  600. AddNode(node_kind, Consume(), state.subtree_start, state.has_error);
  601. }
  602. auto Parser::HandleBraceExpressionFinishAsTypeState() -> void {
  603. HandleBraceExpressionFinish(ParseNodeKind::StructTypeLiteral);
  604. }
  605. auto Parser::HandleBraceExpressionFinishAsValueState() -> void {
  606. HandleBraceExpressionFinish(ParseNodeKind::StructLiteral);
  607. }
  608. auto Parser::HandleBraceExpressionFinishAsUnknownState() -> void {
  609. HandleBraceExpressionFinish(ParseNodeKind::StructLiteral);
  610. }
  611. auto Parser::HandleCallExpressionState() -> void {
  612. auto state = PopState();
  613. state.state = ParserState::CallExpressionFinish;
  614. PushState(state);
  615. AddNode(ParseNodeKind::CallExpressionStart, Consume(), state.subtree_start,
  616. state.has_error);
  617. if (!PositionIs(TokenKind::CloseParen)) {
  618. PushState(ParserState::CallExpressionParameterFinish);
  619. PushState(ParserState::Expression);
  620. }
  621. }
  622. auto Parser::HandleCallExpressionParameterFinishState() -> void {
  623. auto state = PopState();
  624. if (state.has_error) {
  625. ReturnErrorOnState();
  626. }
  627. if (ConsumeListToken(ParseNodeKind::CallExpressionComma,
  628. TokenKind::CloseParen,
  629. state.has_error) == ListTokenKind::Comma) {
  630. PushState(ParserState::CallExpressionParameterFinish);
  631. PushState(ParserState::Expression);
  632. }
  633. }
  634. auto Parser::HandleCallExpressionFinishState() -> void {
  635. auto state = PopState();
  636. AddNode(ParseNodeKind::CallExpression, Consume(), state.subtree_start,
  637. state.has_error);
  638. }
  639. auto Parser::HandleCodeBlockFinishState() -> void {
  640. auto state = PopState();
  641. // If the block started with an open curly, this is a close curly.
  642. if (tokens_->GetKind(state.token) == TokenKind::OpenCurlyBrace) {
  643. AddNode(ParseNodeKind::CodeBlock, Consume(), state.subtree_start,
  644. state.has_error);
  645. } else {
  646. AddNode(ParseNodeKind::CodeBlock, state.token, state.subtree_start,
  647. /*has_error=*/true);
  648. }
  649. }
  650. auto Parser::HandleDeclarationNameAndParams(bool params_required) -> void {
  651. auto state = PopState();
  652. if (!ConsumeAndAddLeafNodeIf(TokenKind::Identifier,
  653. ParseNodeKind::DeclaredName)) {
  654. emitter_->Emit(*position_, ExpectedDeclarationName,
  655. tokens_->GetKind(state.token));
  656. ReturnErrorOnState();
  657. return;
  658. }
  659. if (PositionIs(TokenKind::OpenSquareBracket)) {
  660. PushState(ParserState::DeclarationNameAndParamsAfterDeduced);
  661. PushState(ParserState::ParameterListAsDeduced);
  662. } else if (PositionIs(TokenKind::OpenParen)) {
  663. PushState(ParserState::ParameterListAsRegular);
  664. } else if (params_required) {
  665. CARBON_DIAGNOSTIC(ParametersRequiredByIntroducer, Error,
  666. "`{0}` requires a `(` for parameters.", TokenKind);
  667. emitter_->Emit(*position_, ParametersRequiredByIntroducer,
  668. tokens_->GetKind(state.token));
  669. ReturnErrorOnState();
  670. }
  671. }
  672. auto Parser::HandleDeclarationNameAndParamsAsOptionalState() -> void {
  673. HandleDeclarationNameAndParams(/*params_required=*/false);
  674. }
  675. auto Parser::HandleDeclarationNameAndParamsAsRequiredState() -> void {
  676. HandleDeclarationNameAndParams(/*params_required=*/true);
  677. }
  678. auto Parser::HandleDeclarationNameAndParamsAfterDeducedState() -> void {
  679. PopAndDiscardState();
  680. if (PositionIs(TokenKind::OpenParen)) {
  681. PushState(ParserState::ParameterListAsRegular);
  682. } else {
  683. CARBON_DIAGNOSTIC(
  684. ParametersRequiredByDeduced, Error,
  685. "A `(` for parameters is required after deduced parameters.");
  686. emitter_->Emit(*position_, ParametersRequiredByDeduced);
  687. ReturnErrorOnState();
  688. }
  689. }
  690. auto Parser::HandleDeclarationScopeLoopState() -> void {
  691. // This maintains the current state unless we're at the end of the scope.
  692. switch (PositionKind()) {
  693. case TokenKind::CloseCurlyBrace:
  694. case TokenKind::EndOfFile: {
  695. // This is the end of the scope, so the loop state ends.
  696. PopAndDiscardState();
  697. break;
  698. }
  699. case TokenKind::Class: {
  700. PushState(ParserState::TypeIntroducerAsClass);
  701. break;
  702. }
  703. case TokenKind::Constraint: {
  704. PushState(ParserState::TypeIntroducerAsNamedConstraint);
  705. break;
  706. }
  707. case TokenKind::Fn: {
  708. PushState(ParserState::FunctionIntroducer);
  709. break;
  710. }
  711. case TokenKind::Interface: {
  712. PushState(ParserState::TypeIntroducerAsInterface);
  713. break;
  714. }
  715. case TokenKind::Semi: {
  716. AddLeafNode(ParseNodeKind::EmptyDeclaration, Consume());
  717. break;
  718. }
  719. case TokenKind::Var: {
  720. PushState(ParserState::VarAsSemicolon);
  721. break;
  722. }
  723. default: {
  724. HandleUnrecognizedDeclaration();
  725. break;
  726. }
  727. }
  728. }
  729. auto Parser::HandleDesignator(bool as_struct) -> void {
  730. auto state = PopState();
  731. // `.` identifier
  732. auto dot = ConsumeChecked(TokenKind::Period);
  733. if (!ConsumeAndAddLeafNodeIf(TokenKind::Identifier,
  734. ParseNodeKind::DesignatedName)) {
  735. CARBON_DIAGNOSTIC(ExpectedIdentifierAfterDot, Error,
  736. "Expected identifier after `.`.");
  737. emitter_->Emit(*position_, ExpectedIdentifierAfterDot);
  738. // If we see a keyword, assume it was intended to be the designated name.
  739. // TODO: Should keywords be valid in designators?
  740. if (PositionKind().is_keyword()) {
  741. AddLeafNode(ParseNodeKind::DesignatedName, Consume(),
  742. /*has_error=*/true);
  743. } else {
  744. AddLeafNode(ParseNodeKind::DesignatedName, *position_,
  745. /*has_error=*/true);
  746. // Indicate the error to the parent state so that it can avoid producing
  747. // more errors.
  748. ReturnErrorOnState();
  749. }
  750. }
  751. AddNode(as_struct ? ParseNodeKind::StructFieldDesignator
  752. : ParseNodeKind::DesignatorExpression,
  753. dot, state.subtree_start, state.has_error);
  754. }
  755. auto Parser::HandleDesignatorAsExpressionState() -> void {
  756. HandleDesignator(/*as_struct=*/false);
  757. }
  758. auto Parser::HandleDesignatorAsStructState() -> void {
  759. HandleDesignator(/*as_struct=*/true);
  760. }
  761. auto Parser::HandleExpressionState() -> void {
  762. auto state = PopState();
  763. // Check for a prefix operator.
  764. if (auto operator_precedence = PrecedenceGroup::ForLeading(PositionKind())) {
  765. if (PrecedenceGroup::GetPriority(state.ambient_precedence,
  766. *operator_precedence) !=
  767. OperatorPriority::RightFirst) {
  768. // The precedence rules don't permit this prefix operator in this
  769. // context. Diagnose this, but carry on and parse it anyway.
  770. emitter_->Emit(*position_, OperatorRequiresParentheses);
  771. } else {
  772. // Check that this operator follows the proper whitespace rules.
  773. DiagnoseOperatorFixity(OperatorFixity::Prefix);
  774. }
  775. PushStateForExpressionLoop(ParserState::ExpressionLoopForPrefix,
  776. state.ambient_precedence, *operator_precedence);
  777. ++position_;
  778. PushStateForExpression(*operator_precedence);
  779. } else {
  780. PushStateForExpressionLoop(ParserState::ExpressionLoop,
  781. state.ambient_precedence,
  782. PrecedenceGroup::ForPostfixExpression());
  783. PushState(ParserState::ExpressionInPostfix);
  784. }
  785. }
  786. auto Parser::HandleExpressionInPostfixState() -> void {
  787. auto state = PopState();
  788. // Continue to the loop state.
  789. state.state = ParserState::ExpressionInPostfixLoop;
  790. // Parses a primary expression, which is either a terminal portion of an
  791. // expression tree, such as an identifier or literal, or a parenthesized
  792. // expression.
  793. switch (PositionKind()) {
  794. case TokenKind::Identifier: {
  795. AddLeafNode(ParseNodeKind::NameReference, Consume());
  796. PushState(state);
  797. break;
  798. }
  799. case TokenKind::IntegerLiteral:
  800. case TokenKind::RealLiteral:
  801. case TokenKind::StringLiteral:
  802. case TokenKind::IntegerTypeLiteral:
  803. case TokenKind::UnsignedIntegerTypeLiteral:
  804. case TokenKind::FloatingPointTypeLiteral:
  805. case TokenKind::StringTypeLiteral: {
  806. AddLeafNode(ParseNodeKind::Literal, Consume());
  807. PushState(state);
  808. break;
  809. }
  810. case TokenKind::OpenCurlyBrace: {
  811. PushState(state);
  812. PushState(ParserState::BraceExpression);
  813. break;
  814. }
  815. case TokenKind::OpenParen: {
  816. PushState(state);
  817. PushState(ParserState::ParenExpression);
  818. break;
  819. }
  820. case TokenKind::SelfType: {
  821. AddLeafNode(ParseNodeKind::SelfType, Consume());
  822. PushState(state);
  823. break;
  824. }
  825. default: {
  826. CARBON_DIAGNOSTIC(ExpectedExpression, Error, "Expected expression.");
  827. emitter_->Emit(*position_, ExpectedExpression);
  828. ReturnErrorOnState();
  829. break;
  830. }
  831. }
  832. }
  833. auto Parser::HandleExpressionInPostfixLoopState() -> void {
  834. // This is a cyclic state that repeats, so this state is typically pushed back
  835. // on.
  836. auto state = PopState();
  837. state.token = *position_;
  838. switch (PositionKind()) {
  839. case TokenKind::Period: {
  840. PushState(state);
  841. state.state = ParserState::DesignatorAsExpression;
  842. PushState(state);
  843. break;
  844. }
  845. case TokenKind::OpenParen: {
  846. PushState(state);
  847. state.state = ParserState::CallExpression;
  848. PushState(state);
  849. break;
  850. }
  851. default: {
  852. if (state.has_error) {
  853. ReturnErrorOnState();
  854. }
  855. break;
  856. }
  857. }
  858. }
  859. auto Parser::HandleExpressionLoopState() -> void {
  860. auto state = PopState();
  861. auto trailing_operator =
  862. PrecedenceGroup::ForTrailing(PositionKind(), IsTrailingOperatorInfix());
  863. if (!trailing_operator) {
  864. if (state.has_error) {
  865. ReturnErrorOnState();
  866. }
  867. return;
  868. }
  869. auto [operator_precedence, is_binary] = *trailing_operator;
  870. // TODO: If this operator is ambiguous with either the ambient precedence
  871. // or the LHS precedence, and there's a variant with a different fixity
  872. // that would work, use that one instead for error recovery.
  873. if (PrecedenceGroup::GetPriority(state.ambient_precedence,
  874. operator_precedence) !=
  875. OperatorPriority::RightFirst) {
  876. // The precedence rules don't permit this operator in this context. Try
  877. // again in the enclosing expression context.
  878. if (state.has_error) {
  879. ReturnErrorOnState();
  880. }
  881. return;
  882. }
  883. if (PrecedenceGroup::GetPriority(state.lhs_precedence, operator_precedence) !=
  884. OperatorPriority::LeftFirst) {
  885. // Either the LHS operator and this operator are ambiguous, or the
  886. // LHS operator is a unary operator that can't be nested within
  887. // this operator. Either way, parentheses are required.
  888. emitter_->Emit(*position_, OperatorRequiresParentheses);
  889. state.has_error = true;
  890. } else {
  891. DiagnoseOperatorFixity(is_binary ? OperatorFixity::Infix
  892. : OperatorFixity::Postfix);
  893. }
  894. state.token = Consume();
  895. state.lhs_precedence = operator_precedence;
  896. if (is_binary) {
  897. state.state = ParserState::ExpressionLoopForBinary;
  898. PushState(state);
  899. PushStateForExpression(operator_precedence);
  900. } else {
  901. AddNode(ParseNodeKind::PostfixOperator, state.token, state.subtree_start,
  902. state.has_error);
  903. state.has_error = false;
  904. PushState(state);
  905. }
  906. }
  907. auto Parser::HandleExpressionLoopForBinaryState() -> void {
  908. auto state = PopState();
  909. AddNode(ParseNodeKind::InfixOperator, state.token, state.subtree_start,
  910. state.has_error);
  911. state.state = ParserState::ExpressionLoop;
  912. state.has_error = false;
  913. PushState(state);
  914. }
  915. auto Parser::HandleExpressionLoopForPrefixState() -> void {
  916. auto state = PopState();
  917. AddNode(ParseNodeKind::PrefixOperator, state.token, state.subtree_start,
  918. state.has_error);
  919. state.state = ParserState::ExpressionLoop;
  920. state.has_error = false;
  921. PushState(state);
  922. }
  923. auto Parser::HandleExpressionStatementFinishState() -> void {
  924. auto state = PopState();
  925. if (auto semi = ConsumeIf(TokenKind::Semi)) {
  926. AddNode(ParseNodeKind::ExpressionStatement, *semi, state.subtree_start,
  927. state.has_error);
  928. return;
  929. }
  930. if (!state.has_error) {
  931. emitter_->Emit(*position_, ExpectedSemiAfterExpression);
  932. }
  933. if (auto semi_token = SkipPastLikelyEnd(state.token)) {
  934. AddNode(ParseNodeKind::ExpressionStatement, *semi_token,
  935. state.subtree_start,
  936. /*has_error=*/true);
  937. return;
  938. }
  939. // Found junk not even followed by a `;`, no node to add.
  940. ReturnErrorOnState();
  941. }
  942. auto Parser::HandleFunctionIntroducerState() -> void {
  943. auto state = PopState();
  944. AddLeafNode(ParseNodeKind::FunctionIntroducer, Consume());
  945. state.state = ParserState::FunctionAfterParameters;
  946. PushState(state);
  947. state.state = ParserState::DeclarationNameAndParamsAsRequired;
  948. PushState(state);
  949. }
  950. auto Parser::HandleFunctionAfterParametersState() -> void {
  951. auto state = PopState();
  952. // Regardless of whether there's a return type, we'll finish the signature.
  953. state.state = ParserState::FunctionSignatureFinish;
  954. PushState(state);
  955. // If there is a return type, parse the expression before adding the return
  956. // type nod.e
  957. if (PositionIs(TokenKind::MinusGreater)) {
  958. PushState(ParserState::FunctionReturnTypeFinish);
  959. ++position_;
  960. PushStateForExpression(PrecedenceGroup::ForType());
  961. }
  962. }
  963. auto Parser::HandleFunctionReturnTypeFinishState() -> void {
  964. auto state = PopState();
  965. AddNode(ParseNodeKind::ReturnType, state.token, state.subtree_start,
  966. state.has_error);
  967. }
  968. auto Parser::HandleFunctionSignatureFinishState() -> void {
  969. auto state = PopState();
  970. switch (PositionKind()) {
  971. case TokenKind::Semi: {
  972. AddNode(ParseNodeKind::FunctionDeclaration, Consume(),
  973. state.subtree_start, state.has_error);
  974. break;
  975. }
  976. case TokenKind::OpenCurlyBrace: {
  977. if (auto context = GetDeclarationContext();
  978. context == DeclarationContext::Interface ||
  979. context == DeclarationContext::NamedConstraint) {
  980. CARBON_DIAGNOSTIC(
  981. MethodImplNotAllowed, Error,
  982. "Method implementations are not allowed in interfaces.");
  983. emitter_->Emit(*position_, MethodImplNotAllowed);
  984. HandleDeclarationError(state, ParseNodeKind::FunctionDeclaration,
  985. /*skip_past_likely_end=*/true);
  986. break;
  987. }
  988. AddNode(ParseNodeKind::FunctionDefinitionStart, Consume(),
  989. state.subtree_start, state.has_error);
  990. // Any error is recorded on the FunctionDefinitionStart.
  991. state.has_error = false;
  992. state.state = ParserState::FunctionDefinitionFinish;
  993. PushState(state);
  994. PushState(ParserState::StatementScopeLoop);
  995. break;
  996. }
  997. default: {
  998. if (!state.has_error) {
  999. emitter_->Emit(*position_, ExpectedDeclarationSemiOrDefinition,
  1000. TokenKind::Fn);
  1001. }
  1002. // Only need to skip if we've not already found a new line.
  1003. bool skip_past_likely_end =
  1004. tokens_->GetLine(*position_) == tokens_->GetLine(state.token);
  1005. HandleDeclarationError(state, ParseNodeKind::FunctionDeclaration,
  1006. skip_past_likely_end);
  1007. break;
  1008. }
  1009. }
  1010. }
  1011. auto Parser::HandleFunctionDefinitionFinishState() -> void {
  1012. auto state = PopState();
  1013. AddNode(ParseNodeKind::FunctionDefinition, Consume(), state.subtree_start,
  1014. state.has_error);
  1015. }
  1016. auto Parser::HandlePackageState() -> void {
  1017. auto state = PopState();
  1018. AddLeafNode(ParseNodeKind::PackageIntroducer, Consume());
  1019. auto exit_on_parse_error = [&]() {
  1020. auto semi_token = SkipPastLikelyEnd(state.token);
  1021. return AddNode(ParseNodeKind::PackageDirective,
  1022. semi_token ? *semi_token : state.token, state.subtree_start,
  1023. /*has_error=*/true);
  1024. };
  1025. if (!ConsumeAndAddLeafNodeIf(TokenKind::Identifier,
  1026. ParseNodeKind::DeclaredName)) {
  1027. CARBON_DIAGNOSTIC(ExpectedIdentifierAfterPackage, Error,
  1028. "Expected identifier after `package`.");
  1029. emitter_->Emit(*position_, ExpectedIdentifierAfterPackage);
  1030. exit_on_parse_error();
  1031. return;
  1032. }
  1033. bool library_parsed = false;
  1034. if (auto library_token = ConsumeIf(TokenKind::Library)) {
  1035. auto library_start = tree_->size();
  1036. if (!ConsumeAndAddLeafNodeIf(TokenKind::StringLiteral,
  1037. ParseNodeKind::Literal)) {
  1038. CARBON_DIAGNOSTIC(
  1039. ExpectedLibraryName, Error,
  1040. "Expected a string literal to specify the library name.");
  1041. emitter_->Emit(*position_, ExpectedLibraryName);
  1042. exit_on_parse_error();
  1043. return;
  1044. }
  1045. AddNode(ParseNodeKind::PackageLibrary, *library_token, library_start,
  1046. /*has_error=*/false);
  1047. library_parsed = true;
  1048. }
  1049. switch (auto api_or_impl_token = tokens_->GetKind(*(position_))) {
  1050. case TokenKind::Api: {
  1051. AddLeafNode(ParseNodeKind::PackageApi, Consume());
  1052. break;
  1053. }
  1054. case TokenKind::Impl: {
  1055. AddLeafNode(ParseNodeKind::PackageImpl, Consume());
  1056. break;
  1057. }
  1058. default: {
  1059. if (!library_parsed && api_or_impl_token == TokenKind::StringLiteral) {
  1060. // If we come acroess a string literal and we didn't parse `library
  1061. // "..."` yet, then most probably the user forgot to add `library`
  1062. // before the library name.
  1063. CARBON_DIAGNOSTIC(MissingLibraryKeyword, Error,
  1064. "Missing `library` keyword.");
  1065. emitter_->Emit(*position_, MissingLibraryKeyword);
  1066. } else {
  1067. CARBON_DIAGNOSTIC(ExpectedApiOrImpl, Error,
  1068. "Expected a `api` or `impl`.");
  1069. emitter_->Emit(*position_, ExpectedApiOrImpl);
  1070. }
  1071. exit_on_parse_error();
  1072. return;
  1073. }
  1074. }
  1075. if (!PositionIs(TokenKind::Semi)) {
  1076. CARBON_DIAGNOSTIC(ExpectedSemiToEndPackageDirective, Error,
  1077. "Expected `;` to end package directive.");
  1078. emitter_->Emit(*position_, ExpectedSemiToEndPackageDirective);
  1079. exit_on_parse_error();
  1080. return;
  1081. }
  1082. AddNode(ParseNodeKind::PackageDirective, Consume(), state.subtree_start,
  1083. /*has_error=*/false);
  1084. }
  1085. auto Parser::HandleParameter(ParserState pattern_state,
  1086. ParserState finish_state) -> void {
  1087. PopAndDiscardState();
  1088. PushState(finish_state);
  1089. PushState(pattern_state);
  1090. }
  1091. auto Parser::HandleParameterAsDeducedState() -> void {
  1092. HandleParameter(ParserState::PatternAsDeducedParameter,
  1093. ParserState::ParameterFinishAsDeduced);
  1094. }
  1095. auto Parser::HandleParameterAsRegularState() -> void {
  1096. HandleParameter(ParserState::PatternAsParameter,
  1097. ParserState::ParameterFinishAsRegular);
  1098. }
  1099. auto Parser::HandleParameterFinish(TokenKind close_token,
  1100. ParserState param_state) -> void {
  1101. auto state = PopState();
  1102. if (state.has_error) {
  1103. ReturnErrorOnState();
  1104. }
  1105. if (ConsumeListToken(ParseNodeKind::ParameterListComma, close_token,
  1106. state.has_error) == ListTokenKind::Comma) {
  1107. PushState(param_state);
  1108. }
  1109. }
  1110. auto Parser::HandleParameterFinishAsDeducedState() -> void {
  1111. HandleParameterFinish(TokenKind::CloseSquareBracket,
  1112. ParserState::ParameterAsDeduced);
  1113. }
  1114. auto Parser::HandleParameterFinishAsRegularState() -> void {
  1115. HandleParameterFinish(TokenKind::CloseParen, ParserState::ParameterAsRegular);
  1116. }
  1117. auto Parser::HandleParameterList(ParseNodeKind parse_node_kind,
  1118. TokenKind open_token_kind,
  1119. TokenKind close_token_kind,
  1120. ParserState param_state,
  1121. ParserState finish_state) -> void {
  1122. PopAndDiscardState();
  1123. PushState(finish_state);
  1124. AddLeafNode(parse_node_kind, ConsumeChecked(open_token_kind));
  1125. if (!PositionIs(close_token_kind)) {
  1126. PushState(param_state);
  1127. }
  1128. }
  1129. auto Parser::HandleParameterListAsDeducedState() -> void {
  1130. HandleParameterList(
  1131. ParseNodeKind::DeducedParameterListStart, TokenKind::OpenSquareBracket,
  1132. TokenKind::CloseSquareBracket, ParserState::ParameterAsDeduced,
  1133. ParserState::ParameterListFinishAsDeduced);
  1134. }
  1135. auto Parser::HandleParameterListAsRegularState() -> void {
  1136. HandleParameterList(ParseNodeKind::ParameterListStart, TokenKind::OpenParen,
  1137. TokenKind::CloseParen, ParserState::ParameterAsRegular,
  1138. ParserState::ParameterListFinishAsRegular);
  1139. }
  1140. auto Parser::HandleParameterListFinish(ParseNodeKind parse_node_kind,
  1141. TokenKind token_kind) -> void {
  1142. auto state = PopState();
  1143. AddNode(parse_node_kind, ConsumeChecked(token_kind), state.subtree_start,
  1144. state.has_error);
  1145. }
  1146. auto Parser::HandleParameterListFinishAsDeducedState() -> void {
  1147. HandleParameterListFinish(ParseNodeKind::DeducedParameterList,
  1148. TokenKind::CloseSquareBracket);
  1149. }
  1150. auto Parser::HandleParameterListFinishAsRegularState() -> void {
  1151. HandleParameterListFinish(ParseNodeKind::ParameterList,
  1152. TokenKind::CloseParen);
  1153. }
  1154. auto Parser::HandleParenCondition(ParseNodeKind start_kind,
  1155. ParserState finish_state) -> void {
  1156. auto state = PopState();
  1157. ConsumeAndAddOpenParen(state.token, start_kind);
  1158. state.state = finish_state;
  1159. PushState(state);
  1160. PushState(ParserState::Expression);
  1161. }
  1162. auto Parser::HandleParenConditionAsIfState() -> void {
  1163. HandleParenCondition(ParseNodeKind::IfConditionStart,
  1164. ParserState::ParenConditionFinishAsIf);
  1165. }
  1166. auto Parser::HandleParenConditionAsWhileState() -> void {
  1167. HandleParenCondition(ParseNodeKind::WhileConditionStart,
  1168. ParserState::ParenConditionFinishAsWhile);
  1169. }
  1170. auto Parser::HandleParenConditionFinishAsIfState() -> void {
  1171. auto state = PopState();
  1172. ConsumeAndAddCloseParen(state, ParseNodeKind::IfCondition);
  1173. }
  1174. auto Parser::HandleParenConditionFinishAsWhileState() -> void {
  1175. auto state = PopState();
  1176. ConsumeAndAddCloseParen(state, ParseNodeKind::WhileCondition);
  1177. }
  1178. auto Parser::HandleParenExpressionState() -> void {
  1179. auto state = PopState();
  1180. // Advance past the open paren.
  1181. AddLeafNode(ParseNodeKind::ParenExpressionOrTupleLiteralStart,
  1182. ConsumeChecked(TokenKind::OpenParen));
  1183. if (PositionIs(TokenKind::CloseParen)) {
  1184. state.state = ParserState::ParenExpressionFinishAsTuple;
  1185. PushState(state);
  1186. } else {
  1187. state.state = ParserState::ParenExpressionFinishAsNormal;
  1188. PushState(state);
  1189. PushState(ParserState::ParenExpressionParameterFinishAsUnknown);
  1190. PushState(ParserState::Expression);
  1191. }
  1192. }
  1193. auto Parser::HandleParenExpressionParameterFinish(bool as_tuple) -> void {
  1194. auto state = PopState();
  1195. auto list_token_kind = ConsumeListToken(
  1196. ParseNodeKind::TupleLiteralComma, TokenKind::CloseParen, state.has_error);
  1197. if (list_token_kind == ListTokenKind::Close) {
  1198. return;
  1199. }
  1200. // If this is the first item and a comma was found, switch to tuple handling.
  1201. // Note this could be `(expr,)` so we may not reuse the current state, but
  1202. // it's still necessary to switch the parent.
  1203. if (!as_tuple) {
  1204. state.state = ParserState::ParenExpressionParameterFinishAsTuple;
  1205. auto finish_state = PopState();
  1206. CARBON_CHECK(finish_state.state ==
  1207. ParserState::ParenExpressionFinishAsNormal)
  1208. << "Unexpected parent state, found: " << finish_state.state;
  1209. finish_state.state = ParserState::ParenExpressionFinishAsTuple;
  1210. PushState(finish_state);
  1211. }
  1212. // On a comma, push another expression handler.
  1213. if (list_token_kind == ListTokenKind::Comma) {
  1214. PushState(state);
  1215. PushState(ParserState::Expression);
  1216. }
  1217. }
  1218. auto Parser::HandleParenExpressionParameterFinishAsUnknownState() -> void {
  1219. HandleParenExpressionParameterFinish(/*as_tuple=*/false);
  1220. }
  1221. auto Parser::HandleParenExpressionParameterFinishAsTupleState() -> void {
  1222. HandleParenExpressionParameterFinish(/*as_tuple=*/true);
  1223. }
  1224. auto Parser::HandleParenExpressionFinishAsNormalState() -> void {
  1225. auto state = PopState();
  1226. AddNode(ParseNodeKind::ParenExpression, Consume(), state.subtree_start,
  1227. state.has_error);
  1228. }
  1229. auto Parser::HandleParenExpressionFinishAsTupleState() -> void {
  1230. auto state = PopState();
  1231. AddNode(ParseNodeKind::TupleLiteral, Consume(), state.subtree_start,
  1232. state.has_error);
  1233. }
  1234. auto Parser::ConsumeIfPatternKeyword(TokenKind keyword_token,
  1235. ParserState keyword_state,
  1236. int subtree_start) -> void {
  1237. if (auto token = ConsumeIf(keyword_token)) {
  1238. PushState(StateStackEntry(
  1239. keyword_state, PrecedenceGroup::ForTopLevelExpression(),
  1240. PrecedenceGroup::ForTopLevelExpression(), *token, subtree_start));
  1241. }
  1242. }
  1243. auto Parser::HandlePattern(PatternKind pattern_kind) -> void {
  1244. auto state = PopState();
  1245. // Parameters may have keywords prefixing the pattern. They become the parent
  1246. // for the full PatternBinding.
  1247. if (pattern_kind != PatternKind::Variable) {
  1248. ConsumeIfPatternKeyword(TokenKind::Template, ParserState::PatternTemplate,
  1249. state.subtree_start);
  1250. ConsumeIfPatternKeyword(TokenKind::Addr, ParserState::PatternAddress,
  1251. state.subtree_start);
  1252. }
  1253. // Handle an invalid pattern introducer for parameters and variables.
  1254. auto on_error = [&]() {
  1255. switch (pattern_kind) {
  1256. case PatternKind::DeducedParameter:
  1257. case PatternKind::Parameter: {
  1258. CARBON_DIAGNOSTIC(ExpectedParameterName, Error,
  1259. "Expected parameter declaration.");
  1260. emitter_->Emit(*position_, ExpectedParameterName);
  1261. break;
  1262. }
  1263. case PatternKind::Variable: {
  1264. CARBON_DIAGNOSTIC(ExpectedVariableName, Error,
  1265. "Expected pattern in `var` declaration.");
  1266. emitter_->Emit(*position_, ExpectedVariableName);
  1267. break;
  1268. }
  1269. }
  1270. // Still use the finish state for errors.
  1271. state.state = ParserState::PatternFinishAsRegular;
  1272. state.has_error = true;
  1273. PushState(state);
  1274. };
  1275. // The first item should be an identifier or, for deduced parameters, `self`.
  1276. if (auto identifier = ConsumeIf(TokenKind::Identifier)) {
  1277. AddLeafNode(ParseNodeKind::DeclaredName, *identifier);
  1278. } else if (pattern_kind == PatternKind::DeducedParameter) {
  1279. if (auto self = ConsumeIf(TokenKind::SelfParameter)) {
  1280. AddLeafNode(ParseNodeKind::SelfDeducedParameter, *self);
  1281. } else {
  1282. on_error();
  1283. return;
  1284. }
  1285. } else {
  1286. on_error();
  1287. return;
  1288. }
  1289. if (auto kind = PositionKind();
  1290. kind == TokenKind::Colon || kind == TokenKind::ColonExclaim) {
  1291. state.state = kind == TokenKind::Colon
  1292. ? ParserState::PatternFinishAsRegular
  1293. : ParserState::PatternFinishAsGeneric;
  1294. // Use the `:` or `:!` for the root node.
  1295. state.token = Consume();
  1296. PushState(state);
  1297. PushStateForExpression(PrecedenceGroup::ForType());
  1298. } else {
  1299. on_error();
  1300. return;
  1301. }
  1302. }
  1303. auto Parser::HandlePatternAsDeducedParameterState() -> void {
  1304. HandlePattern(PatternKind::DeducedParameter);
  1305. }
  1306. auto Parser::HandlePatternAsParameterState() -> void {
  1307. HandlePattern(PatternKind::Parameter);
  1308. }
  1309. auto Parser::HandlePatternAsVariableState() -> void {
  1310. HandlePattern(PatternKind::Variable);
  1311. }
  1312. auto Parser::HandlePatternFinish(ParseNodeKind node_kind) -> void {
  1313. auto state = PopState();
  1314. // If an error was encountered, propagate it without adding a node.
  1315. if (state.has_error) {
  1316. ReturnErrorOnState();
  1317. return;
  1318. }
  1319. // TODO: may need to mark has_error if !type.
  1320. AddNode(node_kind, state.token, state.subtree_start, /*has_error=*/false);
  1321. }
  1322. auto Parser::HandlePatternFinishAsGenericState() -> void {
  1323. HandlePatternFinish(ParseNodeKind::GenericPatternBinding);
  1324. }
  1325. auto Parser::HandlePatternFinishAsRegularState() -> void {
  1326. HandlePatternFinish(ParseNodeKind::PatternBinding);
  1327. }
  1328. auto Parser::HandlePatternAddressState() -> void {
  1329. auto state = PopState();
  1330. AddNode(ParseNodeKind::Address, state.token, state.subtree_start,
  1331. state.has_error);
  1332. // If an error was encountered, propagate it while adding a node.
  1333. if (state.has_error) {
  1334. ReturnErrorOnState();
  1335. }
  1336. }
  1337. auto Parser::HandlePatternTemplateState() -> void {
  1338. auto state = PopState();
  1339. AddNode(ParseNodeKind::Template, 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::HandleStatementState() -> void {
  1347. PopAndDiscardState();
  1348. switch (PositionKind()) {
  1349. case TokenKind::Break: {
  1350. PushState(ParserState::StatementBreakFinish);
  1351. AddLeafNode(ParseNodeKind::BreakStatementStart, Consume());
  1352. break;
  1353. }
  1354. case TokenKind::Continue: {
  1355. PushState(ParserState::StatementContinueFinish);
  1356. AddLeafNode(ParseNodeKind::ContinueStatementStart, Consume());
  1357. break;
  1358. }
  1359. case TokenKind::For: {
  1360. PushState(ParserState::StatementForFinish);
  1361. PushState(ParserState::StatementForHeader);
  1362. ++position_;
  1363. break;
  1364. }
  1365. case TokenKind::If: {
  1366. PushState(ParserState::StatementIf);
  1367. break;
  1368. }
  1369. case TokenKind::Return: {
  1370. PushState(ParserState::StatementReturn);
  1371. break;
  1372. }
  1373. case TokenKind::Var: {
  1374. PushState(ParserState::VarAsSemicolon);
  1375. break;
  1376. }
  1377. case TokenKind::While: {
  1378. PushState(ParserState::StatementWhile);
  1379. break;
  1380. }
  1381. default: {
  1382. PushState(ParserState::ExpressionStatementFinish);
  1383. PushState(ParserState::Expression);
  1384. break;
  1385. }
  1386. }
  1387. }
  1388. auto Parser::HandleStatementBreakFinishState() -> void {
  1389. HandleStatementKeywordFinish(ParseNodeKind::BreakStatement);
  1390. }
  1391. auto Parser::HandleStatementContinueFinishState() -> void {
  1392. HandleStatementKeywordFinish(ParseNodeKind::ContinueStatement);
  1393. }
  1394. auto Parser::HandleStatementForHeaderState() -> void {
  1395. auto state = PopState();
  1396. ConsumeAndAddOpenParen(state.token, ParseNodeKind::ForHeaderStart);
  1397. state.state = ParserState::StatementForHeaderIn;
  1398. if (PositionIs(TokenKind::Var)) {
  1399. PushState(state);
  1400. PushState(ParserState::VarAsFor);
  1401. } else {
  1402. CARBON_DIAGNOSTIC(ExpectedVariableDeclaration, Error,
  1403. "Expected `var` declaration.");
  1404. emitter_->Emit(*position_, ExpectedVariableDeclaration);
  1405. if (auto next_in = FindNextOf({TokenKind::In})) {
  1406. SkipTo(*next_in);
  1407. ++position_;
  1408. }
  1409. state.has_error = true;
  1410. PushState(state);
  1411. }
  1412. }
  1413. auto Parser::HandleStatementForHeaderInState() -> void {
  1414. auto state = PopState();
  1415. state.state = ParserState::StatementForHeaderFinish;
  1416. PushState(state);
  1417. PushState(ParserState::Expression);
  1418. }
  1419. auto Parser::HandleStatementForHeaderFinishState() -> void {
  1420. auto state = PopState();
  1421. ConsumeAndAddCloseParen(state, ParseNodeKind::ForHeader);
  1422. PushState(ParserState::CodeBlock);
  1423. }
  1424. auto Parser::HandleStatementForFinishState() -> void {
  1425. auto state = PopState();
  1426. AddNode(ParseNodeKind::ForStatement, state.token, state.subtree_start,
  1427. state.has_error);
  1428. }
  1429. auto Parser::HandleStatementIfState() -> void {
  1430. PopAndDiscardState();
  1431. PushState(ParserState::StatementIfConditionFinish);
  1432. PushState(ParserState::ParenConditionAsIf);
  1433. ++position_;
  1434. }
  1435. auto Parser::HandleStatementIfConditionFinishState() -> void {
  1436. auto state = PopState();
  1437. state.state = ParserState::StatementIfThenBlockFinish;
  1438. PushState(state);
  1439. PushState(ParserState::CodeBlock);
  1440. }
  1441. auto Parser::HandleStatementIfThenBlockFinishState() -> void {
  1442. auto state = PopState();
  1443. if (ConsumeAndAddLeafNodeIf(TokenKind::Else,
  1444. ParseNodeKind::IfStatementElse)) {
  1445. state.state = ParserState::StatementIfElseBlockFinish;
  1446. PushState(state);
  1447. // `else if` is permitted as a special case.
  1448. PushState(PositionIs(TokenKind::If) ? ParserState::StatementIf
  1449. : ParserState::CodeBlock);
  1450. } else {
  1451. AddNode(ParseNodeKind::IfStatement, state.token, state.subtree_start,
  1452. state.has_error);
  1453. }
  1454. }
  1455. auto Parser::HandleStatementIfElseBlockFinishState() -> void {
  1456. auto state = PopState();
  1457. AddNode(ParseNodeKind::IfStatement, state.token, state.subtree_start,
  1458. state.has_error);
  1459. }
  1460. auto Parser::HandleStatementKeywordFinish(ParseNodeKind node_kind) -> void {
  1461. auto state = PopState();
  1462. auto semi = ConsumeIf(TokenKind::Semi);
  1463. if (!semi) {
  1464. CARBON_DIAGNOSTIC(ExpectedSemiAfter, Error, "Expected `;` after `{0}`.",
  1465. TokenKind);
  1466. emitter_->Emit(*position_, ExpectedSemiAfter,
  1467. tokens_->GetKind(state.token));
  1468. state.has_error = true;
  1469. // Recover to the next semicolon if possible, otherwise indicate the
  1470. // keyword for the error.
  1471. semi = SkipPastLikelyEnd(state.token);
  1472. if (!semi) {
  1473. semi = state.token;
  1474. }
  1475. }
  1476. AddNode(node_kind, *semi, state.subtree_start, state.has_error);
  1477. }
  1478. auto Parser::HandleStatementReturnState() -> void {
  1479. auto state = PopState();
  1480. state.state = ParserState::StatementReturnFinish;
  1481. PushState(state);
  1482. AddLeafNode(ParseNodeKind::ReturnStatementStart, Consume());
  1483. if (!PositionIs(TokenKind::Semi)) {
  1484. PushState(ParserState::Expression);
  1485. }
  1486. }
  1487. auto Parser::HandleStatementReturnFinishState() -> void {
  1488. HandleStatementKeywordFinish(ParseNodeKind::ReturnStatement);
  1489. }
  1490. auto Parser::HandleStatementScopeLoopState() -> void {
  1491. // This maintains the current state until we're at the end of the scope.
  1492. auto token_kind = PositionKind();
  1493. if (token_kind == TokenKind::CloseCurlyBrace) {
  1494. auto state = PopState();
  1495. if (state.has_error) {
  1496. ReturnErrorOnState();
  1497. }
  1498. } else {
  1499. PushState(ParserState::Statement);
  1500. }
  1501. }
  1502. auto Parser::HandleStatementWhileState() -> void {
  1503. PopAndDiscardState();
  1504. PushState(ParserState::StatementWhileConditionFinish);
  1505. PushState(ParserState::ParenConditionAsWhile);
  1506. ++position_;
  1507. }
  1508. auto Parser::HandleStatementWhileConditionFinishState() -> void {
  1509. auto state = PopState();
  1510. state.state = ParserState::StatementWhileBlockFinish;
  1511. PushState(state);
  1512. PushState(ParserState::CodeBlock);
  1513. }
  1514. auto Parser::HandleStatementWhileBlockFinishState() -> void {
  1515. auto state = PopState();
  1516. AddNode(ParseNodeKind::WhileStatement, state.token, state.subtree_start,
  1517. state.has_error);
  1518. }
  1519. auto Parser::HandleTypeIntroducer(ParseNodeKind introducer_kind,
  1520. ParserState after_params_state) -> void {
  1521. auto state = PopState();
  1522. AddLeafNode(introducer_kind, Consume());
  1523. state.state = after_params_state;
  1524. PushState(state);
  1525. state.state = ParserState::DeclarationNameAndParamsAsOptional;
  1526. PushState(state);
  1527. }
  1528. auto Parser::HandleTypeIntroducerAsClassState() -> void {
  1529. HandleTypeIntroducer(ParseNodeKind::ClassIntroducer,
  1530. ParserState::TypeAfterParamsAsClass);
  1531. }
  1532. auto Parser::HandleTypeIntroducerAsInterfaceState() -> void {
  1533. HandleTypeIntroducer(ParseNodeKind::InterfaceIntroducer,
  1534. ParserState::TypeAfterParamsAsInterface);
  1535. }
  1536. auto Parser::HandleTypeIntroducerAsNamedConstraintState() -> void {
  1537. HandleTypeIntroducer(ParseNodeKind::NamedConstraintIntroducer,
  1538. ParserState::TypeAfterParamsAsNamedConstraint);
  1539. }
  1540. auto Parser::HandleTypeAfterParams(ParseNodeKind declaration_kind,
  1541. ParseNodeKind definition_start_kind,
  1542. ParserState definition_finish_state)
  1543. -> void {
  1544. auto state = PopState();
  1545. if (state.has_error) {
  1546. HandleDeclarationError(state, declaration_kind,
  1547. /*skip_past_likely_end=*/true);
  1548. return;
  1549. }
  1550. if (auto semi = ConsumeIf(TokenKind::Semi)) {
  1551. AddNode(declaration_kind, *semi, state.subtree_start, state.has_error);
  1552. return;
  1553. }
  1554. if (!PositionIs(TokenKind::OpenCurlyBrace)) {
  1555. emitter_->Emit(*position_, ExpectedDeclarationSemiOrDefinition,
  1556. tokens_->GetKind(state.token));
  1557. HandleDeclarationError(state, declaration_kind,
  1558. /*skip_past_likely_end=*/true);
  1559. return;
  1560. }
  1561. state.state = definition_finish_state;
  1562. PushState(state);
  1563. PushState(ParserState::DeclarationScopeLoop);
  1564. AddNode(definition_start_kind, Consume(), state.subtree_start,
  1565. state.has_error);
  1566. }
  1567. auto Parser::HandleTypeAfterParamsAsClassState() -> void {
  1568. HandleTypeAfterParams(ParseNodeKind::ClassDeclaration,
  1569. ParseNodeKind::ClassDefinitionStart,
  1570. ParserState::TypeDefinitionFinishAsClass);
  1571. }
  1572. auto Parser::HandleTypeAfterParamsAsInterfaceState() -> void {
  1573. HandleTypeAfterParams(ParseNodeKind::InterfaceDeclaration,
  1574. ParseNodeKind::InterfaceDefinitionStart,
  1575. ParserState::TypeDefinitionFinishAsInterface);
  1576. }
  1577. auto Parser::HandleTypeAfterParamsAsNamedConstraintState() -> void {
  1578. HandleTypeAfterParams(ParseNodeKind::NamedConstraintDeclaration,
  1579. ParseNodeKind::NamedConstraintDefinitionStart,
  1580. ParserState::TypeDefinitionFinishAsNamedConstraint);
  1581. }
  1582. auto Parser::HandleTypeDefinitionFinish(ParseNodeKind definition_kind) -> void {
  1583. auto state = PopState();
  1584. AddNode(definition_kind, Consume(), state.subtree_start, state.has_error);
  1585. }
  1586. auto Parser::HandleTypeDefinitionFinishAsClassState() -> void {
  1587. HandleTypeDefinitionFinish(ParseNodeKind::ClassDefinition);
  1588. }
  1589. auto Parser::HandleTypeDefinitionFinishAsInterfaceState() -> void {
  1590. HandleTypeDefinitionFinish(ParseNodeKind::InterfaceDefinition);
  1591. }
  1592. auto Parser::HandleTypeDefinitionFinishAsNamedConstraintState() -> void {
  1593. HandleTypeDefinitionFinish(ParseNodeKind::NamedConstraintDefinition);
  1594. }
  1595. auto Parser::HandleVar(ParserState finish_state) -> void {
  1596. PopAndDiscardState();
  1597. // These will start at the `var`.
  1598. PushState(finish_state);
  1599. PushState(ParserState::VarAfterPattern);
  1600. AddLeafNode(ParseNodeKind::VariableIntroducer, Consume());
  1601. // This will start at the pattern.
  1602. PushState(ParserState::PatternAsVariable);
  1603. }
  1604. auto Parser::HandleVarAsSemicolonState() -> void {
  1605. HandleVar(ParserState::VarFinishAsSemicolon);
  1606. }
  1607. auto Parser::HandleVarAsForState() -> void {
  1608. HandleVar(ParserState::VarFinishAsFor);
  1609. }
  1610. auto Parser::HandleVarAfterPatternState() -> void {
  1611. auto state = PopState();
  1612. if (state.has_error) {
  1613. if (auto after_pattern = FindNextOf({TokenKind::Equal, TokenKind::Semi})) {
  1614. SkipTo(*after_pattern);
  1615. }
  1616. }
  1617. if (auto equals = ConsumeIf(TokenKind::Equal)) {
  1618. AddLeafNode(ParseNodeKind::VariableInitializer, *equals);
  1619. PushState(ParserState::Expression);
  1620. }
  1621. }
  1622. auto Parser::HandleVarFinishAsSemicolonState() -> void {
  1623. auto state = PopState();
  1624. auto end_token = state.token;
  1625. if (PositionIs(TokenKind::Semi)) {
  1626. end_token = Consume();
  1627. } else {
  1628. emitter_->Emit(*position_, ExpectedSemiAfterExpression);
  1629. state.has_error = true;
  1630. if (auto semi_token = SkipPastLikelyEnd(state.token)) {
  1631. end_token = *semi_token;
  1632. }
  1633. }
  1634. AddNode(ParseNodeKind::VariableDeclaration, end_token, state.subtree_start,
  1635. state.has_error);
  1636. }
  1637. auto Parser::HandleVarFinishAsForState() -> void {
  1638. auto state = PopState();
  1639. auto end_token = state.token;
  1640. if (PositionIs(TokenKind::In)) {
  1641. end_token = Consume();
  1642. } else if (PositionIs(TokenKind::Colon)) {
  1643. CARBON_DIAGNOSTIC(ExpectedInNotColon, Error,
  1644. "`:` should be replaced by `in`.");
  1645. emitter_->Emit(*position_, ExpectedInNotColon);
  1646. state.has_error = true;
  1647. end_token = Consume();
  1648. } else {
  1649. CARBON_DIAGNOSTIC(ExpectedIn, Error,
  1650. "Expected `in` after loop `var` declaration.");
  1651. emitter_->Emit(*position_, ExpectedIn);
  1652. state.has_error = true;
  1653. }
  1654. AddNode(ParseNodeKind::ForIn, end_token, state.subtree_start,
  1655. state.has_error);
  1656. }
  1657. } // namespace Carbon