parser.cpp 62 KB

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