parser.cpp 54 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679
  1. // Part of the Carbon Language project, under the Apache License v2.0 with LLVM
  2. // Exceptions. See /LICENSE for license information.
  3. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. #include "toolchain/parser/parser.h"
  5. #include <cstdlib>
  6. #include <memory>
  7. #include "common/check.h"
  8. #include "llvm/ADT/Optional.h"
  9. #include "llvm/Support/PrettyStackTrace.h"
  10. #include "toolchain/lexer/token_kind.h"
  11. #include "toolchain/lexer/tokenized_buffer.h"
  12. #include "toolchain/parser/parse_node_kind.h"
  13. #include "toolchain/parser/parse_tree.h"
  14. namespace Carbon {
  15. // May be emitted a couple different ways as part of operator parsing.
  16. CARBON_DIAGNOSTIC(
  17. OperatorRequiresParentheses, Error,
  18. "Parentheses are required to disambiguate operator precedence.");
  19. CARBON_DIAGNOSTIC(ExpectedSemiAfterExpression, Error,
  20. "Expected `;` after expression.");
  21. // A relative location for characters in errors.
  22. enum class RelativeLocation : int8_t {
  23. Around,
  24. After,
  25. Before,
  26. };
  27. // Adapts RelativeLocation for use with formatv.
  28. static auto operator<<(llvm::raw_ostream& out, RelativeLocation loc)
  29. -> llvm::raw_ostream& {
  30. switch (loc) {
  31. case RelativeLocation::Around:
  32. out << "around";
  33. break;
  34. case RelativeLocation::After:
  35. out << "after";
  36. break;
  37. case RelativeLocation::Before:
  38. out << "before";
  39. break;
  40. }
  41. return out;
  42. }
  43. class Parser::PrettyStackTraceParseState : public llvm::PrettyStackTraceEntry {
  44. public:
  45. explicit PrettyStackTraceParseState(const Parser* parser) : parser_(parser) {}
  46. ~PrettyStackTraceParseState() override = default;
  47. auto print(llvm::raw_ostream& output) const -> void override {
  48. output << "Parser stack:\n";
  49. for (int i = 0; i < static_cast<int>(parser_->state_stack_.size()); ++i) {
  50. const auto& entry = parser_->state_stack_[i];
  51. output << "\t" << i << ".\t" << entry.state;
  52. Print(output, entry.token);
  53. }
  54. output << "\tcursor\tposition_";
  55. Print(output, *parser_->position_);
  56. }
  57. private:
  58. auto Print(llvm::raw_ostream& output, TokenizedBuffer::Token token) const
  59. -> void {
  60. auto line = parser_->tokens_.GetLine(token);
  61. output << " @ " << parser_->tokens_.GetLineNumber(line) << ":"
  62. << parser_->tokens_.GetColumnNumber(token) << ":"
  63. << " token " << token << " : "
  64. << parser_->tokens_.GetKind(token).Name() << "\n";
  65. }
  66. const Parser* parser_;
  67. };
  68. Parser::Parser(ParseTree& tree_arg, TokenizedBuffer& tokens_arg,
  69. TokenDiagnosticEmitter& emitter)
  70. : tree_(tree_arg),
  71. tokens_(tokens_arg),
  72. emitter_(emitter),
  73. position_(tokens_.tokens().begin()),
  74. end_(tokens_.tokens().end()) {
  75. CARBON_CHECK(position_ != end_) << "Empty TokenizedBuffer";
  76. --end_;
  77. CARBON_CHECK(tokens_.GetKind(*end_) == TokenKind::EndOfFile())
  78. << "TokenizedBuffer should end with EndOfFile, ended with "
  79. << tokens_.GetKind(*end_).Name();
  80. }
  81. auto Parser::AddLeafNode(ParseNodeKind kind, TokenizedBuffer::Token token,
  82. bool has_error) -> void {
  83. tree_.node_impls_.push_back(
  84. ParseTree::NodeImpl(kind, has_error, token, /*subtree_size=*/1));
  85. if (has_error) {
  86. tree_.has_errors_ = true;
  87. }
  88. }
  89. auto Parser::AddNode(ParseNodeKind kind, TokenizedBuffer::Token token,
  90. int subtree_start, bool has_error) -> void {
  91. int subtree_size = tree_.size() - subtree_start + 1;
  92. tree_.node_impls_.push_back(
  93. ParseTree::NodeImpl(kind, has_error, token, subtree_size));
  94. if (has_error) {
  95. tree_.has_errors_ = true;
  96. }
  97. }
  98. auto Parser::ConsumeAndAddCloseParen(TokenizedBuffer::Token open_paren,
  99. ParseNodeKind close_kind) -> bool {
  100. if (ConsumeAndAddLeafNodeIf(TokenKind::CloseParen(), close_kind)) {
  101. return true;
  102. }
  103. // TODO: Include the location of the matching open_paren in the diagnostic.
  104. CARBON_DIAGNOSTIC(ExpectedCloseParen, Error, "Unexpected tokens before `)`.");
  105. emitter_.Emit(*position_, ExpectedCloseParen);
  106. SkipTo(tokens_.GetMatchedClosingToken(open_paren));
  107. AddLeafNode(close_kind, *position_);
  108. ++position_;
  109. return false;
  110. }
  111. auto Parser::ConsumeAndAddLeafNodeIf(TokenKind token_kind,
  112. ParseNodeKind node_kind) -> bool {
  113. auto token = ConsumeIf(token_kind);
  114. if (!token) {
  115. return false;
  116. }
  117. AddLeafNode(node_kind, *token);
  118. return true;
  119. }
  120. auto Parser::ConsumeIf(TokenKind kind)
  121. -> llvm::Optional<TokenizedBuffer::Token> {
  122. if (!PositionIs(kind)) {
  123. return llvm::None;
  124. }
  125. auto token = *position_;
  126. ++position_;
  127. return token;
  128. }
  129. auto Parser::FindNextOf(std::initializer_list<TokenKind> desired_kinds)
  130. -> llvm::Optional<TokenizedBuffer::Token> {
  131. auto new_position = position_;
  132. while (true) {
  133. TokenizedBuffer::Token token = *new_position;
  134. TokenKind kind = tokens_.GetKind(token);
  135. if (kind.IsOneOf(desired_kinds)) {
  136. return token;
  137. }
  138. // Step to the next token at the current bracketing level.
  139. if (kind.IsClosingSymbol() || kind == TokenKind::EndOfFile()) {
  140. // There are no more tokens at this level.
  141. return llvm::None;
  142. } else if (kind.IsOpeningSymbol()) {
  143. new_position =
  144. TokenizedBuffer::TokenIterator(tokens_.GetMatchedClosingToken(token));
  145. // Advance past the closing token.
  146. ++new_position;
  147. } else {
  148. ++new_position;
  149. }
  150. }
  151. }
  152. auto Parser::SkipMatchingGroup() -> bool {
  153. if (!PositionKind().IsOpeningSymbol()) {
  154. return false;
  155. }
  156. SkipTo(tokens_.GetMatchedClosingToken(*position_));
  157. ++position_;
  158. return true;
  159. }
  160. auto Parser::SkipPastLikelyEnd(TokenizedBuffer::Token skip_root)
  161. -> llvm::Optional<TokenizedBuffer::Token> {
  162. if (position_ == end_) {
  163. return llvm::None;
  164. }
  165. TokenizedBuffer::Line root_line = tokens_.GetLine(skip_root);
  166. int root_line_indent = tokens_.GetIndentColumnNumber(root_line);
  167. // We will keep scanning through tokens on the same line as the root or
  168. // lines with greater indentation than root's line.
  169. auto is_same_line_or_indent_greater_than_root =
  170. [&](TokenizedBuffer::Token t) {
  171. TokenizedBuffer::Line l = tokens_.GetLine(t);
  172. if (l == root_line) {
  173. return true;
  174. }
  175. return tokens_.GetIndentColumnNumber(l) > root_line_indent;
  176. };
  177. do {
  178. if (PositionIs(TokenKind::CloseCurlyBrace())) {
  179. // Immediately bail out if we hit an unmatched close curly, this will
  180. // pop us up a level of the syntax grouping.
  181. return llvm::None;
  182. }
  183. // We assume that a semicolon is always intended to be the end of the
  184. // current construct.
  185. if (auto semi = ConsumeIf(TokenKind::Semi())) {
  186. return semi;
  187. }
  188. // Skip over any matching group of tokens_.
  189. if (SkipMatchingGroup()) {
  190. continue;
  191. }
  192. // Otherwise just step forward one token.
  193. ++position_;
  194. } while (position_ != end_ &&
  195. is_same_line_or_indent_greater_than_root(*position_));
  196. return llvm::None;
  197. }
  198. auto Parser::SkipTo(TokenizedBuffer::Token t) -> void {
  199. CARBON_CHECK(t >= *position_) << "Tried to skip backwards from " << position_
  200. << " to " << TokenizedBuffer::TokenIterator(t);
  201. position_ = TokenizedBuffer::TokenIterator(t);
  202. CARBON_CHECK(position_ != end_) << "Skipped past EOF.";
  203. }
  204. auto Parser::HandleCodeBlockState() -> void {
  205. PopAndDiscardState();
  206. PushState(ParserState::CodeBlockFinish());
  207. if (ConsumeAndAddLeafNodeIf(TokenKind::OpenCurlyBrace(),
  208. ParseNodeKind::CodeBlockStart())) {
  209. PushState(ParserState::StatementScopeLoop());
  210. } else {
  211. AddLeafNode(ParseNodeKind::CodeBlockStart(), *position_,
  212. /*has_error=*/true);
  213. // Recover by parsing a single statement.
  214. CARBON_DIAGNOSTIC(ExpectedCodeBlock, Error, "Expected braced code block.");
  215. emitter_.Emit(*position_, ExpectedCodeBlock);
  216. PushState(ParserState::Statement());
  217. }
  218. }
  219. // Determines whether the given token is considered to be the start of an
  220. // operand according to the rules for infix operator parsing.
  221. static auto IsAssumedStartOfOperand(TokenKind kind) -> bool {
  222. return kind.IsOneOf({TokenKind::OpenParen(), TokenKind::Identifier(),
  223. TokenKind::IntegerLiteral(), TokenKind::RealLiteral(),
  224. TokenKind::StringLiteral()});
  225. }
  226. // Determines whether the given token is considered to be the end of an
  227. // operand according to the rules for infix operator parsing.
  228. static auto IsAssumedEndOfOperand(TokenKind kind) -> bool {
  229. return kind.IsOneOf({TokenKind::CloseParen(), TokenKind::CloseCurlyBrace(),
  230. TokenKind::CloseSquareBracket(), TokenKind::Identifier(),
  231. TokenKind::IntegerLiteral(), TokenKind::RealLiteral(),
  232. TokenKind::StringLiteral()});
  233. }
  234. // Determines whether the given token could possibly be the start of an
  235. // operand. This is conservatively correct, and will never incorrectly return
  236. // `false`, but can incorrectly return `true`.
  237. static auto IsPossibleStartOfOperand(TokenKind kind) -> bool {
  238. return !kind.IsOneOf({TokenKind::CloseParen(), TokenKind::CloseCurlyBrace(),
  239. TokenKind::CloseSquareBracket(), TokenKind::Comma(),
  240. TokenKind::Semi(), TokenKind::Colon()});
  241. }
  242. auto Parser::IsLexicallyValidInfixOperator() -> bool {
  243. CARBON_CHECK(position_ != end_) << "Expected an operator token.";
  244. bool leading_space = tokens_.HasLeadingWhitespace(*position_);
  245. bool trailing_space = tokens_.HasTrailingWhitespace(*position_);
  246. // If there's whitespace on both sides, it's an infix operator.
  247. if (leading_space && trailing_space) {
  248. return true;
  249. }
  250. // If there's whitespace on exactly one side, it's not an infix operator.
  251. if (leading_space || trailing_space) {
  252. return false;
  253. }
  254. // Otherwise, for an infix operator, the preceding token must be any close
  255. // bracket, identifier, or literal and the next token must be an open paren,
  256. // identifier, or literal.
  257. if (position_ == tokens_.tokens().begin() ||
  258. !IsAssumedEndOfOperand(tokens_.GetKind(*(position_ - 1))) ||
  259. !IsAssumedStartOfOperand(tokens_.GetKind(*(position_ + 1)))) {
  260. return false;
  261. }
  262. return true;
  263. }
  264. auto Parser::IsTrailingOperatorInfix() -> bool {
  265. if (position_ == end_) {
  266. return false;
  267. }
  268. // An operator that follows the infix operator rules is parsed as
  269. // infix, unless the next token means that it can't possibly be.
  270. if (IsLexicallyValidInfixOperator() &&
  271. IsPossibleStartOfOperand(tokens_.GetKind(*(position_ + 1)))) {
  272. return true;
  273. }
  274. // A trailing operator with leading whitespace that's not valid as infix is
  275. // not valid at all. If the next token looks like the start of an operand,
  276. // then parse as infix, otherwise as postfix. Either way we'll produce a
  277. // diagnostic later on.
  278. if (tokens_.HasLeadingWhitespace(*position_) &&
  279. IsAssumedStartOfOperand(tokens_.GetKind(*(position_ + 1)))) {
  280. return true;
  281. }
  282. return false;
  283. }
  284. auto Parser::DiagnoseOperatorFixity(OperatorFixity fixity) -> void {
  285. if (fixity == OperatorFixity::Infix) {
  286. // Infix operators must satisfy the infix operator rules.
  287. if (!IsLexicallyValidInfixOperator()) {
  288. CARBON_DIAGNOSTIC(BinaryOperatorRequiresWhitespace, Error,
  289. "Whitespace missing {0} binary operator.",
  290. RelativeLocation);
  291. emitter_.Emit(*position_, BinaryOperatorRequiresWhitespace,
  292. tokens_.HasLeadingWhitespace(*position_)
  293. ? RelativeLocation::After
  294. : (tokens_.HasTrailingWhitespace(*position_)
  295. ? RelativeLocation::Before
  296. : RelativeLocation::Around));
  297. }
  298. } else {
  299. bool prefix = fixity == OperatorFixity::Prefix;
  300. // Whitespace is not permitted between a symbolic pre/postfix operator and
  301. // its operand.
  302. if (PositionKind().IsSymbol() &&
  303. (prefix ? tokens_.HasTrailingWhitespace(*position_)
  304. : tokens_.HasLeadingWhitespace(*position_))) {
  305. CARBON_DIAGNOSTIC(UnaryOperatorHasWhitespace, Error,
  306. "Whitespace is not allowed {0} this unary operator.",
  307. RelativeLocation);
  308. emitter_.Emit(
  309. *position_, UnaryOperatorHasWhitespace,
  310. prefix ? RelativeLocation::After : RelativeLocation::Before);
  311. }
  312. // Pre/postfix operators must not satisfy the infix operator rules.
  313. if (IsLexicallyValidInfixOperator()) {
  314. CARBON_DIAGNOSTIC(UnaryOperatorRequiresWhitespace, Error,
  315. "Whitespace is required {0} this unary operator.",
  316. RelativeLocation);
  317. emitter_.Emit(
  318. *position_, UnaryOperatorRequiresWhitespace,
  319. prefix ? RelativeLocation::Before : RelativeLocation::After);
  320. }
  321. }
  322. }
  323. auto Parser::ConsumeListToken(ParseNodeKind comma_kind, TokenKind close_kind,
  324. bool already_has_error) -> ListTokenKind {
  325. if (!PositionIs(TokenKind::Comma()) && !PositionIs(close_kind)) {
  326. // Don't error a second time on the same element.
  327. if (!already_has_error) {
  328. CARBON_DIAGNOSTIC(UnexpectedTokenAfterListElement, Error,
  329. "Expected `,` or `{0}`.", TokenKind);
  330. emitter_.Emit(*position_, UnexpectedTokenAfterListElement, close_kind);
  331. ReturnErrorOnState();
  332. }
  333. // Recover from the invalid token.
  334. auto end_of_element = FindNextOf({TokenKind::Comma(), close_kind});
  335. // The lexer guarantees that parentheses are balanced.
  336. CARBON_CHECK(end_of_element)
  337. << "missing matching `" << close_kind.GetOpeningSymbol() << "` for `"
  338. << close_kind << "`";
  339. SkipTo(*end_of_element);
  340. }
  341. if (PositionIs(close_kind)) {
  342. return ListTokenKind::Close;
  343. } else {
  344. AddLeafNode(comma_kind, Consume());
  345. return PositionIs(close_kind) ? ListTokenKind::CommaClose
  346. : ListTokenKind::Comma;
  347. }
  348. }
  349. auto Parser::Parse() -> void {
  350. // Traces state_stack_. This runs even in opt because it's low overhead.
  351. PrettyStackTraceParseState pretty_stack(this);
  352. PushState(ParserState::DeclarationLoop());
  353. while (!state_stack_.empty()) {
  354. switch (state_stack_.back().state) {
  355. #define CARBON_PARSER_STATE(Name) \
  356. case ParserState::Name(): \
  357. Handle##Name##State(); \
  358. break;
  359. #include "toolchain/parser/parser_state.def"
  360. }
  361. }
  362. AddLeafNode(ParseNodeKind::FileEnd(), *position_);
  363. }
  364. auto Parser::HandleBraceExpressionState() -> void {
  365. auto state = PopState();
  366. state.state = ParserState::BraceExpressionFinishAsUnknown();
  367. PushState(state);
  368. // TODO: When swapping {} start/end, this should AddLeafNode the open before
  369. // continuing.
  370. // Advance past the open brace.
  371. CARBON_CHECK(PositionIs(TokenKind::OpenCurlyBrace()));
  372. ++position_;
  373. if (!PositionIs(TokenKind::CloseCurlyBrace())) {
  374. PushState(ParserState::BraceExpressionParameterAsUnknown());
  375. }
  376. }
  377. auto Parser::BraceExpressionKindToParserState(BraceExpressionKind kind,
  378. ParserState type,
  379. ParserState value,
  380. ParserState unknown)
  381. -> ParserState {
  382. switch (kind) {
  383. case BraceExpressionKind::Type: {
  384. return type;
  385. }
  386. case BraceExpressionKind::Value: {
  387. return value;
  388. }
  389. case BraceExpressionKind::Unknown: {
  390. return unknown;
  391. }
  392. }
  393. }
  394. auto Parser::HandleBraceExpressionParameterError(StateStackEntry state,
  395. BraceExpressionKind kind)
  396. -> void {
  397. CARBON_DIAGNOSTIC(ExpectedStructLiteralField, Error, "Expected {0}{1}{2}.",
  398. llvm::StringRef, llvm::StringRef, llvm::StringRef);
  399. bool can_be_type = kind != BraceExpressionKind::Value;
  400. bool can_be_value = kind != BraceExpressionKind::Type;
  401. emitter_.Emit(*position_, ExpectedStructLiteralField,
  402. can_be_type ? "`.field: type`" : "",
  403. (can_be_type && can_be_value) ? " or " : "",
  404. can_be_value ? "`.field = value`" : "");
  405. state.state = BraceExpressionKindToParserState(
  406. kind, ParserState::BraceExpressionParameterFinishAsType(),
  407. ParserState::BraceExpressionParameterFinishAsValue(),
  408. ParserState::BraceExpressionParameterFinishAsUnknown());
  409. state.has_error = true;
  410. PushState(state);
  411. }
  412. auto Parser::HandleBraceExpressionParameter(BraceExpressionKind kind) -> void {
  413. auto state = PopState();
  414. if (!PositionIs(TokenKind::Period())) {
  415. HandleBraceExpressionParameterError(state, kind);
  416. return;
  417. }
  418. state.state = BraceExpressionKindToParserState(
  419. kind, ParserState::BraceExpressionParameterAfterDesignatorAsType(),
  420. ParserState::BraceExpressionParameterAfterDesignatorAsValue(),
  421. ParserState::BraceExpressionParameterAfterDesignatorAsUnknown());
  422. PushState(state);
  423. PushState(ParserState::DesignatorAsStruct());
  424. }
  425. auto Parser::HandleBraceExpressionParameterAsTypeState() -> void {
  426. HandleBraceExpressionParameter(BraceExpressionKind::Type);
  427. }
  428. auto Parser::HandleBraceExpressionParameterAsValueState() -> void {
  429. HandleBraceExpressionParameter(BraceExpressionKind::Value);
  430. }
  431. auto Parser::HandleBraceExpressionParameterAsUnknownState() -> void {
  432. HandleBraceExpressionParameter(BraceExpressionKind::Unknown);
  433. }
  434. auto Parser::HandleBraceExpressionParameterAfterDesignator(
  435. BraceExpressionKind kind) -> void {
  436. auto state = PopState();
  437. if (state.has_error) {
  438. auto recovery_pos = FindNextOf(
  439. {TokenKind::Equal(), TokenKind::Colon(), TokenKind::Comma()});
  440. if (!recovery_pos || tokens_.GetKind(*recovery_pos) == TokenKind::Comma()) {
  441. state.state = BraceExpressionKindToParserState(
  442. kind, ParserState::BraceExpressionParameterFinishAsType(),
  443. ParserState::BraceExpressionParameterFinishAsValue(),
  444. ParserState::BraceExpressionParameterFinishAsUnknown());
  445. PushState(state);
  446. return;
  447. }
  448. SkipTo(*recovery_pos);
  449. }
  450. // Work out the kind of this element.
  451. auto elem_kind = BraceExpressionKind::Unknown;
  452. if (PositionIs(TokenKind::Colon())) {
  453. elem_kind = BraceExpressionKind::Type;
  454. } else if (PositionIs(TokenKind::Equal())) {
  455. elem_kind = BraceExpressionKind::Value;
  456. }
  457. // Unknown kinds and changes between type and value are errors.
  458. if (elem_kind == BraceExpressionKind::Unknown ||
  459. (kind != BraceExpressionKind::Unknown && elem_kind != kind)) {
  460. HandleBraceExpressionParameterError(state, kind);
  461. return;
  462. }
  463. // If we're setting the kind, update the BraceExpressionFinish state.
  464. if (kind == BraceExpressionKind::Unknown) {
  465. kind = elem_kind;
  466. auto finish_state = PopState();
  467. CARBON_CHECK(finish_state.state ==
  468. ParserState::BraceExpressionFinishAsUnknown());
  469. finish_state.state = BraceExpressionKindToParserState(
  470. kind, ParserState::BraceExpressionFinishAsType(),
  471. ParserState::BraceExpressionFinishAsValue(),
  472. ParserState::BraceExpressionFinishAsUnknown());
  473. PushState(finish_state);
  474. }
  475. state.state = BraceExpressionKindToParserState(
  476. kind, ParserState::BraceExpressionParameterFinishAsType(),
  477. ParserState::BraceExpressionParameterFinishAsValue(),
  478. ParserState::BraceExpressionParameterFinishAsUnknown());
  479. state.token = Consume();
  480. // Struct type fields and value fields use the same grammar except
  481. // that one has a `:` separator and the other has an `=` separator.
  482. PushState(state);
  483. PushState(ParserState::Expression());
  484. }
  485. auto Parser::HandleBraceExpressionParameterAfterDesignatorAsTypeState()
  486. -> void {
  487. HandleBraceExpressionParameterAfterDesignator(BraceExpressionKind::Type);
  488. }
  489. auto Parser::HandleBraceExpressionParameterAfterDesignatorAsValueState()
  490. -> void {
  491. HandleBraceExpressionParameterAfterDesignator(BraceExpressionKind::Value);
  492. }
  493. auto Parser::HandleBraceExpressionParameterAfterDesignatorAsUnknownState()
  494. -> void {
  495. HandleBraceExpressionParameterAfterDesignator(BraceExpressionKind::Unknown);
  496. }
  497. auto Parser::HandleBraceExpressionParameterFinish(BraceExpressionKind kind)
  498. -> void {
  499. auto state = PopState();
  500. AddNode(kind == BraceExpressionKind::Type ? ParseNodeKind::StructFieldType()
  501. : ParseNodeKind::StructFieldValue(),
  502. state.token, state.subtree_start, state.has_error);
  503. if (ConsumeListToken(ParseNodeKind::StructComma(),
  504. TokenKind::CloseCurlyBrace(),
  505. state.has_error) == ListTokenKind::Comma) {
  506. PushState(BraceExpressionKindToParserState(
  507. kind, ParserState::BraceExpressionParameterAsType(),
  508. ParserState::BraceExpressionParameterAsValue(),
  509. ParserState::BraceExpressionParameterAsUnknown()));
  510. }
  511. }
  512. auto Parser::HandleBraceExpressionParameterFinishAsTypeState() -> void {
  513. HandleBraceExpressionParameterFinish(BraceExpressionKind::Type);
  514. }
  515. auto Parser::HandleBraceExpressionParameterFinishAsValueState() -> void {
  516. HandleBraceExpressionParameterFinish(BraceExpressionKind::Value);
  517. }
  518. auto Parser::HandleBraceExpressionParameterFinishAsUnknownState() -> void {
  519. HandleBraceExpressionParameterFinish(BraceExpressionKind::Unknown);
  520. }
  521. auto Parser::HandleBraceExpressionFinish(BraceExpressionKind kind) -> void {
  522. auto state = PopState();
  523. AddLeafNode(ParseNodeKind::StructEnd(), Consume());
  524. AddNode(kind == BraceExpressionKind::Type ? ParseNodeKind::StructTypeLiteral()
  525. : ParseNodeKind::StructLiteral(),
  526. state.token, state.subtree_start, state.has_error);
  527. }
  528. auto Parser::HandleBraceExpressionFinishAsTypeState() -> void {
  529. HandleBraceExpressionFinish(BraceExpressionKind::Type);
  530. }
  531. auto Parser::HandleBraceExpressionFinishAsValueState() -> void {
  532. HandleBraceExpressionFinish(BraceExpressionKind::Value);
  533. }
  534. auto Parser::HandleBraceExpressionFinishAsUnknownState() -> void {
  535. HandleBraceExpressionFinish(BraceExpressionKind::Unknown);
  536. }
  537. auto Parser::HandleCallExpressionState() -> void {
  538. auto state = PopState();
  539. // TODO: When swapping () start/end, this should AddLeafNode the open before
  540. // continuing.
  541. state.state = ParserState::CallExpressionFinish();
  542. PushState(state);
  543. // Advance past the open paren.
  544. ++position_;
  545. if (!PositionIs(TokenKind::CloseParen())) {
  546. PushState(ParserState::CallExpressionParameterFinish());
  547. PushState(ParserState::Expression());
  548. }
  549. }
  550. auto Parser::HandleCallExpressionParameterFinishState() -> void {
  551. auto state = PopState();
  552. if (state.has_error) {
  553. ReturnErrorOnState();
  554. }
  555. if (ConsumeListToken(ParseNodeKind::CallExpressionComma(),
  556. TokenKind::CloseParen(),
  557. state.has_error) == ListTokenKind::Comma) {
  558. PushState(ParserState::CallExpressionParameterFinish());
  559. PushState(ParserState::Expression());
  560. }
  561. }
  562. auto Parser::HandleCallExpressionFinishState() -> void {
  563. auto state = PopState();
  564. AddLeafNode(ParseNodeKind::CallExpressionEnd(), Consume());
  565. AddNode(ParseNodeKind::CallExpression(), state.token, state.subtree_start,
  566. state.has_error);
  567. }
  568. auto Parser::HandleCodeBlockFinishState() -> void {
  569. auto state = PopState();
  570. // If the block started with an open curly, this is a close curly.
  571. if (tokens_.GetKind(state.token) == TokenKind::OpenCurlyBrace()) {
  572. AddNode(ParseNodeKind::CodeBlock(), *position_, state.subtree_start,
  573. state.has_error);
  574. ++position_;
  575. } else {
  576. AddNode(ParseNodeKind::CodeBlock(), state.token, state.subtree_start,
  577. /*has_error=*/true);
  578. }
  579. }
  580. auto Parser::HandleDeclarationLoopState() -> void {
  581. // This maintains the current state unless we're at the end of the file.
  582. switch (PositionKind()) {
  583. case TokenKind::EndOfFile(): {
  584. PopAndDiscardState();
  585. break;
  586. }
  587. case TokenKind::Fn(): {
  588. PushState(ParserState::FunctionIntroducer());
  589. AddLeafNode(ParseNodeKind::FunctionIntroducer(), *position_);
  590. ++position_;
  591. break;
  592. }
  593. case TokenKind::Package(): {
  594. PushState(ParserState::Package());
  595. ++position_;
  596. break;
  597. }
  598. case TokenKind::Semi(): {
  599. AddLeafNode(ParseNodeKind::EmptyDeclaration(), *position_);
  600. ++position_;
  601. break;
  602. }
  603. case TokenKind::Var(): {
  604. PushState(ParserState::VarAsRequireSemicolon());
  605. break;
  606. }
  607. default: {
  608. CARBON_DIAGNOSTIC(UnrecognizedDeclaration, Error,
  609. "Unrecognized declaration introducer.");
  610. emitter_.Emit(*position_, UnrecognizedDeclaration);
  611. tree_.has_errors_ = true;
  612. if (auto semi = SkipPastLikelyEnd(*position_)) {
  613. AddLeafNode(ParseNodeKind::EmptyDeclaration(), *semi,
  614. /*has_error=*/true);
  615. }
  616. break;
  617. }
  618. }
  619. }
  620. auto Parser::HandleDesignator(bool as_struct) -> void {
  621. auto state = PopState();
  622. // `.` identifier
  623. auto dot = ConsumeIf(TokenKind::Period());
  624. CARBON_CHECK(dot);
  625. if (!ConsumeAndAddLeafNodeIf(TokenKind::Identifier(),
  626. ParseNodeKind::DesignatedName())) {
  627. CARBON_DIAGNOSTIC(ExpectedIdentifierAfterDot, Error,
  628. "Expected identifier after `.`.");
  629. emitter_.Emit(*position_, ExpectedIdentifierAfterDot);
  630. // If we see a keyword, assume it was intended to be the designated name.
  631. // TODO: Should keywords be valid in designators?
  632. if (PositionKind().IsKeyword()) {
  633. AddLeafNode(ParseNodeKind::DesignatedName(), *position_,
  634. /*has_error=*/true);
  635. ++position_;
  636. } else {
  637. state.has_error = true;
  638. ReturnErrorOnState();
  639. }
  640. }
  641. AddNode(as_struct ? ParseNodeKind::StructFieldDesignator()
  642. : ParseNodeKind::DesignatorExpression(),
  643. *dot, state.subtree_start, state.has_error);
  644. }
  645. auto Parser::HandleDesignatorAsExpressionState() -> void {
  646. HandleDesignator(/*as_struct=*/false);
  647. }
  648. auto Parser::HandleDesignatorAsStructState() -> void {
  649. HandleDesignator(/*as_struct=*/true);
  650. }
  651. auto Parser::HandleExpressionState() -> void {
  652. auto state = PopState();
  653. // Check for a prefix operator.
  654. if (auto operator_precedence = PrecedenceGroup::ForLeading(PositionKind())) {
  655. if (PrecedenceGroup::GetPriority(state.ambient_precedence,
  656. *operator_precedence) !=
  657. OperatorPriority::RightFirst) {
  658. // The precedence rules don't permit this prefix operator in this
  659. // context. Diagnose this, but carry on and parse it anyway.
  660. emitter_.Emit(*position_, OperatorRequiresParentheses);
  661. } else {
  662. // Check that this operator follows the proper whitespace rules.
  663. DiagnoseOperatorFixity(OperatorFixity::Prefix);
  664. }
  665. PushStateForExpressionLoop(ParserState::ExpressionLoopForPrefix(),
  666. state.ambient_precedence, *operator_precedence);
  667. ++position_;
  668. PushStateForExpression(*operator_precedence);
  669. } else {
  670. PushStateForExpressionLoop(ParserState::ExpressionLoop(),
  671. state.ambient_precedence,
  672. PrecedenceGroup::ForPostfixExpression());
  673. PushState(ParserState::ExpressionInPostfix());
  674. }
  675. }
  676. auto Parser::HandleExpressionInPostfixState() -> void {
  677. auto state = PopState();
  678. // Continue to the loop state.
  679. state.state = ParserState::ExpressionInPostfixLoop();
  680. // Parses a primary expression, which is either a terminal portion of an
  681. // expression tree, such as an identifier or literal, or a parenthesized
  682. // expression.
  683. switch (PositionKind()) {
  684. case TokenKind::Identifier(): {
  685. AddLeafNode(ParseNodeKind::NameReference(), Consume());
  686. PushState(state);
  687. break;
  688. }
  689. case TokenKind::IntegerLiteral():
  690. case TokenKind::RealLiteral():
  691. case TokenKind::StringLiteral():
  692. case TokenKind::IntegerTypeLiteral():
  693. case TokenKind::UnsignedIntegerTypeLiteral():
  694. case TokenKind::FloatingPointTypeLiteral(): {
  695. AddLeafNode(ParseNodeKind::Literal(), Consume());
  696. PushState(state);
  697. break;
  698. }
  699. case TokenKind::OpenCurlyBrace(): {
  700. PushState(state);
  701. PushState(ParserState::BraceExpression());
  702. break;
  703. }
  704. case TokenKind::OpenParen(): {
  705. PushState(state);
  706. PushState(ParserState::ParenExpression());
  707. break;
  708. }
  709. default: {
  710. CARBON_DIAGNOSTIC(ExpectedExpression, Error, "Expected expression.");
  711. emitter_.Emit(*position_, ExpectedExpression);
  712. ReturnErrorOnState();
  713. break;
  714. }
  715. }
  716. }
  717. auto Parser::HandleExpressionInPostfixLoopState() -> void {
  718. // This is a cyclic state that repeats, so this state is typically pushed back
  719. // on.
  720. auto state = PopState();
  721. state.token = *position_;
  722. switch (PositionKind()) {
  723. case TokenKind::Period(): {
  724. PushState(state);
  725. state.state = ParserState::DesignatorAsExpression();
  726. PushState(state);
  727. break;
  728. }
  729. case TokenKind::OpenParen(): {
  730. PushState(state);
  731. state.state = ParserState::CallExpression();
  732. PushState(state);
  733. break;
  734. }
  735. default: {
  736. if (state.has_error) {
  737. ReturnErrorOnState();
  738. }
  739. break;
  740. }
  741. }
  742. }
  743. auto Parser::HandleExpressionLoopState() -> void {
  744. auto state = PopState();
  745. auto trailing_operator =
  746. PrecedenceGroup::ForTrailing(PositionKind(), IsTrailingOperatorInfix());
  747. if (!trailing_operator) {
  748. if (state.has_error) {
  749. ReturnErrorOnState();
  750. }
  751. return;
  752. }
  753. auto [operator_precedence, is_binary] = *trailing_operator;
  754. // TODO: If this operator is ambiguous with either the ambient precedence
  755. // or the LHS precedence, and there's a variant with a different fixity
  756. // that would work, use that one instead for error recovery.
  757. if (PrecedenceGroup::GetPriority(state.ambient_precedence,
  758. operator_precedence) !=
  759. OperatorPriority::RightFirst) {
  760. // The precedence rules don't permit this operator in this context. Try
  761. // again in the enclosing expression context.
  762. if (state.has_error) {
  763. ReturnErrorOnState();
  764. }
  765. return;
  766. }
  767. if (PrecedenceGroup::GetPriority(state.lhs_precedence, operator_precedence) !=
  768. OperatorPriority::LeftFirst) {
  769. // Either the LHS operator and this operator are ambiguous, or the
  770. // LHS operator is a unary operator that can't be nested within
  771. // this operator. Either way, parentheses are required.
  772. emitter_.Emit(*position_, OperatorRequiresParentheses);
  773. state.has_error = true;
  774. } else {
  775. DiagnoseOperatorFixity(is_binary ? OperatorFixity::Infix
  776. : OperatorFixity::Postfix);
  777. }
  778. state.token = Consume();
  779. state.lhs_precedence = operator_precedence;
  780. if (is_binary) {
  781. state.state = ParserState::ExpressionLoopForBinary();
  782. PushState(state);
  783. PushStateForExpression(operator_precedence);
  784. } else {
  785. AddNode(ParseNodeKind::PostfixOperator(), state.token, state.subtree_start,
  786. state.has_error);
  787. state.has_error = false;
  788. PushState(state);
  789. }
  790. }
  791. auto Parser::HandleExpressionLoopForBinaryState() -> void {
  792. auto state = PopState();
  793. AddNode(ParseNodeKind::InfixOperator(), state.token, state.subtree_start,
  794. state.has_error);
  795. state.state = ParserState::ExpressionLoop();
  796. state.has_error = false;
  797. PushState(state);
  798. }
  799. auto Parser::HandleExpressionLoopForPrefixState() -> void {
  800. auto state = PopState();
  801. AddNode(ParseNodeKind::PrefixOperator(), state.token, state.subtree_start,
  802. state.has_error);
  803. state.state = ParserState::ExpressionLoop();
  804. state.has_error = false;
  805. PushState(state);
  806. }
  807. auto Parser::HandleExpressionStatementFinishState() -> void {
  808. auto state = PopState();
  809. if (auto semi = ConsumeIf(TokenKind::Semi())) {
  810. AddNode(ParseNodeKind::ExpressionStatement(), *semi, state.subtree_start,
  811. state.has_error);
  812. return;
  813. }
  814. if (!state.has_error) {
  815. emitter_.Emit(*position_, ExpectedSemiAfterExpression);
  816. }
  817. if (auto semi_token = SkipPastLikelyEnd(state.token)) {
  818. AddNode(ParseNodeKind::ExpressionStatement(), *semi_token,
  819. state.subtree_start,
  820. /*has_error=*/true);
  821. return;
  822. }
  823. // Found junk not even followed by a `;`, no node to add.
  824. ReturnErrorOnState();
  825. }
  826. auto Parser::HandleFunctionError(StateStackEntry state,
  827. bool skip_past_likely_end) -> void {
  828. auto token = state.token;
  829. if (skip_past_likely_end) {
  830. if (auto semi = SkipPastLikelyEnd(token)) {
  831. token = *semi;
  832. }
  833. }
  834. AddNode(ParseNodeKind::FunctionDeclaration(), token, state.subtree_start,
  835. /*has_error=*/true);
  836. }
  837. auto Parser::HandleFunctionIntroducerState() -> void {
  838. auto state = PopState();
  839. if (!ConsumeAndAddLeafNodeIf(TokenKind::Identifier(),
  840. ParseNodeKind::DeclaredName())) {
  841. CARBON_DIAGNOSTIC(ExpectedFunctionName, Error,
  842. "Expected function name after `fn` keyword.");
  843. emitter_.Emit(*position_, ExpectedFunctionName);
  844. // TODO: We could change the lexer to allow us to synthesize certain
  845. // kinds of tokens and try to "recover" here, but unclear that this is
  846. // really useful.
  847. HandleFunctionError(state, true);
  848. return;
  849. }
  850. if (!PositionIs(TokenKind::OpenParen())) {
  851. CARBON_DIAGNOSTIC(ExpectedFunctionParams, Error,
  852. "Expected `(` after function name.");
  853. emitter_.Emit(*position_, ExpectedFunctionParams);
  854. HandleFunctionError(state, true);
  855. return;
  856. }
  857. // Parse the parameter list as its own subtree; once that pops, resume
  858. // function parsing.
  859. state.state = ParserState::FunctionAfterParameterList();
  860. PushState(state);
  861. // TODO: When swapping () start/end, this should AddLeafNode the open before
  862. // continuing.
  863. PushState(ParserState::FunctionParameterListFinish());
  864. // Advance past the open paren.
  865. ++position_;
  866. if (!PositionIs(TokenKind::CloseParen())) {
  867. PushState(ParserState::PatternAsFunctionParameter());
  868. }
  869. }
  870. auto Parser::HandleFunctionParameterListFinishState() -> void {
  871. auto state = PopState();
  872. CARBON_CHECK(ConsumeAndAddLeafNodeIf(TokenKind::CloseParen(),
  873. ParseNodeKind::ParameterListEnd()))
  874. << PositionKind().Name();
  875. AddNode(ParseNodeKind::ParameterList(), state.token, state.subtree_start,
  876. state.has_error);
  877. }
  878. auto Parser::HandleFunctionAfterParameterListState() -> void {
  879. auto state = PopState();
  880. // Regardless of whether there's a return type, we'll finish the signature.
  881. state.state = ParserState::FunctionSignatureFinish();
  882. PushState(state);
  883. // If there is a return type, parse the expression before adding the return
  884. // type nod.e
  885. if (PositionIs(TokenKind::MinusGreater())) {
  886. PushState(ParserState::FunctionReturnTypeFinish());
  887. ++position_;
  888. PushStateForExpression(PrecedenceGroup::ForType());
  889. }
  890. }
  891. auto Parser::HandleFunctionReturnTypeFinishState() -> void {
  892. auto state = PopState();
  893. AddNode(ParseNodeKind::ReturnType(), state.token, state.subtree_start,
  894. state.has_error);
  895. }
  896. auto Parser::HandleFunctionSignatureFinishState() -> void {
  897. auto state = PopState();
  898. switch (PositionKind()) {
  899. case TokenKind::Semi(): {
  900. AddNode(ParseNodeKind::FunctionDeclaration(), Consume(),
  901. state.subtree_start, state.has_error);
  902. break;
  903. }
  904. case TokenKind::OpenCurlyBrace(): {
  905. AddNode(ParseNodeKind::FunctionDefinitionStart(), Consume(),
  906. state.subtree_start, state.has_error);
  907. // Any error is recorded on the FunctionDefinitionStart.
  908. state.has_error = false;
  909. state.state = ParserState::FunctionDefinitionFinish();
  910. PushState(state);
  911. PushState(ParserState::StatementScopeLoop());
  912. break;
  913. }
  914. default: {
  915. CARBON_DIAGNOSTIC(
  916. ExpectedFunctionBodyOrSemi, Error,
  917. "Expected function definition or `;` after function declaration.");
  918. emitter_.Emit(*position_, ExpectedFunctionBodyOrSemi);
  919. // Only need to skip if we've not already found a new line.
  920. bool skip_past_likely_end =
  921. tokens_.GetLine(*position_) == tokens_.GetLine(state.token);
  922. HandleFunctionError(state, skip_past_likely_end);
  923. break;
  924. }
  925. }
  926. }
  927. auto Parser::HandleFunctionDefinitionFinishState() -> void {
  928. auto state = PopState();
  929. AddNode(ParseNodeKind::FunctionDefinition(), Consume(), state.subtree_start,
  930. state.has_error);
  931. }
  932. auto Parser::HandlePackageState() -> void {
  933. auto state = PopState();
  934. auto exit_on_parse_error = [&]() {
  935. if (auto semi_token = SkipPastLikelyEnd(state.token)) {
  936. AddLeafNode(ParseNodeKind::PackageEnd(), *semi_token);
  937. }
  938. return AddNode(ParseNodeKind::PackageDirective(), state.token,
  939. state.subtree_start, /*has_error=*/true);
  940. };
  941. if (!ConsumeAndAddLeafNodeIf(TokenKind::Identifier(),
  942. ParseNodeKind::DeclaredName())) {
  943. CARBON_DIAGNOSTIC(ExpectedIdentifierAfterPackage, Error,
  944. "Expected identifier after `package`.");
  945. emitter_.Emit(*position_, ExpectedIdentifierAfterPackage);
  946. exit_on_parse_error();
  947. return;
  948. }
  949. bool library_parsed = false;
  950. if (auto library_token = ConsumeIf(TokenKind::Library())) {
  951. auto library_start = tree_.size();
  952. if (!ConsumeAndAddLeafNodeIf(TokenKind::StringLiteral(),
  953. ParseNodeKind::Literal())) {
  954. CARBON_DIAGNOSTIC(
  955. ExpectedLibraryName, Error,
  956. "Expected a string literal to specify the library name.");
  957. emitter_.Emit(*position_, ExpectedLibraryName);
  958. exit_on_parse_error();
  959. return;
  960. }
  961. AddNode(ParseNodeKind::PackageLibrary(), *library_token, library_start,
  962. /*has_error=*/false);
  963. library_parsed = true;
  964. }
  965. switch (auto api_or_impl_token = tokens_.GetKind(*(position_))) {
  966. case TokenKind::Api(): {
  967. AddLeafNode(ParseNodeKind::PackageApi(), Consume());
  968. break;
  969. }
  970. case TokenKind::Impl(): {
  971. AddLeafNode(ParseNodeKind::PackageImpl(), Consume());
  972. break;
  973. }
  974. default: {
  975. if (!library_parsed && api_or_impl_token == TokenKind::StringLiteral()) {
  976. // If we come acroess a string literal and we didn't parse `library
  977. // "..."` yet, then most probably the user forgot to add `library`
  978. // before the library name.
  979. CARBON_DIAGNOSTIC(MissingLibraryKeyword, Error,
  980. "Missing `library` keyword.");
  981. emitter_.Emit(*position_, MissingLibraryKeyword);
  982. } else {
  983. CARBON_DIAGNOSTIC(ExpectedApiOrImpl, Error,
  984. "Expected a `api` or `impl`.");
  985. emitter_.Emit(*position_, ExpectedApiOrImpl);
  986. }
  987. exit_on_parse_error();
  988. return;
  989. }
  990. }
  991. if (!ConsumeAndAddLeafNodeIf(TokenKind::Semi(),
  992. ParseNodeKind::PackageEnd())) {
  993. CARBON_DIAGNOSTIC(ExpectedSemiToEndPackageDirective, Error,
  994. "Expected `;` to end package directive.");
  995. emitter_.Emit(*position_, ExpectedSemiToEndPackageDirective);
  996. exit_on_parse_error();
  997. return;
  998. }
  999. AddNode(ParseNodeKind::PackageDirective(), state.token, state.subtree_start,
  1000. /*has_error=*/false);
  1001. }
  1002. auto Parser::HandleParenConditionState() -> void {
  1003. auto state = PopState();
  1004. auto open_paren = ConsumeIf(TokenKind::OpenParen());
  1005. if (open_paren) {
  1006. state.token = *open_paren;
  1007. } else {
  1008. CARBON_DIAGNOSTIC(ExpectedParenAfter, Error, "Expected `(` after `{0}`.",
  1009. TokenKind);
  1010. emitter_.Emit(*position_, ExpectedParenAfter, tokens_.GetKind(state.token));
  1011. }
  1012. // TODO: This should be adding a ConditionStart here instead of ConditionEnd
  1013. // later, so this does state modification instead of a simpler push.
  1014. state.state = ParserState::ParenConditionFinish();
  1015. PushState(state);
  1016. PushState(ParserState::Expression());
  1017. }
  1018. auto Parser::HandleParenConditionFinishState() -> void {
  1019. auto state = PopState();
  1020. if (tokens_.GetKind(state.token) != TokenKind::OpenParen()) {
  1021. // Don't expect a matching closing paren if there wasn't an opening paren.
  1022. // TODO: Should probably push nodes on this state in order to have the
  1023. // condition wrapped, but it wasn't before, so not doing it for consistency.
  1024. ReturnErrorOnState();
  1025. return;
  1026. }
  1027. bool close_paren =
  1028. ConsumeAndAddCloseParen(state.token, ParseNodeKind::ConditionEnd());
  1029. return AddNode(ParseNodeKind::Condition(), state.token, state.subtree_start,
  1030. /*has_error=*/state.has_error || !close_paren);
  1031. }
  1032. auto Parser::HandleParenExpressionState() -> void {
  1033. auto state = PopState();
  1034. // TODO: When swapping () start/end, this should AddLeafNode the open before
  1035. // continuing.
  1036. // Advance past the open paren.
  1037. CARBON_CHECK(PositionIs(TokenKind::OpenParen()));
  1038. ++position_;
  1039. if (PositionIs(TokenKind::CloseParen())) {
  1040. state.state = ParserState::ParenExpressionFinishAsTuple();
  1041. PushState(state);
  1042. } else {
  1043. state.state = ParserState::ParenExpressionFinish();
  1044. PushState(state);
  1045. PushState(ParserState::ParenExpressionParameterFinishAsUnknown());
  1046. PushState(ParserState::Expression());
  1047. }
  1048. }
  1049. auto Parser::HandleParenExpressionParameterFinish(bool as_tuple) -> void {
  1050. auto state = PopState();
  1051. auto list_token_kind =
  1052. ConsumeListToken(ParseNodeKind::TupleLiteralComma(),
  1053. TokenKind::CloseParen(), state.has_error);
  1054. if (list_token_kind == ListTokenKind::Close) {
  1055. return;
  1056. }
  1057. // If this is the first item and a comma was found, switch to tuple handling.
  1058. // Note this could be `(expr,)` so we may not reuse the current state, but
  1059. // it's still necessary to switch the parent.
  1060. if (!as_tuple) {
  1061. state.state = ParserState::ParenExpressionParameterFinishAsTuple();
  1062. auto finish_state = PopState();
  1063. CARBON_CHECK(finish_state.state == ParserState::ParenExpressionFinish())
  1064. << "Unexpected parent state, found: " << finish_state.state;
  1065. finish_state.state = ParserState::ParenExpressionFinishAsTuple();
  1066. PushState(finish_state);
  1067. }
  1068. // On a comma, push another expression handler.
  1069. if (list_token_kind == ListTokenKind::Comma) {
  1070. PushState(state);
  1071. PushState(ParserState::Expression());
  1072. }
  1073. }
  1074. auto Parser::HandleParenExpressionParameterFinishAsUnknownState() -> void {
  1075. HandleParenExpressionParameterFinish(/*as_tuple=*/false);
  1076. }
  1077. auto Parser::HandleParenExpressionParameterFinishAsTupleState() -> void {
  1078. HandleParenExpressionParameterFinish(/*as_tuple=*/true);
  1079. }
  1080. auto Parser::HandleParenExpressionFinishState() -> void {
  1081. auto state = PopState();
  1082. AddLeafNode(ParseNodeKind::ParenExpressionEnd(), Consume());
  1083. AddNode(ParseNodeKind::ParenExpression(), state.token, state.subtree_start,
  1084. state.has_error);
  1085. }
  1086. auto Parser::HandleParenExpressionFinishAsTupleState() -> void {
  1087. auto state = PopState();
  1088. AddLeafNode(ParseNodeKind::TupleLiteralEnd(), Consume());
  1089. AddNode(ParseNodeKind::TupleLiteral(), state.token, state.subtree_start,
  1090. state.has_error);
  1091. }
  1092. auto Parser::HandlePatternStart(PatternKind pattern_kind) -> void {
  1093. auto state = PopState();
  1094. // Ensure the finish state always follows.
  1095. switch (pattern_kind) {
  1096. case PatternKind::Parameter: {
  1097. state.state = ParserState::PatternAsFunctionParameterFinish();
  1098. break;
  1099. }
  1100. case PatternKind::Variable: {
  1101. state.state = ParserState::PatternAsVariableFinish();
  1102. break;
  1103. }
  1104. }
  1105. // Handle an invalid pattern introducer.
  1106. if (!PositionIs(TokenKind::Identifier()) ||
  1107. tokens_.GetKind(*(position_ + 1)) != TokenKind::Colon()) {
  1108. switch (pattern_kind) {
  1109. case PatternKind::Parameter: {
  1110. CARBON_DIAGNOSTIC(ExpectedParameterName, Error,
  1111. "Expected parameter declaration.");
  1112. emitter_.Emit(*position_, ExpectedParameterName);
  1113. break;
  1114. }
  1115. case PatternKind::Variable: {
  1116. CARBON_DIAGNOSTIC(ExpectedVariableName, Error,
  1117. "Expected pattern in `var` declaration.");
  1118. emitter_.Emit(*position_, ExpectedVariableName);
  1119. break;
  1120. }
  1121. }
  1122. state.has_error = true;
  1123. PushState(state);
  1124. return;
  1125. }
  1126. // Switch the context token to the colon, so that it'll be used for the root
  1127. // node.
  1128. state.token = *(position_ + 1);
  1129. PushState(state);
  1130. PushStateForExpression(PrecedenceGroup::ForType());
  1131. AddLeafNode(ParseNodeKind::DeclaredName(), *position_);
  1132. position_ += 2;
  1133. }
  1134. auto Parser::HandlePatternFinish() -> bool {
  1135. auto state = PopState();
  1136. // If an error was encountered, propagate it without adding a node.
  1137. if (state.has_error) {
  1138. ReturnErrorOnState();
  1139. return true;
  1140. }
  1141. // TODO: may need to mark has_error if !type.
  1142. AddNode(ParseNodeKind::PatternBinding(), state.token, state.subtree_start,
  1143. /*has_error=*/false);
  1144. return false;
  1145. }
  1146. auto Parser::HandlePatternAsFunctionParameterState() -> void {
  1147. HandlePatternStart(PatternKind::Parameter);
  1148. }
  1149. auto Parser::HandlePatternAsFunctionParameterFinishState() -> void {
  1150. bool has_error = HandlePatternFinish();
  1151. if (ConsumeListToken(ParseNodeKind::ParameterListComma(),
  1152. TokenKind::CloseParen(),
  1153. has_error) == ListTokenKind::Comma) {
  1154. PushState(ParserState::PatternAsFunctionParameter());
  1155. }
  1156. }
  1157. auto Parser::HandlePatternAsVariableState() -> void {
  1158. HandlePatternStart(PatternKind::Variable);
  1159. }
  1160. auto Parser::HandlePatternAsVariableFinishState() -> void {
  1161. HandlePatternFinish();
  1162. }
  1163. auto Parser::HandleStatementState() -> void {
  1164. PopAndDiscardState();
  1165. switch (PositionKind()) {
  1166. case TokenKind::Break(): {
  1167. PushState(ParserState::StatementBreakFinish());
  1168. ++position_;
  1169. break;
  1170. }
  1171. case TokenKind::Continue(): {
  1172. PushState(ParserState::StatementContinueFinish());
  1173. ++position_;
  1174. break;
  1175. }
  1176. case TokenKind::For(): {
  1177. // Process the header as a child of the for so that we can get consistent
  1178. // starts.
  1179. // TODO: When reorganizing components, we can probably make this flatter.
  1180. PushState(ParserState::StatementForFinish());
  1181. ++position_;
  1182. PushState(ParserState::StatementForHeader());
  1183. break;
  1184. }
  1185. case TokenKind::If(): {
  1186. PushState(ParserState::StatementIf());
  1187. break;
  1188. }
  1189. case TokenKind::Return(): {
  1190. PushState(ParserState::StatementReturn());
  1191. break;
  1192. }
  1193. case TokenKind::Var(): {
  1194. PushState(ParserState::VarAsRequireSemicolon());
  1195. break;
  1196. }
  1197. case TokenKind::While(): {
  1198. PushState(ParserState::StatementWhile());
  1199. break;
  1200. }
  1201. default: {
  1202. PushState(ParserState::ExpressionStatementFinish());
  1203. PushState(ParserState::Expression());
  1204. break;
  1205. }
  1206. }
  1207. }
  1208. auto Parser::HandleStatementBreakFinishState() -> void {
  1209. HandleStatementKeywordFinish(TokenKind::Break(),
  1210. ParseNodeKind::BreakStatement());
  1211. }
  1212. auto Parser::HandleStatementContinueFinishState() -> void {
  1213. HandleStatementKeywordFinish(TokenKind::Continue(),
  1214. ParseNodeKind::ContinueStatement());
  1215. }
  1216. auto Parser::HandleStatementForHeaderState() -> void {
  1217. auto state = PopState();
  1218. auto open_paren = ConsumeIf(TokenKind::OpenParen());
  1219. if (!open_paren) {
  1220. CARBON_DIAGNOSTIC(ExpectedParenAfter, Error,
  1221. "Expected `(` after `{0}`. Recovering from missing `(` "
  1222. "not implemented yet!",
  1223. TokenKind);
  1224. emitter_.Emit(*position_, ExpectedParenAfter, TokenKind::For());
  1225. // TODO: A proper recovery strategy is needed here. For now, I assume
  1226. // that all brackets are properly balanced (i.e. each open bracket has a
  1227. // closing one).
  1228. // This is temporary until we come to a conclusion regarding the
  1229. // recovery tokens strategy.
  1230. ReturnErrorOnState();
  1231. PushState(ParserState::CodeBlock());
  1232. return;
  1233. }
  1234. state.state = ParserState::StatementForHeaderIn();
  1235. if (PositionIs(TokenKind::Var())) {
  1236. PushState(state);
  1237. PushState(ParserState::VarAsNoSemicolon());
  1238. } else {
  1239. CARBON_DIAGNOSTIC(ExpectedVariableDeclaration, Error,
  1240. "Expected `var` declaration.");
  1241. emitter_.Emit(*position_, ExpectedVariableDeclaration);
  1242. if (auto next_in = FindNextOf({TokenKind::In()})) {
  1243. SkipTo(*next_in);
  1244. }
  1245. state.has_error = true;
  1246. PushState(state);
  1247. }
  1248. }
  1249. auto Parser::HandleStatementForHeaderInState() -> void {
  1250. auto state = PopState();
  1251. state.state = ParserState::StatementForHeaderFinish();
  1252. if (!ConsumeAndAddLeafNodeIf(TokenKind::In(), ParseNodeKind::ForIn())) {
  1253. if (auto colon = ConsumeIf(TokenKind::Colon())) {
  1254. CARBON_DIAGNOSTIC(ExpectedIn, Error, "`:` should be replaced by `in`.");
  1255. emitter_.Emit(*colon, ExpectedIn);
  1256. // TODO: Should probably add a ForIn node for consistency in ParseTree
  1257. // structure, but doesn't for consistency with the old implementation.
  1258. state.has_error = true;
  1259. } else {
  1260. CARBON_DIAGNOSTIC(ExpectedIn, Error,
  1261. "Expected `in` after loop `var` declaration.");
  1262. emitter_.Emit(*position_, ExpectedIn);
  1263. SkipTo(tokens_.GetMatchedClosingToken(state.token));
  1264. state.has_error = true;
  1265. PushState(state);
  1266. return;
  1267. }
  1268. }
  1269. PushState(state);
  1270. PushState(ParserState::Expression());
  1271. }
  1272. auto Parser::HandleStatementForHeaderFinishState() -> void {
  1273. auto state = PopState();
  1274. if (!ConsumeAndAddCloseParen(state.token, ParseNodeKind::ForHeaderEnd())) {
  1275. state.has_error = true;
  1276. }
  1277. AddNode(ParseNodeKind::ForHeader(), state.token, state.subtree_start,
  1278. state.has_error);
  1279. PushState(ParserState::CodeBlock());
  1280. }
  1281. auto Parser::HandleStatementForFinishState() -> void {
  1282. auto state = PopState();
  1283. AddNode(ParseNodeKind::ForStatement(), state.token, state.subtree_start,
  1284. state.has_error);
  1285. }
  1286. auto Parser::HandleStatementIfState() -> void {
  1287. PopAndDiscardState();
  1288. PushState(ParserState::StatementIfConditionFinish());
  1289. PushState(ParserState::ParenCondition());
  1290. ++position_;
  1291. }
  1292. auto Parser::HandleStatementIfConditionFinishState() -> void {
  1293. auto state = PopState();
  1294. state.state = ParserState::StatementIfThenBlockFinish();
  1295. PushState(state);
  1296. PushState(ParserState::CodeBlock());
  1297. }
  1298. auto Parser::HandleStatementIfThenBlockFinishState() -> void {
  1299. auto state = PopState();
  1300. if (ConsumeAndAddLeafNodeIf(TokenKind::Else(),
  1301. ParseNodeKind::IfStatementElse())) {
  1302. state.state = ParserState::StatementIfElseBlockFinish();
  1303. PushState(state);
  1304. // `else if` is permitted as a special case.
  1305. PushState(PositionIs(TokenKind::If()) ? ParserState::StatementIf()
  1306. : ParserState::CodeBlock());
  1307. } else {
  1308. AddNode(ParseNodeKind::IfStatement(), state.token, state.subtree_start,
  1309. state.has_error);
  1310. }
  1311. }
  1312. auto Parser::HandleStatementIfElseBlockFinishState() -> void {
  1313. auto state = PopState();
  1314. AddNode(ParseNodeKind::IfStatement(), state.token, state.subtree_start,
  1315. state.has_error);
  1316. }
  1317. auto Parser::HandleStatementKeywordFinish(TokenKind token_kind,
  1318. ParseNodeKind node_kind) -> void {
  1319. auto state = PopState();
  1320. if (!ConsumeAndAddLeafNodeIf(TokenKind::Semi(),
  1321. ParseNodeKind::StatementEnd())) {
  1322. CARBON_DIAGNOSTIC(ExpectedSemiAfter, Error, "Expected `;` after `{0}`.",
  1323. TokenKind);
  1324. emitter_.Emit(*position_, ExpectedSemiAfter, token_kind);
  1325. if (auto semi_token = SkipPastLikelyEnd(state.token)) {
  1326. AddLeafNode(ParseNodeKind::StatementEnd(), *semi_token,
  1327. /*has_error=*/true);
  1328. }
  1329. }
  1330. AddNode(node_kind, state.token, state.subtree_start, state.has_error);
  1331. }
  1332. auto Parser::HandleStatementReturnState() -> void {
  1333. auto state = PopState();
  1334. state.state = ParserState::StatementReturnFinish();
  1335. PushState(state);
  1336. ++position_;
  1337. if (!PositionIs(TokenKind::Semi())) {
  1338. PushState(ParserState::Expression());
  1339. }
  1340. }
  1341. auto Parser::HandleStatementReturnFinishState() -> void {
  1342. HandleStatementKeywordFinish(TokenKind::Return(),
  1343. ParseNodeKind::ReturnStatement());
  1344. }
  1345. auto Parser::HandleStatementScopeLoopState() -> void {
  1346. // This maintains the current state until we're at the end of the scope.
  1347. auto token_kind = PositionKind();
  1348. if (token_kind == TokenKind::CloseCurlyBrace()) {
  1349. auto state = PopState();
  1350. if (state.has_error) {
  1351. ReturnErrorOnState();
  1352. }
  1353. } else {
  1354. PushState(ParserState::Statement());
  1355. }
  1356. }
  1357. auto Parser::HandleStatementWhileState() -> void {
  1358. PopAndDiscardState();
  1359. PushState(ParserState::StatementWhileConditionFinish());
  1360. PushState(ParserState::ParenCondition());
  1361. ++position_;
  1362. }
  1363. auto Parser::HandleStatementWhileConditionFinishState() -> void {
  1364. auto state = PopState();
  1365. state.state = ParserState::StatementWhileBlockFinish();
  1366. PushState(state);
  1367. PushState(ParserState::CodeBlock());
  1368. }
  1369. auto Parser::HandleStatementWhileBlockFinishState() -> void {
  1370. auto state = PopState();
  1371. AddNode(ParseNodeKind::WhileStatement(), state.token, state.subtree_start,
  1372. state.has_error);
  1373. }
  1374. auto Parser::HandleVar(bool require_semicolon) -> void {
  1375. PopAndDiscardState();
  1376. PushState(require_semicolon ? ParserState::VarFinishAsRequireSemicolon()
  1377. : ParserState::VarFinishAsNoSemicolon());
  1378. PushState(ParserState::VarAfterPattern());
  1379. ++position_;
  1380. PushState(ParserState::PatternAsVariable());
  1381. }
  1382. auto Parser::HandleVarAsRequireSemicolonState() -> void {
  1383. HandleVar(/*require_semicolon=*/true);
  1384. }
  1385. auto Parser::HandleVarAsNoSemicolonState() -> void {
  1386. HandleVar(/*require_semicolon=*/false);
  1387. }
  1388. auto Parser::HandleVarAfterPatternState() -> void {
  1389. auto state = PopState();
  1390. if (state.has_error) {
  1391. if (auto after_pattern =
  1392. FindNextOf({TokenKind::Equal(), TokenKind::Semi()})) {
  1393. SkipTo(*after_pattern);
  1394. }
  1395. }
  1396. if (PositionIs(TokenKind::Equal())) {
  1397. PushState(ParserState::VarAfterInitializer());
  1398. ++position_;
  1399. PushState(ParserState::Expression());
  1400. return;
  1401. }
  1402. }
  1403. auto Parser::HandleVarAfterInitializerState() -> void {
  1404. auto state = PopState();
  1405. AddNode(ParseNodeKind::VariableInitializer(), state.token,
  1406. state.subtree_start, state.has_error);
  1407. }
  1408. auto Parser::HandleVarFinish(bool require_semicolon) -> void {
  1409. auto state = PopState();
  1410. if (require_semicolon) {
  1411. auto semi = ConsumeAndAddLeafNodeIf(TokenKind::Semi(),
  1412. ParseNodeKind::DeclarationEnd());
  1413. if (!semi) {
  1414. emitter_.Emit(*position_, ExpectedSemiAfterExpression);
  1415. if (auto semi_token = SkipPastLikelyEnd(state.token)) {
  1416. AddLeafNode(ParseNodeKind::DeclarationEnd(), *semi_token,
  1417. /*has_error=*/true);
  1418. } else {
  1419. state.has_error = true;
  1420. }
  1421. }
  1422. }
  1423. return AddNode(ParseNodeKind::VariableDeclaration(), state.token,
  1424. state.subtree_start, state.has_error);
  1425. }
  1426. auto Parser::HandleVarFinishAsRequireSemicolonState() -> void {
  1427. HandleVarFinish(/*require_semicolon=*/true);
  1428. }
  1429. auto Parser::HandleVarFinishAsNoSemicolonState() -> void {
  1430. HandleVarFinish(/*require_semicolon=*/false);
  1431. }
  1432. } // namespace Carbon