parser_impl.cpp 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156
  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_impl.h"
  5. #include <cstdlib>
  6. #include "common/check.h"
  7. #include "llvm/ADT/Optional.h"
  8. #include "llvm/Support/FormatVariadic.h"
  9. #include "llvm/Support/raw_ostream.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. CARBON_DIAGNOSTIC(ExpectedSemiAfterExpression, Error,
  16. "Expected `;` after expression.");
  17. // Manages the parser's stack depth, particularly decrementing on destruction.
  18. // This should only be instantiated through RETURN_IF_STACK_LIMITED.
  19. class ParseTree::Parser::ScopedStackStep {
  20. public:
  21. explicit ScopedStackStep(ParseTree::Parser* parser) : parser_(parser) {
  22. ++parser_->stack_depth_;
  23. }
  24. ~ScopedStackStep() { --parser_->stack_depth_; }
  25. auto VerifyUnderLimit() -> bool {
  26. if (parser_->stack_depth_ >= StackDepthLimit) {
  27. CARBON_DIAGNOSTIC(StackLimitExceeded, Error,
  28. "Exceeded recursion limit ({0})", int);
  29. parser_->emitter_.Emit(*parser_->position_, StackLimitExceeded,
  30. ParseTree::StackDepthLimit);
  31. return false;
  32. }
  33. return true;
  34. }
  35. private:
  36. ParseTree::Parser* parser_;
  37. };
  38. // Encapsulates checking the stack and erroring if needed. This should be called
  39. // at the start of every parse function.
  40. #define RETURN_IF_STACK_LIMITED(error_return_expr) \
  41. ScopedStackStep scoped_stack_step(this); \
  42. if (!scoped_stack_step.VerifyUnderLimit()) { \
  43. return (error_return_expr); \
  44. }
  45. // A relative location for characters in errors.
  46. enum class RelativeLocation : int8_t {
  47. Around,
  48. After,
  49. Before,
  50. };
  51. // Adapts RelativeLocation for use with formatv.
  52. static auto operator<<(llvm::raw_ostream& out, RelativeLocation loc)
  53. -> llvm::raw_ostream& {
  54. switch (loc) {
  55. case RelativeLocation::Around:
  56. out << "around";
  57. break;
  58. case RelativeLocation::After:
  59. out << "after";
  60. break;
  61. case RelativeLocation::Before:
  62. out << "before";
  63. break;
  64. }
  65. return out;
  66. }
  67. ParseTree::Parser::Parser(ParseTree& tree_arg, TokenizedBuffer& tokens_arg,
  68. TokenDiagnosticEmitter& emitter)
  69. : tree_(tree_arg),
  70. tokens_(tokens_arg),
  71. emitter_(emitter),
  72. position_(tokens_.tokens().begin()),
  73. end_(tokens_.tokens().end()) {
  74. CHECK(std::find_if(position_, end_,
  75. [&](TokenizedBuffer::Token t) {
  76. return tokens_.GetKind(t) == TokenKind::EndOfFile();
  77. }) != end_)
  78. << "No EndOfFileToken in token buffer.";
  79. }
  80. auto ParseTree::Parser::Parse(TokenizedBuffer& tokens,
  81. TokenDiagnosticEmitter& emitter) -> ParseTree {
  82. ParseTree tree(tokens);
  83. // We expect to have a 1:1 correspondence between tokens and tree nodes, so
  84. // reserve the space we expect to need here to avoid allocation and copying
  85. // overhead.
  86. tree.node_impls_.reserve(tokens.size());
  87. Parser parser(tree, tokens, emitter);
  88. while (!parser.AtEndOfFile()) {
  89. if (!parser.ParseDeclaration()) {
  90. // We don't have an enclosing parse tree node to mark as erroneous, so
  91. // just mark the tree as a whole.
  92. tree.has_errors_ = true;
  93. }
  94. }
  95. parser.AddLeafNode(ParseNodeKind::FileEnd(), *parser.position_);
  96. CHECK(tree.Verify()) << "Parse tree built but does not verify!";
  97. return tree;
  98. }
  99. auto ParseTree::Parser::Consume(TokenKind kind) -> TokenizedBuffer::Token {
  100. CHECK(kind != TokenKind::EndOfFile()) << "Cannot consume the EOF token!";
  101. CHECK(NextTokenIs(kind)) << "The current token is the wrong kind!";
  102. TokenizedBuffer::Token t = *position_;
  103. ++position_;
  104. CHECK(position_ != end_)
  105. << "Reached end of tokens without finding EOF token.";
  106. return t;
  107. }
  108. auto ParseTree::Parser::ConsumeIf(TokenKind kind)
  109. -> llvm::Optional<TokenizedBuffer::Token> {
  110. if (!NextTokenIs(kind)) {
  111. return {};
  112. }
  113. return Consume(kind);
  114. }
  115. auto ParseTree::Parser::AddLeafNode(ParseNodeKind kind,
  116. TokenizedBuffer::Token token) -> Node {
  117. Node n(tree_.node_impls_.size());
  118. tree_.node_impls_.push_back(NodeImpl(kind, token, /*subtree_size_arg=*/1));
  119. return n;
  120. }
  121. auto ParseTree::Parser::ConsumeAndAddLeafNodeIf(TokenKind t_kind,
  122. ParseNodeKind n_kind)
  123. -> llvm::Optional<Node> {
  124. auto t = ConsumeIf(t_kind);
  125. if (!t) {
  126. return {};
  127. }
  128. return AddLeafNode(n_kind, *t);
  129. }
  130. auto ParseTree::Parser::MarkNodeError(Node n) -> void {
  131. tree_.node_impls_[n.index_].has_error = true;
  132. tree_.has_errors_ = true;
  133. }
  134. // A marker for the start of a node's subtree.
  135. //
  136. // This is used to track the size of the node's subtree. It can be used
  137. // repeatedly if multiple subtrees start at the same position.
  138. struct ParseTree::Parser::SubtreeStart {
  139. int tree_size;
  140. };
  141. auto ParseTree::Parser::GetSubtreeStartPosition() -> SubtreeStart {
  142. return {static_cast<int>(tree_.node_impls_.size())};
  143. }
  144. auto ParseTree::Parser::AddNode(ParseNodeKind n_kind, TokenizedBuffer::Token t,
  145. SubtreeStart start, bool has_error) -> Node {
  146. // The size of the subtree is the change in size from when we started this
  147. // subtree to now, but including the node we're about to add.
  148. int tree_stop_size = static_cast<int>(tree_.node_impls_.size()) + 1;
  149. int subtree_size = tree_stop_size - start.tree_size;
  150. Node n(tree_.node_impls_.size());
  151. tree_.node_impls_.push_back(NodeImpl(n_kind, t, subtree_size));
  152. if (has_error) {
  153. MarkNodeError(n);
  154. }
  155. return n;
  156. }
  157. auto ParseTree::Parser::SkipMatchingGroup() -> bool {
  158. TokenizedBuffer::Token t = *position_;
  159. TokenKind t_kind = tokens_.GetKind(t);
  160. if (!t_kind.IsOpeningSymbol()) {
  161. return false;
  162. }
  163. SkipTo(tokens_.GetMatchedClosingToken(t));
  164. Consume(t_kind.GetClosingSymbol());
  165. return true;
  166. }
  167. auto ParseTree::Parser::SkipTo(TokenizedBuffer::Token t) -> void {
  168. CHECK(t >= *position_) << "Tried to skip backwards.";
  169. position_ = TokenizedBuffer::TokenIterator(t);
  170. CHECK(position_ != end_) << "Skipped past EOF.";
  171. }
  172. auto ParseTree::Parser::FindNextOf(
  173. std::initializer_list<TokenKind> desired_kinds)
  174. -> llvm::Optional<TokenizedBuffer::Token> {
  175. auto new_position = position_;
  176. while (true) {
  177. TokenizedBuffer::Token token = *new_position;
  178. TokenKind kind = tokens_.GetKind(token);
  179. if (kind.IsOneOf(desired_kinds)) {
  180. return token;
  181. }
  182. // Step to the next token at the current bracketing level.
  183. if (kind.IsClosingSymbol() || kind == TokenKind::EndOfFile()) {
  184. // There are no more tokens at this level.
  185. return llvm::None;
  186. } else if (kind.IsOpeningSymbol()) {
  187. new_position =
  188. TokenizedBuffer::TokenIterator(tokens_.GetMatchedClosingToken(token));
  189. // Advance past the closing token.
  190. ++new_position;
  191. } else {
  192. ++new_position;
  193. }
  194. }
  195. }
  196. auto ParseTree::Parser::SkipPastLikelyEnd(TokenizedBuffer::Token skip_root,
  197. SemiHandler on_semi)
  198. -> llvm::Optional<Node> {
  199. if (AtEndOfFile()) {
  200. return llvm::None;
  201. }
  202. TokenizedBuffer::Line root_line = tokens_.GetLine(skip_root);
  203. int root_line_indent = tokens_.GetIndentColumnNumber(root_line);
  204. // We will keep scanning through tokens on the same line as the root or
  205. // lines with greater indentation than root's line.
  206. auto is_same_line_or_indent_greater_than_root =
  207. [&](TokenizedBuffer::Token t) {
  208. TokenizedBuffer::Line l = tokens_.GetLine(t);
  209. if (l == root_line) {
  210. return true;
  211. }
  212. return tokens_.GetIndentColumnNumber(l) > root_line_indent;
  213. };
  214. do {
  215. if (NextTokenKind() == TokenKind::CloseCurlyBrace()) {
  216. // Immediately bail out if we hit an unmatched close curly, this will
  217. // pop us up a level of the syntax grouping.
  218. return llvm::None;
  219. }
  220. // We assume that a semicolon is always intended to be the end of the
  221. // current construct.
  222. if (auto semi = ConsumeIf(TokenKind::Semi())) {
  223. return on_semi(*semi);
  224. }
  225. // Skip over any matching group of tokens_.
  226. if (SkipMatchingGroup()) {
  227. continue;
  228. }
  229. // Otherwise just step forward one token.
  230. Consume(NextTokenKind());
  231. } while (!AtEndOfFile() &&
  232. is_same_line_or_indent_greater_than_root(*position_));
  233. return llvm::None;
  234. }
  235. auto ParseTree::Parser::ParseCloseParen(TokenizedBuffer::Token open_paren,
  236. ParseNodeKind kind)
  237. -> llvm::Optional<Node> {
  238. if (auto close_paren =
  239. ConsumeAndAddLeafNodeIf(TokenKind::CloseParen(), kind)) {
  240. return close_paren;
  241. }
  242. // TODO: Include the location of the matching open_paren in the diagnostic.
  243. CARBON_DIAGNOSTIC(ExpectedCloseParen, Error, "Unexpected tokens before `)`.");
  244. emitter_.Emit(*position_, ExpectedCloseParen);
  245. SkipTo(tokens_.GetMatchedClosingToken(open_paren));
  246. AddLeafNode(kind, Consume(TokenKind::CloseParen()));
  247. return llvm::None;
  248. }
  249. template <typename ListElementParser, typename ListCompletionHandler>
  250. auto ParseTree::Parser::ParseList(TokenKind open, TokenKind close,
  251. ListElementParser list_element_parser,
  252. ParseNodeKind comma_kind,
  253. ListCompletionHandler list_handler,
  254. bool allow_trailing_comma)
  255. -> llvm::Optional<Node> {
  256. // `(` element-list[opt] `)`
  257. //
  258. // element-list ::= element
  259. // ::= element `,` element-list
  260. TokenizedBuffer::Token open_paren = Consume(open);
  261. bool has_errors = false;
  262. bool any_commas = false;
  263. int64_t num_elements = 0;
  264. // Parse elements, if any are specified.
  265. if (!NextTokenIs(close)) {
  266. while (true) {
  267. bool element_error = !list_element_parser();
  268. has_errors |= element_error;
  269. ++num_elements;
  270. if (!NextTokenIsOneOf({close, TokenKind::Comma()})) {
  271. if (!element_error) {
  272. CARBON_DIAGNOSTIC(UnexpectedTokenAfterListElement, Error,
  273. "Expected `,` or `{0}`.", TokenKind);
  274. emitter_.Emit(*position_, UnexpectedTokenAfterListElement, close);
  275. }
  276. has_errors = true;
  277. auto end_of_element = FindNextOf({TokenKind::Comma(), close});
  278. // The lexer guarantees that parentheses are balanced.
  279. CHECK(end_of_element) << "missing matching `)` for `(`";
  280. SkipTo(*end_of_element);
  281. }
  282. if (NextTokenIs(close)) {
  283. break;
  284. }
  285. AddLeafNode(comma_kind, Consume(TokenKind::Comma()));
  286. any_commas = true;
  287. if (allow_trailing_comma && NextTokenIs(close)) {
  288. break;
  289. }
  290. }
  291. }
  292. bool is_single_item = num_elements == 1 && !any_commas;
  293. return list_handler(open_paren, is_single_item, Consume(close), has_errors);
  294. }
  295. auto ParseTree::Parser::ParsePattern(PatternKind kind) -> llvm::Optional<Node> {
  296. RETURN_IF_STACK_LIMITED(llvm::None);
  297. if (NextTokenIs(TokenKind::Identifier()) &&
  298. tokens_.GetKind(*(position_ + 1)) == TokenKind::Colon()) {
  299. // identifier `:` type
  300. auto start = GetSubtreeStartPosition();
  301. AddLeafNode(ParseNodeKind::DeclaredName(),
  302. Consume(TokenKind::Identifier()));
  303. auto colon = Consume(TokenKind::Colon());
  304. auto type = ParseType();
  305. return AddNode(ParseNodeKind::PatternBinding(), colon, start,
  306. /*has_error=*/!type);
  307. }
  308. switch (kind) {
  309. case PatternKind::Parameter:
  310. CARBON_DIAGNOSTIC(ExpectedParameterName, Error,
  311. "Expected parameter declaration.");
  312. emitter_.Emit(*position_, ExpectedParameterName);
  313. break;
  314. case PatternKind::Variable:
  315. CARBON_DIAGNOSTIC(ExpectedVariableName, Error,
  316. "Expected pattern in `var` declaration.");
  317. emitter_.Emit(*position_, ExpectedVariableName);
  318. break;
  319. }
  320. return llvm::None;
  321. }
  322. auto ParseTree::Parser::ParseFunctionParameter() -> llvm::Optional<Node> {
  323. RETURN_IF_STACK_LIMITED(llvm::None);
  324. return ParsePattern(PatternKind::Parameter);
  325. }
  326. auto ParseTree::Parser::ParseFunctionSignature() -> bool {
  327. RETURN_IF_STACK_LIMITED(false);
  328. auto start = GetSubtreeStartPosition();
  329. auto params = ParseParenList(
  330. [&] { return ParseFunctionParameter(); },
  331. ParseNodeKind::ParameterListComma(),
  332. [&](TokenizedBuffer::Token open_paren, bool /*is_single_item*/,
  333. TokenizedBuffer::Token close_paren, bool has_errors) {
  334. AddLeafNode(ParseNodeKind::ParameterListEnd(), close_paren);
  335. return AddNode(ParseNodeKind::ParameterList(), open_paren, start,
  336. has_errors);
  337. });
  338. auto start_return_type = GetSubtreeStartPosition();
  339. if (auto arrow = ConsumeIf(TokenKind::MinusGreater())) {
  340. auto return_type = ParseType();
  341. AddNode(ParseNodeKind::ReturnType(), *arrow, start_return_type,
  342. /*has_error=*/!return_type);
  343. if (!return_type) {
  344. return false;
  345. }
  346. }
  347. return params.hasValue();
  348. }
  349. auto ParseTree::Parser::ParseCodeBlock() -> llvm::Optional<Node> {
  350. RETURN_IF_STACK_LIMITED(llvm::None);
  351. llvm::Optional<TokenizedBuffer::Token> maybe_open_curly =
  352. ConsumeIf(TokenKind::OpenCurlyBrace());
  353. if (!maybe_open_curly) {
  354. // Recover by parsing a single statement.
  355. CARBON_DIAGNOSTIC(ExpectedCodeBlock, Error, "Expected braced code block.");
  356. emitter_.Emit(*position_, ExpectedCodeBlock);
  357. return ParseStatement();
  358. }
  359. TokenizedBuffer::Token open_curly = *maybe_open_curly;
  360. auto start = GetSubtreeStartPosition();
  361. bool has_errors = false;
  362. // Loop over all the different possibly nested elements in the code block.
  363. while (!NextTokenIs(TokenKind::CloseCurlyBrace())) {
  364. if (!ParseStatement()) {
  365. // We detected and diagnosed an error of some kind. We can trivially skip
  366. // to the actual close curly brace from here.
  367. // FIXME: It would be better to skip to the next semicolon, or the next
  368. // token at the start of a line with the same indent as this one.
  369. SkipTo(tokens_.GetMatchedClosingToken(open_curly));
  370. has_errors = true;
  371. break;
  372. }
  373. }
  374. // We always reach here having set our position in the token stream to the
  375. // close curly brace.
  376. AddLeafNode(ParseNodeKind::CodeBlockEnd(),
  377. Consume(TokenKind::CloseCurlyBrace()));
  378. return AddNode(ParseNodeKind::CodeBlock(), open_curly, start, has_errors);
  379. }
  380. auto ParseTree::Parser::ParseFunctionDeclaration() -> Node {
  381. TokenizedBuffer::Token function_intro_token = Consume(TokenKind::Fn());
  382. auto start = GetSubtreeStartPosition();
  383. auto add_error_function_node = [&] {
  384. return AddNode(ParseNodeKind::FunctionDeclaration(), function_intro_token,
  385. start, /*has_error=*/true);
  386. };
  387. RETURN_IF_STACK_LIMITED(add_error_function_node());
  388. auto handle_semi_in_error_recovery = [&](TokenizedBuffer::Token semi) {
  389. return AddLeafNode(ParseNodeKind::DeclarationEnd(), semi);
  390. };
  391. auto name_n = ConsumeAndAddLeafNodeIf(TokenKind::Identifier(),
  392. ParseNodeKind::DeclaredName());
  393. if (!name_n) {
  394. CARBON_DIAGNOSTIC(ExpectedFunctionName, Error,
  395. "Expected function name after `fn` keyword.");
  396. emitter_.Emit(*position_, ExpectedFunctionName);
  397. // FIXME: We could change the lexer to allow us to synthesize certain
  398. // kinds of tokens and try to "recover" here, but unclear that this is
  399. // really useful.
  400. SkipPastLikelyEnd(function_intro_token, handle_semi_in_error_recovery);
  401. return add_error_function_node();
  402. }
  403. TokenizedBuffer::Token open_paren = *position_;
  404. if (tokens_.GetKind(open_paren) != TokenKind::OpenParen()) {
  405. CARBON_DIAGNOSTIC(ExpectedFunctionParams, Error,
  406. "Expected `(` after function name.");
  407. emitter_.Emit(open_paren, ExpectedFunctionParams);
  408. SkipPastLikelyEnd(function_intro_token, handle_semi_in_error_recovery);
  409. return add_error_function_node();
  410. }
  411. TokenizedBuffer::Token close_paren =
  412. tokens_.GetMatchedClosingToken(open_paren);
  413. if (!ParseFunctionSignature()) {
  414. // Don't try to parse more of the function declaration, but consume a
  415. // declaration ending semicolon if found (without going to a new line).
  416. SkipPastLikelyEnd(function_intro_token, handle_semi_in_error_recovery);
  417. return add_error_function_node();
  418. }
  419. // See if we should parse a definition which is represented as a code block.
  420. if (NextTokenIs(TokenKind::OpenCurlyBrace())) {
  421. if (!ParseCodeBlock()) {
  422. return add_error_function_node();
  423. }
  424. } else if (!ConsumeAndAddLeafNodeIf(TokenKind::Semi(),
  425. ParseNodeKind::DeclarationEnd())) {
  426. CARBON_DIAGNOSTIC(
  427. ExpectedFunctionBodyOrSemi, Error,
  428. "Expected function definition or `;` after function declaration.");
  429. emitter_.Emit(*position_, ExpectedFunctionBodyOrSemi);
  430. if (tokens_.GetLine(*position_) == tokens_.GetLine(close_paren)) {
  431. // Only need to skip if we've not already found a new line.
  432. SkipPastLikelyEnd(function_intro_token, handle_semi_in_error_recovery);
  433. }
  434. return add_error_function_node();
  435. }
  436. // Successfully parsed the function, add that node.
  437. return AddNode(ParseNodeKind::FunctionDeclaration(), function_intro_token,
  438. start);
  439. }
  440. auto ParseTree::Parser::ParseVariableDeclaration() -> Node {
  441. // `var` pattern [= expression] `;`
  442. TokenizedBuffer::Token var_token = Consume(TokenKind::Var());
  443. auto start = GetSubtreeStartPosition();
  444. RETURN_IF_STACK_LIMITED(AddNode(ParseNodeKind::VariableDeclaration(),
  445. var_token, start,
  446. /*has_error=*/true));
  447. auto pattern = ParsePattern(PatternKind::Variable);
  448. if (!pattern) {
  449. if (auto after_pattern =
  450. FindNextOf({TokenKind::Equal(), TokenKind::Semi()})) {
  451. SkipTo(*after_pattern);
  452. }
  453. }
  454. auto start_init = GetSubtreeStartPosition();
  455. if (auto equal_token = ConsumeIf(TokenKind::Equal())) {
  456. auto init = ParseExpression();
  457. AddNode(ParseNodeKind::VariableInitializer(), *equal_token, start_init,
  458. /*has_error=*/!init);
  459. }
  460. auto semi = ConsumeAndAddLeafNodeIf(TokenKind::Semi(),
  461. ParseNodeKind::DeclarationEnd());
  462. if (!semi) {
  463. emitter_.Emit(*position_, ExpectedSemiAfterExpression);
  464. SkipPastLikelyEnd(var_token, [&](TokenizedBuffer::Token semi) {
  465. return AddLeafNode(ParseNodeKind::DeclarationEnd(), semi);
  466. });
  467. }
  468. return AddNode(ParseNodeKind::VariableDeclaration(), var_token, start,
  469. /*has_error=*/!pattern || !semi);
  470. }
  471. auto ParseTree::Parser::ParseEmptyDeclaration() -> Node {
  472. return AddLeafNode(ParseNodeKind::EmptyDeclaration(),
  473. Consume(TokenKind::Semi()));
  474. }
  475. auto ParseTree::Parser::ParseDeclaration() -> llvm::Optional<Node> {
  476. RETURN_IF_STACK_LIMITED(llvm::None);
  477. switch (NextTokenKind()) {
  478. case TokenKind::Fn():
  479. return ParseFunctionDeclaration();
  480. case TokenKind::Var():
  481. return ParseVariableDeclaration();
  482. case TokenKind::Semi():
  483. return ParseEmptyDeclaration();
  484. case TokenKind::EndOfFile():
  485. return llvm::None;
  486. default:
  487. // Errors are handled outside the switch.
  488. break;
  489. }
  490. // We didn't recognize an introducer for a valid declaration.
  491. CARBON_DIAGNOSTIC(UnrecognizedDeclaration, Error,
  492. "Unrecognized declaration introducer.");
  493. emitter_.Emit(*position_, UnrecognizedDeclaration);
  494. // Skip forward past any end of a declaration we simply didn't understand so
  495. // that we can find the start of the next declaration or the end of a scope.
  496. if (auto found_semi_n =
  497. SkipPastLikelyEnd(*position_, [&](TokenizedBuffer::Token semi) {
  498. return AddLeafNode(ParseNodeKind::EmptyDeclaration(), semi);
  499. })) {
  500. MarkNodeError(*found_semi_n);
  501. return *found_semi_n;
  502. }
  503. // Nothing, not even a semicolon found.
  504. return llvm::None;
  505. }
  506. auto ParseTree::Parser::ParseParenExpression() -> llvm::Optional<Node> {
  507. RETURN_IF_STACK_LIMITED(llvm::None);
  508. // parenthesized-expression ::= `(` expression `)`
  509. // tuple-literal ::= `(` `)`
  510. // ::= `(` expression `,` [expression-list [`,`]] `)`
  511. //
  512. // Parse the union of these, `(` [expression-list [`,`]] `)`, and work out
  513. // whether it's a tuple or a parenthesized expression afterwards.
  514. auto start = GetSubtreeStartPosition();
  515. return ParseParenList(
  516. [&] { return ParseExpression(); }, ParseNodeKind::TupleLiteralComma(),
  517. [&](TokenizedBuffer::Token open_paren, bool is_single_item,
  518. TokenizedBuffer::Token close_paren, bool has_arg_errors) {
  519. AddLeafNode(is_single_item ? ParseNodeKind::ParenExpressionEnd()
  520. : ParseNodeKind::TupleLiteralEnd(),
  521. close_paren);
  522. return AddNode(is_single_item ? ParseNodeKind::ParenExpression()
  523. : ParseNodeKind::TupleLiteral(),
  524. open_paren, start, has_arg_errors);
  525. },
  526. /*allow_trailing_comma=*/true);
  527. }
  528. auto ParseTree::Parser::ParseBraceExpression() -> llvm::Optional<Node> {
  529. RETURN_IF_STACK_LIMITED(llvm::None);
  530. // braced-expression ::= `{` [field-value-list] `}`
  531. // ::= `{` field-type-list `}`
  532. // field-value-list ::= field-value [`,`]
  533. // ::= field-value `,` field-value-list
  534. // field-value ::= `.` identifier `=` expression
  535. // field-type-list ::= field-type [`,`]
  536. // ::= field-type `,` field-type-list
  537. // field-type ::= `.` identifier `:` type
  538. //
  539. // Note that `{` `}` is the first form (an empty struct), but that an empty
  540. // struct value also behaves as an empty struct type.
  541. auto start = GetSubtreeStartPosition();
  542. enum Kind { Unknown, Value, Type };
  543. Kind kind = Unknown;
  544. return ParseList(
  545. TokenKind::OpenCurlyBrace(), TokenKind::CloseCurlyBrace(),
  546. [&]() -> llvm::Optional<Node> {
  547. auto start_elem = GetSubtreeStartPosition();
  548. auto diagnose_invalid_syntax = [&] {
  549. CARBON_DIAGNOSTIC(ExpectedStructLiteralField, Error,
  550. "Expected {0}{1}{2}.", llvm::StringRef,
  551. llvm::StringRef, llvm::StringRef);
  552. bool can_be_type = kind != Value;
  553. bool can_be_value = kind != Type;
  554. emitter_.Emit(*position_, ExpectedStructLiteralField,
  555. can_be_type ? "`.field: type`" : "",
  556. (can_be_type && can_be_value) ? " or " : "",
  557. can_be_value ? "`.field = value`" : "");
  558. return llvm::None;
  559. };
  560. if (!NextTokenIs(TokenKind::Period())) {
  561. return diagnose_invalid_syntax();
  562. }
  563. auto designator = ParseDesignatorExpression(
  564. start_elem, ParseNodeKind::StructFieldDesignator(),
  565. /*has_errors=*/false);
  566. if (!designator) {
  567. auto recovery_pos = FindNextOf(
  568. {TokenKind::Equal(), TokenKind::Colon(), TokenKind::Comma()});
  569. if (!recovery_pos ||
  570. tokens_.GetKind(*recovery_pos) == TokenKind::Comma()) {
  571. return llvm::None;
  572. }
  573. SkipTo(*recovery_pos);
  574. }
  575. // Work out the kind of this element
  576. Kind elem_kind = (NextTokenIs(TokenKind::Equal()) ? Value
  577. : NextTokenIs(TokenKind::Colon()) ? Type
  578. : Unknown);
  579. if (elem_kind == Unknown || (kind != Unknown && elem_kind != kind)) {
  580. return diagnose_invalid_syntax();
  581. }
  582. kind = elem_kind;
  583. // Struct type fields and value fields use the same grammar except that
  584. // one has a `:` separator and the other has an `=` separator.
  585. auto equal_or_colon_token =
  586. Consume(kind == Type ? TokenKind::Colon() : TokenKind::Equal());
  587. auto type_or_value = ParseExpression();
  588. return AddNode(kind == Type ? ParseNodeKind::StructFieldType()
  589. : ParseNodeKind::StructFieldValue(),
  590. equal_or_colon_token, start_elem,
  591. /*has_error=*/!designator || !type_or_value);
  592. },
  593. ParseNodeKind::StructComma(),
  594. [&](TokenizedBuffer::Token open_brace, bool /*is_single_item*/,
  595. TokenizedBuffer::Token close_brace, bool has_errors) {
  596. AddLeafNode(ParseNodeKind::StructEnd(), close_brace);
  597. return AddNode(kind == Type ? ParseNodeKind::StructTypeLiteral()
  598. : ParseNodeKind::StructLiteral(),
  599. open_brace, start, has_errors);
  600. },
  601. /*allow_trailing_comma=*/true);
  602. }
  603. auto ParseTree::Parser::ParsePrimaryExpression() -> llvm::Optional<Node> {
  604. RETURN_IF_STACK_LIMITED(llvm::None);
  605. llvm::Optional<ParseNodeKind> kind;
  606. switch (NextTokenKind()) {
  607. case TokenKind::Identifier():
  608. kind = ParseNodeKind::NameReference();
  609. break;
  610. case TokenKind::IntegerLiteral():
  611. case TokenKind::RealLiteral():
  612. case TokenKind::StringLiteral():
  613. case TokenKind::IntegerTypeLiteral():
  614. case TokenKind::UnsignedIntegerTypeLiteral():
  615. case TokenKind::FloatingPointTypeLiteral():
  616. kind = ParseNodeKind::Literal();
  617. break;
  618. case TokenKind::OpenParen():
  619. return ParseParenExpression();
  620. case TokenKind::OpenCurlyBrace():
  621. return ParseBraceExpression();
  622. default:
  623. CARBON_DIAGNOSTIC(ExpectedExpression, Error, "Expected expression.");
  624. emitter_.Emit(*position_, ExpectedExpression);
  625. return llvm::None;
  626. }
  627. return AddLeafNode(*kind, Consume(NextTokenKind()));
  628. }
  629. auto ParseTree::Parser::ParseDesignatorExpression(SubtreeStart start,
  630. ParseNodeKind kind,
  631. bool has_errors)
  632. -> llvm::Optional<Node> {
  633. // `.` identifier
  634. auto dot = Consume(TokenKind::Period());
  635. auto name = ConsumeIf(TokenKind::Identifier());
  636. if (name) {
  637. AddLeafNode(ParseNodeKind::DesignatedName(), *name);
  638. } else {
  639. CARBON_DIAGNOSTIC(ExpectedIdentifierAfterDot, Error,
  640. "Expected identifier after `.`.");
  641. emitter_.Emit(*position_, ExpectedIdentifierAfterDot);
  642. // If we see a keyword, assume it was intended to be the designated name.
  643. // TODO: Should keywords be valid in designators?
  644. if (NextTokenKind().IsKeyword()) {
  645. name = Consume(NextTokenKind());
  646. auto name_node = AddLeafNode(ParseNodeKind::DesignatedName(), *name);
  647. MarkNodeError(name_node);
  648. } else {
  649. has_errors = true;
  650. }
  651. }
  652. Node result = AddNode(kind, dot, start, has_errors);
  653. return name ? result : llvm::Optional<Node>();
  654. }
  655. auto ParseTree::Parser::ParseCallExpression(SubtreeStart start, bool has_errors)
  656. -> llvm::Optional<Node> {
  657. RETURN_IF_STACK_LIMITED(llvm::None);
  658. // `(` expression-list[opt] `)`
  659. //
  660. // expression-list ::= expression
  661. // ::= expression `,` expression-list
  662. return ParseParenList(
  663. [&] { return ParseExpression(); }, ParseNodeKind::CallExpressionComma(),
  664. [&](TokenizedBuffer::Token open_paren, bool /*is_single_item*/,
  665. TokenizedBuffer::Token close_paren, bool has_arg_errors) {
  666. AddLeafNode(ParseNodeKind::CallExpressionEnd(), close_paren);
  667. return AddNode(ParseNodeKind::CallExpression(), open_paren, start,
  668. has_errors || has_arg_errors);
  669. });
  670. }
  671. auto ParseTree::Parser::ParsePostfixExpression() -> llvm::Optional<Node> {
  672. RETURN_IF_STACK_LIMITED(llvm::None);
  673. auto start = GetSubtreeStartPosition();
  674. llvm::Optional<Node> expression = ParsePrimaryExpression();
  675. TokenizedBuffer::TokenIterator last_position = position_;
  676. while (true) {
  677. switch (NextTokenKind()) {
  678. case TokenKind::Period():
  679. expression = ParseDesignatorExpression(
  680. start, ParseNodeKind::DesignatorExpression(), !expression);
  681. break;
  682. case TokenKind::OpenParen():
  683. expression = ParseCallExpression(start, !expression);
  684. break;
  685. default:
  686. return expression;
  687. }
  688. // This is subject to an infinite loop if a child call fails, so monitor for
  689. // stalling.
  690. if (last_position == position_) {
  691. CHECK(expression == llvm::None);
  692. return expression;
  693. }
  694. last_position = position_;
  695. }
  696. }
  697. // Determines whether the given token is considered to be the start of an
  698. // operand according to the rules for infix operator parsing.
  699. static auto IsAssumedStartOfOperand(TokenKind kind) -> bool {
  700. return kind.IsOneOf({TokenKind::OpenParen(), TokenKind::Identifier(),
  701. TokenKind::IntegerLiteral(), TokenKind::RealLiteral(),
  702. TokenKind::StringLiteral()});
  703. }
  704. // Determines whether the given token is considered to be the end of an operand
  705. // according to the rules for infix operator parsing.
  706. static auto IsAssumedEndOfOperand(TokenKind kind) -> bool {
  707. return kind.IsOneOf({TokenKind::CloseParen(), TokenKind::CloseCurlyBrace(),
  708. TokenKind::CloseSquareBracket(), TokenKind::Identifier(),
  709. TokenKind::IntegerLiteral(), TokenKind::RealLiteral(),
  710. TokenKind::StringLiteral()});
  711. }
  712. // Determines whether the given token could possibly be the start of an operand.
  713. // This is conservatively correct, and will never incorrectly return `false`,
  714. // but can incorrectly return `true`.
  715. static auto IsPossibleStartOfOperand(TokenKind kind) -> bool {
  716. return !kind.IsOneOf({TokenKind::CloseParen(), TokenKind::CloseCurlyBrace(),
  717. TokenKind::CloseSquareBracket(), TokenKind::Comma(),
  718. TokenKind::Semi(), TokenKind::Colon()});
  719. }
  720. auto ParseTree::Parser::IsLexicallyValidInfixOperator() -> bool {
  721. CHECK(!AtEndOfFile()) << "Expected an operator token.";
  722. bool leading_space = tokens_.HasLeadingWhitespace(*position_);
  723. bool trailing_space = tokens_.HasTrailingWhitespace(*position_);
  724. // If there's whitespace on both sides, it's an infix operator.
  725. if (leading_space && trailing_space) {
  726. return true;
  727. }
  728. // If there's whitespace on exactly one side, it's not an infix operator.
  729. if (leading_space || trailing_space) {
  730. return false;
  731. }
  732. // Otherwise, for an infix operator, the preceding token must be any close
  733. // bracket, identifier, or literal and the next token must be an open paren,
  734. // identifier, or literal.
  735. if (position_ == tokens_.tokens().begin() ||
  736. !IsAssumedEndOfOperand(tokens_.GetKind(*(position_ - 1))) ||
  737. !IsAssumedStartOfOperand(tokens_.GetKind(*(position_ + 1)))) {
  738. return false;
  739. }
  740. return true;
  741. }
  742. auto ParseTree::Parser::DiagnoseOperatorFixity(OperatorFixity fixity) -> void {
  743. bool is_valid_as_infix = IsLexicallyValidInfixOperator();
  744. if (fixity == OperatorFixity::Infix) {
  745. // Infix operators must satisfy the infix operator rules.
  746. if (!is_valid_as_infix) {
  747. CARBON_DIAGNOSTIC(BinaryOperatorRequiresWhitespace, Error,
  748. "Whitespace missing {0} binary operator.",
  749. RelativeLocation);
  750. emitter_.Emit(*position_, BinaryOperatorRequiresWhitespace,
  751. tokens_.HasLeadingWhitespace(*position_)
  752. ? RelativeLocation::After
  753. : (tokens_.HasTrailingWhitespace(*position_)
  754. ? RelativeLocation::Before
  755. : RelativeLocation::Around));
  756. }
  757. } else {
  758. bool prefix = fixity == OperatorFixity::Prefix;
  759. // Whitespace is not permitted between a symbolic pre/postfix operator and
  760. // its operand.
  761. if (NextTokenKind().IsSymbol() &&
  762. (prefix ? tokens_.HasTrailingWhitespace(*position_)
  763. : tokens_.HasLeadingWhitespace(*position_))) {
  764. CARBON_DIAGNOSTIC(UnaryOperatorHasWhitespace, Error,
  765. "Whitespace is not allowed {0} this unary operator.",
  766. RelativeLocation);
  767. emitter_.Emit(
  768. *position_, UnaryOperatorHasWhitespace,
  769. prefix ? RelativeLocation::After : RelativeLocation::Before);
  770. }
  771. // Pre/postfix operators must not satisfy the infix operator rules.
  772. if (is_valid_as_infix) {
  773. CARBON_DIAGNOSTIC(UnaryOperatorRequiresWhitespace, Error,
  774. "Whitespace is required {0} this unary operator.",
  775. RelativeLocation);
  776. emitter_.Emit(
  777. *position_, UnaryOperatorRequiresWhitespace,
  778. prefix ? RelativeLocation::Before : RelativeLocation::After);
  779. }
  780. }
  781. }
  782. auto ParseTree::Parser::IsTrailingOperatorInfix() -> bool {
  783. if (AtEndOfFile()) {
  784. return false;
  785. }
  786. // An operator that follows the infix operator rules is parsed as
  787. // infix, unless the next token means that it can't possibly be.
  788. if (IsLexicallyValidInfixOperator() &&
  789. IsPossibleStartOfOperand(tokens_.GetKind(*(position_ + 1)))) {
  790. return true;
  791. }
  792. // A trailing operator with leading whitespace that's not valid as infix is
  793. // not valid at all. If the next token looks like the start of an operand,
  794. // then parse as infix, otherwise as postfix. Either way we'll produce a
  795. // diagnostic later on.
  796. if (tokens_.HasLeadingWhitespace(*position_) &&
  797. IsAssumedStartOfOperand(tokens_.GetKind(*(position_ + 1)))) {
  798. return true;
  799. }
  800. return false;
  801. }
  802. auto ParseTree::Parser::ParseOperatorExpression(
  803. PrecedenceGroup ambient_precedence) -> llvm::Optional<Node> {
  804. // May be omitted a couple different ways here.
  805. CARBON_DIAGNOSTIC(
  806. OperatorRequiresParentheses, Error,
  807. "Parentheses are required to disambiguate operator precedence.");
  808. RETURN_IF_STACK_LIMITED(llvm::None);
  809. auto start = GetSubtreeStartPosition();
  810. llvm::Optional<Node> lhs;
  811. PrecedenceGroup lhs_precedence = PrecedenceGroup::ForPostfixExpression();
  812. // Check for a prefix operator.
  813. if (auto operator_precedence = PrecedenceGroup::ForLeading(NextTokenKind());
  814. !operator_precedence) {
  815. lhs = ParsePostfixExpression();
  816. } else {
  817. if (PrecedenceGroup::GetPriority(ambient_precedence,
  818. *operator_precedence) !=
  819. OperatorPriority::RightFirst) {
  820. // The precedence rules don't permit this prefix operator in this
  821. // context. Diagnose this, but carry on and parse it anyway.
  822. emitter_.Emit(*position_, OperatorRequiresParentheses);
  823. } else {
  824. // Check that this operator follows the proper whitespace rules.
  825. DiagnoseOperatorFixity(OperatorFixity::Prefix);
  826. }
  827. auto operator_token = Consume(NextTokenKind());
  828. bool has_errors = !ParseOperatorExpression(*operator_precedence);
  829. lhs = AddNode(ParseNodeKind::PrefixOperator(), operator_token, start,
  830. has_errors);
  831. lhs_precedence = *operator_precedence;
  832. }
  833. // Consume a sequence of infix and postfix operators.
  834. while (auto trailing_operator = PrecedenceGroup::ForTrailing(
  835. NextTokenKind(), IsTrailingOperatorInfix())) {
  836. auto [operator_precedence, is_binary] = *trailing_operator;
  837. // FIXME: If this operator is ambiguous with either the ambient precedence
  838. // or the LHS precedence, and there's a variant with a different fixity
  839. // that would work, use that one instead for error recovery.
  840. if (PrecedenceGroup::GetPriority(ambient_precedence, operator_precedence) !=
  841. OperatorPriority::RightFirst) {
  842. // The precedence rules don't permit this operator in this context. Try
  843. // again in the enclosing expression context.
  844. return lhs;
  845. }
  846. if (PrecedenceGroup::GetPriority(lhs_precedence, operator_precedence) !=
  847. OperatorPriority::LeftFirst) {
  848. // Either the LHS operator and this operator are ambiguous, or the
  849. // LHS operaor is a unary operator that can't be nested within
  850. // this operator. Either way, parentheses are required.
  851. emitter_.Emit(*position_, OperatorRequiresParentheses);
  852. lhs = llvm::None;
  853. } else {
  854. DiagnoseOperatorFixity(is_binary ? OperatorFixity::Infix
  855. : OperatorFixity::Postfix);
  856. }
  857. auto operator_token = Consume(NextTokenKind());
  858. if (is_binary) {
  859. auto rhs = ParseOperatorExpression(operator_precedence);
  860. lhs = AddNode(ParseNodeKind::InfixOperator(), operator_token, start,
  861. /*has_error=*/!lhs || !rhs);
  862. } else {
  863. lhs = AddNode(ParseNodeKind::PostfixOperator(), operator_token, start,
  864. /*has_error=*/!lhs);
  865. }
  866. lhs_precedence = operator_precedence;
  867. }
  868. return lhs;
  869. }
  870. auto ParseTree::Parser::ParseExpression() -> llvm::Optional<Node> {
  871. RETURN_IF_STACK_LIMITED(llvm::None);
  872. return ParseOperatorExpression(PrecedenceGroup::ForTopLevelExpression());
  873. }
  874. auto ParseTree::Parser::ParseType() -> llvm::Optional<Node> {
  875. RETURN_IF_STACK_LIMITED(llvm::None);
  876. return ParseOperatorExpression(PrecedenceGroup::ForType());
  877. }
  878. auto ParseTree::Parser::ParseExpressionStatement() -> llvm::Optional<Node> {
  879. RETURN_IF_STACK_LIMITED(llvm::None);
  880. TokenizedBuffer::Token start_token = *position_;
  881. auto start = GetSubtreeStartPosition();
  882. bool has_errors = !ParseExpression();
  883. if (auto semi = ConsumeIf(TokenKind::Semi())) {
  884. return AddNode(ParseNodeKind::ExpressionStatement(), *semi, start,
  885. has_errors);
  886. }
  887. if (!has_errors) {
  888. emitter_.Emit(*position_, ExpectedSemiAfterExpression);
  889. }
  890. if (auto recovery_node =
  891. SkipPastLikelyEnd(start_token, [&](TokenizedBuffer::Token semi) {
  892. return AddNode(ParseNodeKind::ExpressionStatement(), semi, start,
  893. true);
  894. })) {
  895. return recovery_node;
  896. }
  897. // Found junk not even followed by a `;`.
  898. return llvm::None;
  899. }
  900. auto ParseTree::Parser::ParseParenCondition(TokenKind introducer)
  901. -> llvm::Optional<Node> {
  902. RETURN_IF_STACK_LIMITED(llvm::None);
  903. // `(` expression `)`
  904. auto start = GetSubtreeStartPosition();
  905. auto open_paren = ConsumeIf(TokenKind::OpenParen());
  906. if (!open_paren) {
  907. CARBON_DIAGNOSTIC(ExpectedParenAfter, Error, "Expected `(` after `{0}`.",
  908. TokenKind);
  909. emitter_.Emit(*position_, ExpectedParenAfter, introducer);
  910. }
  911. auto expr = ParseExpression();
  912. if (!open_paren) {
  913. // Don't expect a matching closing paren if there wasn't an opening paren.
  914. return llvm::None;
  915. }
  916. auto close_paren =
  917. ParseCloseParen(*open_paren, ParseNodeKind::ConditionEnd());
  918. return AddNode(ParseNodeKind::Condition(), *open_paren, start,
  919. /*has_error=*/!expr || !close_paren);
  920. }
  921. auto ParseTree::Parser::ParseIfStatement() -> llvm::Optional<Node> {
  922. auto start = GetSubtreeStartPosition();
  923. auto if_token = Consume(TokenKind::If());
  924. auto cond = ParseParenCondition(TokenKind::If());
  925. auto then_case = ParseCodeBlock();
  926. bool else_has_errors = false;
  927. if (ConsumeAndAddLeafNodeIf(TokenKind::Else(),
  928. ParseNodeKind::IfStatementElse())) {
  929. // 'else if' is permitted as a special case.
  930. if (NextTokenIs(TokenKind::If())) {
  931. else_has_errors = !ParseIfStatement();
  932. } else {
  933. else_has_errors = !ParseCodeBlock();
  934. }
  935. }
  936. return AddNode(ParseNodeKind::IfStatement(), if_token, start,
  937. /*has_error=*/!cond || !then_case || else_has_errors);
  938. }
  939. auto ParseTree::Parser::ParseWhileStatement() -> llvm::Optional<Node> {
  940. RETURN_IF_STACK_LIMITED(llvm::None);
  941. auto start = GetSubtreeStartPosition();
  942. auto while_token = Consume(TokenKind::While());
  943. auto cond = ParseParenCondition(TokenKind::While());
  944. auto body = ParseCodeBlock();
  945. return AddNode(ParseNodeKind::WhileStatement(), while_token, start,
  946. /*has_error=*/!cond || !body);
  947. }
  948. auto ParseTree::Parser::ParseKeywordStatement(ParseNodeKind kind,
  949. KeywordStatementArgument argument)
  950. -> llvm::Optional<Node> {
  951. RETURN_IF_STACK_LIMITED(llvm::None);
  952. auto keyword_kind = NextTokenKind();
  953. CHECK(keyword_kind.IsKeyword());
  954. auto start = GetSubtreeStartPosition();
  955. auto keyword = Consume(keyword_kind);
  956. bool arg_error = false;
  957. if ((argument == KeywordStatementArgument::Optional &&
  958. NextTokenKind() != TokenKind::Semi()) ||
  959. argument == KeywordStatementArgument::Mandatory) {
  960. arg_error = !ParseExpression();
  961. }
  962. auto semi =
  963. ConsumeAndAddLeafNodeIf(TokenKind::Semi(), ParseNodeKind::StatementEnd());
  964. if (!semi) {
  965. CARBON_DIAGNOSTIC(ExpectedSemiAfter, Error, "Expected `;` after `{0}`.",
  966. TokenKind);
  967. emitter_.Emit(*position_, ExpectedSemiAfter, keyword_kind);
  968. // FIXME: Try to skip to a semicolon to recover.
  969. }
  970. return AddNode(kind, keyword, start, /*has_error=*/!semi || arg_error);
  971. }
  972. auto ParseTree::Parser::ParseStatement() -> llvm::Optional<Node> {
  973. RETURN_IF_STACK_LIMITED(llvm::None);
  974. switch (NextTokenKind()) {
  975. case TokenKind::Var():
  976. return ParseVariableDeclaration();
  977. case TokenKind::If():
  978. return ParseIfStatement();
  979. case TokenKind::While():
  980. return ParseWhileStatement();
  981. case TokenKind::Continue():
  982. return ParseKeywordStatement(ParseNodeKind::ContinueStatement(),
  983. KeywordStatementArgument::None);
  984. case TokenKind::Break():
  985. return ParseKeywordStatement(ParseNodeKind::BreakStatement(),
  986. KeywordStatementArgument::None);
  987. case TokenKind::Return():
  988. return ParseKeywordStatement(ParseNodeKind::ReturnStatement(),
  989. KeywordStatementArgument::Optional);
  990. default:
  991. // A statement with no introducer token can only be an expression
  992. // statement.
  993. return ParseExpressionStatement();
  994. }
  995. }
  996. } // namespace Carbon