parser_impl.cpp 45 KB

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