Parser.cpp 66 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807
  1. /*
  2. * Copyright (c) 2020, Stephan Unverwerth <s.unverwerth@gmx.de>
  3. * Copyright (c) 2020, Linus Groh <mail@linusgroh.de>
  4. * All rights reserved.
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted provided that the following conditions are met:
  8. *
  9. * 1. Redistributions of source code must retain the above copyright notice, this
  10. * list of conditions and the following disclaimer.
  11. *
  12. * 2. Redistributions in binary form must reproduce the above copyright notice,
  13. * this list of conditions and the following disclaimer in the documentation
  14. * and/or other materials provided with the distribution.
  15. *
  16. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  17. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  18. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  19. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  20. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  21. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  22. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  23. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  24. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  25. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. */
  27. #include "Parser.h"
  28. #include <AK/ScopeGuard.h>
  29. #include <AK/StdLibExtras.h>
  30. namespace JS {
  31. class ScopePusher {
  32. public:
  33. enum Type {
  34. Var = 1,
  35. Let = 2,
  36. Function = 3,
  37. };
  38. ScopePusher(Parser& parser, unsigned mask)
  39. : m_parser(parser)
  40. , m_mask(mask)
  41. {
  42. if (m_mask & Var)
  43. m_parser.m_parser_state.m_var_scopes.append(NonnullRefPtrVector<VariableDeclaration>());
  44. if (m_mask & Let)
  45. m_parser.m_parser_state.m_let_scopes.append(NonnullRefPtrVector<VariableDeclaration>());
  46. if (m_mask & Function)
  47. m_parser.m_parser_state.m_function_scopes.append(NonnullRefPtrVector<FunctionDeclaration>());
  48. }
  49. ~ScopePusher()
  50. {
  51. if (m_mask & Var)
  52. m_parser.m_parser_state.m_var_scopes.take_last();
  53. if (m_mask & Let)
  54. m_parser.m_parser_state.m_let_scopes.take_last();
  55. if (m_mask & Function)
  56. m_parser.m_parser_state.m_function_scopes.take_last();
  57. }
  58. Parser& m_parser;
  59. unsigned m_mask { 0 };
  60. };
  61. class OperatorPrecedenceTable {
  62. public:
  63. constexpr OperatorPrecedenceTable()
  64. : m_token_precedence()
  65. {
  66. for (size_t i = 0; i < array_size(m_operator_precedence); ++i) {
  67. auto& op = m_operator_precedence[i];
  68. m_token_precedence[static_cast<size_t>(op.token)] = op.precedence;
  69. }
  70. }
  71. constexpr int get(TokenType token) const
  72. {
  73. int p = m_token_precedence[static_cast<size_t>(token)];
  74. if (p == 0) {
  75. fprintf(stderr, "Internal Error: No precedence for operator %s\n", Token::name(token));
  76. ASSERT_NOT_REACHED();
  77. return -1;
  78. }
  79. return p;
  80. }
  81. private:
  82. int m_token_precedence[cs_num_of_js_tokens];
  83. struct OperatorPrecedence {
  84. TokenType token;
  85. int precedence;
  86. };
  87. // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence
  88. static constexpr const OperatorPrecedence m_operator_precedence[] = {
  89. { TokenType::Period, 20 },
  90. { TokenType::BracketOpen, 20 },
  91. { TokenType::ParenOpen, 20 },
  92. { TokenType::QuestionMarkPeriod, 20 },
  93. { TokenType::New, 19 },
  94. { TokenType::PlusPlus, 18 },
  95. { TokenType::MinusMinus, 18 },
  96. { TokenType::ExclamationMark, 17 },
  97. { TokenType::Tilde, 17 },
  98. { TokenType::Typeof, 17 },
  99. { TokenType::Void, 17 },
  100. { TokenType::Delete, 17 },
  101. { TokenType::Await, 17 },
  102. { TokenType::DoubleAsterisk, 16 },
  103. { TokenType::Asterisk, 15 },
  104. { TokenType::Slash, 15 },
  105. { TokenType::Percent, 15 },
  106. { TokenType::Plus, 14 },
  107. { TokenType::Minus, 14 },
  108. { TokenType::ShiftLeft, 13 },
  109. { TokenType::ShiftRight, 13 },
  110. { TokenType::UnsignedShiftRight, 13 },
  111. { TokenType::LessThan, 12 },
  112. { TokenType::LessThanEquals, 12 },
  113. { TokenType::GreaterThan, 12 },
  114. { TokenType::GreaterThanEquals, 12 },
  115. { TokenType::In, 12 },
  116. { TokenType::Instanceof, 12 },
  117. { TokenType::EqualsEquals, 11 },
  118. { TokenType::ExclamationMarkEquals, 11 },
  119. { TokenType::EqualsEqualsEquals, 11 },
  120. { TokenType::ExclamationMarkEqualsEquals, 11 },
  121. { TokenType::Ampersand, 10 },
  122. { TokenType::Caret, 9 },
  123. { TokenType::Pipe, 8 },
  124. { TokenType::DoubleQuestionMark, 7 },
  125. { TokenType::DoubleAmpersand, 6 },
  126. { TokenType::DoublePipe, 5 },
  127. { TokenType::QuestionMark, 4 },
  128. { TokenType::Equals, 3 },
  129. { TokenType::PlusEquals, 3 },
  130. { TokenType::MinusEquals, 3 },
  131. { TokenType::DoubleAsteriskEquals, 3 },
  132. { TokenType::AsteriskEquals, 3 },
  133. { TokenType::SlashEquals, 3 },
  134. { TokenType::PercentEquals, 3 },
  135. { TokenType::ShiftLeftEquals, 3 },
  136. { TokenType::ShiftRightEquals, 3 },
  137. { TokenType::UnsignedShiftRightEquals, 3 },
  138. { TokenType::AmpersandEquals, 3 },
  139. { TokenType::PipeEquals, 3 },
  140. { TokenType::CaretEquals, 3 },
  141. { TokenType::Yield, 2 },
  142. { TokenType::Comma, 1 },
  143. };
  144. };
  145. constexpr OperatorPrecedenceTable g_operator_precedence;
  146. Parser::ParserState::ParserState(Lexer lexer)
  147. : m_lexer(move(lexer))
  148. , m_current_token(m_lexer.next())
  149. {
  150. }
  151. Parser::Parser(Lexer lexer)
  152. : m_parser_state(move(lexer))
  153. {
  154. }
  155. Associativity Parser::operator_associativity(TokenType type) const
  156. {
  157. switch (type) {
  158. case TokenType::Period:
  159. case TokenType::BracketOpen:
  160. case TokenType::ParenOpen:
  161. case TokenType::QuestionMarkPeriod:
  162. case TokenType::Asterisk:
  163. case TokenType::Slash:
  164. case TokenType::Percent:
  165. case TokenType::Plus:
  166. case TokenType::Minus:
  167. case TokenType::ShiftLeft:
  168. case TokenType::ShiftRight:
  169. case TokenType::UnsignedShiftRight:
  170. case TokenType::LessThan:
  171. case TokenType::LessThanEquals:
  172. case TokenType::GreaterThan:
  173. case TokenType::GreaterThanEquals:
  174. case TokenType::In:
  175. case TokenType::Instanceof:
  176. case TokenType::EqualsEquals:
  177. case TokenType::ExclamationMarkEquals:
  178. case TokenType::EqualsEqualsEquals:
  179. case TokenType::ExclamationMarkEqualsEquals:
  180. case TokenType::Typeof:
  181. case TokenType::Void:
  182. case TokenType::Delete:
  183. case TokenType::Ampersand:
  184. case TokenType::Caret:
  185. case TokenType::Pipe:
  186. case TokenType::DoubleQuestionMark:
  187. case TokenType::DoubleAmpersand:
  188. case TokenType::DoublePipe:
  189. case TokenType::Comma:
  190. return Associativity::Left;
  191. default:
  192. return Associativity::Right;
  193. }
  194. }
  195. NonnullRefPtr<Program> Parser::parse_program()
  196. {
  197. ScopePusher scope(*this, ScopePusher::Var | ScopePusher::Let | ScopePusher::Function);
  198. auto program = adopt(*new Program);
  199. bool first = true;
  200. m_parser_state.m_use_strict_directive = UseStrictDirectiveState::Looking;
  201. while (!done()) {
  202. if (match_statement()) {
  203. program->append(parse_statement());
  204. if (first) {
  205. if (m_parser_state.m_use_strict_directive == UseStrictDirectiveState::Found) {
  206. program->set_strict_mode();
  207. m_parser_state.m_strict_mode = true;
  208. }
  209. first = false;
  210. m_parser_state.m_use_strict_directive = UseStrictDirectiveState::None;
  211. }
  212. } else {
  213. expected("statement");
  214. consume();
  215. }
  216. }
  217. if (m_parser_state.m_var_scopes.size() == 1) {
  218. program->add_variables(m_parser_state.m_var_scopes.last());
  219. program->add_variables(m_parser_state.m_let_scopes.last());
  220. program->add_functions(m_parser_state.m_function_scopes.last());
  221. } else {
  222. syntax_error("Unclosed scope");
  223. }
  224. return program;
  225. }
  226. NonnullRefPtr<Statement> Parser::parse_statement()
  227. {
  228. switch (m_parser_state.m_current_token.type()) {
  229. case TokenType::Class:
  230. return parse_class_declaration();
  231. case TokenType::Function: {
  232. auto declaration = parse_function_node<FunctionDeclaration>();
  233. m_parser_state.m_function_scopes.last().append(declaration);
  234. return declaration;
  235. }
  236. case TokenType::CurlyOpen:
  237. return parse_block_statement();
  238. case TokenType::Return:
  239. return parse_return_statement();
  240. case TokenType::Var:
  241. case TokenType::Let:
  242. case TokenType::Const:
  243. return parse_variable_declaration();
  244. case TokenType::For:
  245. return parse_for_statement();
  246. case TokenType::If:
  247. return parse_if_statement();
  248. case TokenType::Throw:
  249. return parse_throw_statement();
  250. case TokenType::Try:
  251. return parse_try_statement();
  252. case TokenType::Break:
  253. return parse_break_statement();
  254. case TokenType::Continue:
  255. return parse_continue_statement();
  256. case TokenType::Switch:
  257. return parse_switch_statement();
  258. case TokenType::Do:
  259. return parse_do_while_statement();
  260. case TokenType::While:
  261. return parse_while_statement();
  262. case TokenType::Debugger:
  263. return parse_debugger_statement();
  264. case TokenType::Semicolon:
  265. consume();
  266. return create_ast_node<EmptyStatement>();
  267. default:
  268. if (match(TokenType::Identifier)) {
  269. auto result = try_parse_labelled_statement();
  270. if (!result.is_null())
  271. return result.release_nonnull();
  272. }
  273. if (match_expression()) {
  274. auto expr = parse_expression(0);
  275. consume_or_insert_semicolon();
  276. return create_ast_node<ExpressionStatement>(move(expr));
  277. }
  278. expected("statement (missing switch case)");
  279. consume();
  280. return create_ast_node<ErrorStatement>();
  281. }
  282. }
  283. RefPtr<FunctionExpression> Parser::try_parse_arrow_function_expression(bool expect_parens)
  284. {
  285. save_state();
  286. m_parser_state.m_var_scopes.append(NonnullRefPtrVector<VariableDeclaration>());
  287. ArmedScopeGuard state_rollback_guard = [&] {
  288. m_parser_state.m_var_scopes.take_last();
  289. load_state();
  290. };
  291. Vector<FunctionNode::Parameter> parameters;
  292. bool parse_failed = false;
  293. bool has_rest_parameter = false;
  294. i32 function_length = -1;
  295. while (true) {
  296. if (match(TokenType::Comma)) {
  297. if (has_rest_parameter || !expect_parens) {
  298. parse_failed = true;
  299. break;
  300. }
  301. consume(TokenType::Comma);
  302. } else if (match(TokenType::Identifier)) {
  303. auto parameter_name = consume(TokenType::Identifier).value();
  304. RefPtr<Expression> default_value;
  305. if (expect_parens && match(TokenType::Equals)) {
  306. consume(TokenType::Equals);
  307. function_length = parameters.size();
  308. default_value = parse_expression(2);
  309. }
  310. parameters.append({ parameter_name, default_value });
  311. } else if (match(TokenType::TripleDot)) {
  312. consume();
  313. if (has_rest_parameter) {
  314. parse_failed = true;
  315. break;
  316. }
  317. has_rest_parameter = true;
  318. function_length = parameters.size();
  319. auto parameter_name = consume(TokenType::Identifier).value();
  320. parameters.append({ parameter_name, nullptr, true });
  321. } else if (match(TokenType::ParenClose)) {
  322. if (expect_parens) {
  323. consume(TokenType::ParenClose);
  324. if (match(TokenType::Arrow)) {
  325. consume(TokenType::Arrow);
  326. } else {
  327. parse_failed = true;
  328. }
  329. break;
  330. }
  331. parse_failed = true;
  332. break;
  333. } else if (match(TokenType::Arrow)) {
  334. if (!expect_parens) {
  335. consume(TokenType::Arrow);
  336. break;
  337. }
  338. parse_failed = true;
  339. break;
  340. } else {
  341. parse_failed = true;
  342. break;
  343. }
  344. }
  345. if (parse_failed)
  346. return nullptr;
  347. if (function_length == -1)
  348. function_length = parameters.size();
  349. auto function_body_result = [this]() -> RefPtr<BlockStatement> {
  350. if (match(TokenType::CurlyOpen)) {
  351. // Parse a function body with statements
  352. return parse_block_statement();
  353. }
  354. if (match_expression()) {
  355. // Parse a function body which returns a single expression
  356. // FIXME: We synthesize a block with a return statement
  357. // for arrow function bodies which are a single expression.
  358. // Esprima generates a single "ArrowFunctionExpression"
  359. // with a "body" property.
  360. auto return_expression = parse_expression(2);
  361. auto return_block = create_ast_node<BlockStatement>();
  362. return_block->append<ReturnStatement>(move(return_expression));
  363. return return_block;
  364. }
  365. // Invalid arrow function body
  366. return nullptr;
  367. }();
  368. if (!function_body_result.is_null()) {
  369. state_rollback_guard.disarm();
  370. auto body = function_body_result.release_nonnull();
  371. return create_ast_node<FunctionExpression>("", move(body), move(parameters), function_length, m_parser_state.m_var_scopes.take_last(), true);
  372. }
  373. return nullptr;
  374. }
  375. RefPtr<Statement> Parser::try_parse_labelled_statement()
  376. {
  377. save_state();
  378. ArmedScopeGuard state_rollback_guard = [&] {
  379. load_state();
  380. };
  381. auto identifier = consume(TokenType::Identifier).value();
  382. if (!match(TokenType::Colon))
  383. return {};
  384. consume(TokenType::Colon);
  385. if (!match_statement())
  386. return {};
  387. auto statement = parse_statement();
  388. statement->set_label(identifier);
  389. state_rollback_guard.disarm();
  390. return statement;
  391. }
  392. NonnullRefPtr<ClassDeclaration> Parser::parse_class_declaration()
  393. {
  394. return create_ast_node<ClassDeclaration>(parse_class_expression(true));
  395. }
  396. NonnullRefPtr<ClassExpression> Parser::parse_class_expression(bool expect_class_name)
  397. {
  398. // Classes are always in strict mode.
  399. TemporaryChange strict_mode_rollback(m_parser_state.m_strict_mode, true);
  400. consume(TokenType::Class);
  401. NonnullRefPtrVector<ClassMethod> methods;
  402. RefPtr<Expression> super_class;
  403. RefPtr<FunctionExpression> constructor;
  404. String class_name = expect_class_name || match(TokenType::Identifier) ? consume(TokenType::Identifier).value().to_string() : "";
  405. if (match(TokenType::Extends)) {
  406. consume();
  407. super_class = parse_primary_expression();
  408. }
  409. consume(TokenType::CurlyOpen);
  410. while (!done() && !match(TokenType::CurlyClose)) {
  411. RefPtr<Expression> property_key;
  412. bool is_static = false;
  413. bool is_constructor = false;
  414. auto method_kind = ClassMethod::Kind::Method;
  415. if (match(TokenType::Semicolon)) {
  416. consume();
  417. continue;
  418. }
  419. if (match_property_key()) {
  420. StringView name;
  421. if (match(TokenType::Identifier) && m_parser_state.m_current_token.value() == "static") {
  422. consume();
  423. is_static = true;
  424. }
  425. if (match(TokenType::Identifier)) {
  426. auto identifier_name = m_parser_state.m_current_token.value();
  427. if (identifier_name == "get") {
  428. method_kind = ClassMethod::Kind::Getter;
  429. consume();
  430. } else if (identifier_name == "set") {
  431. method_kind = ClassMethod::Kind::Setter;
  432. consume();
  433. }
  434. }
  435. if (match_property_key()) {
  436. switch (m_parser_state.m_current_token.type()) {
  437. case TokenType::Identifier:
  438. name = consume().value();
  439. property_key = create_ast_node<StringLiteral>(name);
  440. break;
  441. case TokenType::StringLiteral: {
  442. auto string_literal = parse_string_literal(consume());
  443. name = string_literal->value();
  444. property_key = move(string_literal);
  445. break;
  446. }
  447. default:
  448. property_key = parse_property_key();
  449. break;
  450. }
  451. } else {
  452. expected("property key");
  453. }
  454. // Constructor may be a StringLiteral or an Identifier.
  455. if (!is_static && name == "constructor") {
  456. if (method_kind != ClassMethod::Kind::Method)
  457. syntax_error("Class constructor may not be an accessor");
  458. if (!constructor.is_null())
  459. syntax_error("Classes may not have more than one constructor");
  460. is_constructor = true;
  461. }
  462. }
  463. if (match(TokenType::ParenOpen)) {
  464. auto function = parse_function_node<FunctionExpression>(false, true, !super_class.is_null());
  465. auto arg_count = function->parameters().size();
  466. if (method_kind == ClassMethod::Kind::Getter && arg_count != 0) {
  467. syntax_error("Class getter method must have no arguments");
  468. } else if (method_kind == ClassMethod::Kind::Setter && arg_count != 1) {
  469. syntax_error("Class setter method must have one argument");
  470. }
  471. if (is_constructor) {
  472. constructor = move(function);
  473. } else if (!property_key.is_null()) {
  474. methods.append(create_ast_node<ClassMethod>(property_key.release_nonnull(), move(function), method_kind, is_static));
  475. } else {
  476. syntax_error("No key for class method");
  477. }
  478. } else {
  479. expected("ParenOpen");
  480. consume();
  481. }
  482. }
  483. consume(TokenType::CurlyClose);
  484. if (constructor.is_null()) {
  485. auto constructor_body = create_ast_node<BlockStatement>();
  486. if (!super_class.is_null()) {
  487. // Set constructor to the result of parsing the source text
  488. // constructor(... args){ super (...args);}
  489. auto super_call = create_ast_node<CallExpression>(create_ast_node<SuperExpression>(), Vector { CallExpression::Argument { create_ast_node<Identifier>("args"), true } });
  490. constructor_body->append(create_ast_node<ExpressionStatement>(move(super_call)));
  491. constructor_body->add_variables(m_parser_state.m_var_scopes.last());
  492. constructor = create_ast_node<FunctionExpression>(class_name, move(constructor_body), Vector { FunctionNode::Parameter { "args", nullptr, true } }, 0, NonnullRefPtrVector<VariableDeclaration>());
  493. } else {
  494. constructor = create_ast_node<FunctionExpression>(class_name, move(constructor_body), Vector<FunctionNode::Parameter> {}, 0, NonnullRefPtrVector<VariableDeclaration>());
  495. }
  496. }
  497. return create_ast_node<ClassExpression>(move(class_name), move(constructor), move(super_class), move(methods));
  498. }
  499. NonnullRefPtr<Expression> Parser::parse_primary_expression()
  500. {
  501. if (match_unary_prefixed_expression())
  502. return parse_unary_prefixed_expression();
  503. switch (m_parser_state.m_current_token.type()) {
  504. case TokenType::ParenOpen: {
  505. consume(TokenType::ParenOpen);
  506. if (match(TokenType::ParenClose) || match(TokenType::Identifier) || match(TokenType::TripleDot)) {
  507. auto arrow_function_result = try_parse_arrow_function_expression(true);
  508. if (!arrow_function_result.is_null()) {
  509. return arrow_function_result.release_nonnull();
  510. }
  511. }
  512. auto expression = parse_expression(0);
  513. consume(TokenType::ParenClose);
  514. return expression;
  515. }
  516. case TokenType::This:
  517. consume();
  518. return create_ast_node<ThisExpression>();
  519. case TokenType::Class:
  520. return parse_class_expression(false);
  521. case TokenType::Super:
  522. consume();
  523. if (!m_parser_state.m_allow_super_property_lookup)
  524. syntax_error("'super' keyword unexpected here");
  525. return create_ast_node<SuperExpression>();
  526. case TokenType::Identifier: {
  527. auto arrow_function_result = try_parse_arrow_function_expression(false);
  528. if (!arrow_function_result.is_null()) {
  529. return arrow_function_result.release_nonnull();
  530. }
  531. return create_ast_node<Identifier>(consume().value());
  532. }
  533. case TokenType::NumericLiteral:
  534. return create_ast_node<NumericLiteral>(consume().double_value());
  535. case TokenType::BigIntLiteral:
  536. return create_ast_node<BigIntLiteral>(consume().value());
  537. case TokenType::BoolLiteral:
  538. return create_ast_node<BooleanLiteral>(consume().bool_value());
  539. case TokenType::StringLiteral:
  540. return parse_string_literal(consume());
  541. case TokenType::NullLiteral:
  542. consume();
  543. return create_ast_node<NullLiteral>();
  544. case TokenType::CurlyOpen:
  545. return parse_object_expression();
  546. case TokenType::Function:
  547. return parse_function_node<FunctionExpression>();
  548. case TokenType::BracketOpen:
  549. return parse_array_expression();
  550. case TokenType::RegexLiteral:
  551. return parse_regexp_literal();
  552. case TokenType::TemplateLiteralStart:
  553. return parse_template_literal(false);
  554. case TokenType::New:
  555. return parse_new_expression();
  556. default:
  557. expected("primary expression (missing switch case)");
  558. consume();
  559. return create_ast_node<ErrorExpression>();
  560. }
  561. }
  562. NonnullRefPtr<RegExpLiteral> Parser::parse_regexp_literal()
  563. {
  564. auto content = consume().value();
  565. auto flags = match(TokenType::RegexFlags) ? consume().value() : "";
  566. return create_ast_node<RegExpLiteral>(content.substring_view(1, content.length() - 2), flags);
  567. }
  568. NonnullRefPtr<Expression> Parser::parse_unary_prefixed_expression()
  569. {
  570. auto precedence = g_operator_precedence.get(m_parser_state.m_current_token.type());
  571. auto associativity = operator_associativity(m_parser_state.m_current_token.type());
  572. switch (m_parser_state.m_current_token.type()) {
  573. case TokenType::PlusPlus: {
  574. consume();
  575. auto rhs_start_line = m_parser_state.m_current_token.line_number();
  576. auto rhs_start_column = m_parser_state.m_current_token.line_column();
  577. auto rhs = parse_expression(precedence, associativity);
  578. // FIXME: Apparently for functions this should also not be enforced on a parser level,
  579. // other engines throw ReferenceError for ++foo()
  580. if (!rhs->is_identifier() && !rhs->is_member_expression())
  581. syntax_error(String::format("Right-hand side of prefix increment operator must be identifier or member expression, got %s", rhs->class_name()), rhs_start_line, rhs_start_column);
  582. return create_ast_node<UpdateExpression>(UpdateOp::Increment, move(rhs), true);
  583. }
  584. case TokenType::MinusMinus: {
  585. consume();
  586. auto rhs_start_line = m_parser_state.m_current_token.line_number();
  587. auto rhs_start_column = m_parser_state.m_current_token.line_column();
  588. auto rhs = parse_expression(precedence, associativity);
  589. // FIXME: Apparently for functions this should also not be enforced on a parser level,
  590. // other engines throw ReferenceError for --foo()
  591. if (!rhs->is_identifier() && !rhs->is_member_expression())
  592. syntax_error(String::format("Right-hand side of prefix decrement operator must be identifier or member expression, got %s", rhs->class_name()), rhs_start_line, rhs_start_column);
  593. return create_ast_node<UpdateExpression>(UpdateOp::Decrement, move(rhs), true);
  594. }
  595. case TokenType::ExclamationMark:
  596. consume();
  597. return create_ast_node<UnaryExpression>(UnaryOp::Not, parse_expression(precedence, associativity));
  598. case TokenType::Tilde:
  599. consume();
  600. return create_ast_node<UnaryExpression>(UnaryOp::BitwiseNot, parse_expression(precedence, associativity));
  601. case TokenType::Plus:
  602. consume();
  603. return create_ast_node<UnaryExpression>(UnaryOp::Plus, parse_expression(precedence, associativity));
  604. case TokenType::Minus:
  605. consume();
  606. return create_ast_node<UnaryExpression>(UnaryOp::Minus, parse_expression(precedence, associativity));
  607. case TokenType::Typeof:
  608. consume();
  609. return create_ast_node<UnaryExpression>(UnaryOp::Typeof, parse_expression(precedence, associativity));
  610. case TokenType::Void:
  611. consume();
  612. return create_ast_node<UnaryExpression>(UnaryOp::Void, parse_expression(precedence, associativity));
  613. case TokenType::Delete:
  614. consume();
  615. return create_ast_node<UnaryExpression>(UnaryOp::Delete, parse_expression(precedence, associativity));
  616. default:
  617. expected("primary expression (missing switch case)");
  618. consume();
  619. return create_ast_node<ErrorExpression>();
  620. }
  621. }
  622. NonnullRefPtr<Expression> Parser::parse_property_key()
  623. {
  624. if (match(TokenType::StringLiteral)) {
  625. return parse_string_literal(consume());
  626. } else if (match(TokenType::NumericLiteral)) {
  627. return create_ast_node<StringLiteral>(consume(TokenType::NumericLiteral).value());
  628. } else if (match(TokenType::BigIntLiteral)) {
  629. auto value = consume(TokenType::BigIntLiteral).value();
  630. return create_ast_node<StringLiteral>(value.substring_view(0, value.length() - 1));
  631. } else if (match(TokenType::BracketOpen)) {
  632. consume(TokenType::BracketOpen);
  633. auto result = parse_expression(0);
  634. consume(TokenType::BracketClose);
  635. return result;
  636. } else {
  637. if (!match_identifier_name())
  638. expected("IdentifierName");
  639. return create_ast_node<StringLiteral>(consume().value());
  640. }
  641. }
  642. NonnullRefPtr<ObjectExpression> Parser::parse_object_expression()
  643. {
  644. consume(TokenType::CurlyOpen);
  645. NonnullRefPtrVector<ObjectProperty> properties;
  646. ObjectProperty::Type property_type;
  647. auto skip_to_next_property = [&] {
  648. while (!done() && !match(TokenType::Comma) && !match(TokenType::CurlyOpen))
  649. consume();
  650. };
  651. while (!done() && !match(TokenType::CurlyClose)) {
  652. property_type = ObjectProperty::Type::KeyValue;
  653. RefPtr<Expression> property_name;
  654. RefPtr<Expression> property_value;
  655. if (match(TokenType::TripleDot)) {
  656. consume();
  657. property_name = parse_expression(4);
  658. properties.append(create_ast_node<ObjectProperty>(*property_name, nullptr, ObjectProperty::Type::Spread, false));
  659. if (!match(TokenType::Comma))
  660. break;
  661. consume(TokenType::Comma);
  662. continue;
  663. }
  664. if (match(TokenType::Identifier)) {
  665. auto identifier = consume().value();
  666. if (identifier == "get" && match_property_key()) {
  667. property_type = ObjectProperty::Type::Getter;
  668. property_name = parse_property_key();
  669. } else if (identifier == "set" && match_property_key()) {
  670. property_type = ObjectProperty::Type::Setter;
  671. property_name = parse_property_key();
  672. } else {
  673. property_name = create_ast_node<StringLiteral>(identifier);
  674. property_value = create_ast_node<Identifier>(identifier);
  675. }
  676. } else {
  677. property_name = parse_property_key();
  678. }
  679. if (property_type == ObjectProperty::Type::Getter || property_type == ObjectProperty::Type::Setter) {
  680. if (!match(TokenType::ParenOpen)) {
  681. syntax_error(
  682. "Expected '(' for object getter or setter property",
  683. m_parser_state.m_current_token.line_number(),
  684. m_parser_state.m_current_token.line_column());
  685. skip_to_next_property();
  686. continue;
  687. }
  688. }
  689. if (match(TokenType::ParenOpen)) {
  690. ASSERT(property_name);
  691. auto function = parse_function_node<FunctionExpression>(false, true);
  692. auto arg_count = function->parameters().size();
  693. if (property_type == ObjectProperty::Type::Getter && arg_count != 0) {
  694. syntax_error(
  695. "Object getter property must have no arguments",
  696. m_parser_state.m_current_token.line_number(),
  697. m_parser_state.m_current_token.line_column());
  698. skip_to_next_property();
  699. continue;
  700. }
  701. if (property_type == ObjectProperty::Type::Setter && arg_count != 1) {
  702. syntax_error(
  703. "Object setter property must have one argument",
  704. m_parser_state.m_current_token.line_number(),
  705. m_parser_state.m_current_token.line_column());
  706. skip_to_next_property();
  707. continue;
  708. }
  709. properties.append(create_ast_node<ObjectProperty>(*property_name, function, property_type, true));
  710. } else if (match(TokenType::Colon)) {
  711. if (!property_name) {
  712. syntax_error("Expected a property name");
  713. skip_to_next_property();
  714. continue;
  715. }
  716. consume();
  717. properties.append(create_ast_node<ObjectProperty>(*property_name, parse_expression(2), property_type, false));
  718. } else if (property_name && property_value) {
  719. properties.append(create_ast_node<ObjectProperty>(*property_name, *property_value, property_type, false));
  720. } else {
  721. syntax_error("Expected a property");
  722. skip_to_next_property();
  723. continue;
  724. }
  725. if (!match(TokenType::Comma))
  726. break;
  727. consume(TokenType::Comma);
  728. }
  729. consume(TokenType::CurlyClose);
  730. return create_ast_node<ObjectExpression>(properties);
  731. }
  732. NonnullRefPtr<ArrayExpression> Parser::parse_array_expression()
  733. {
  734. consume(TokenType::BracketOpen);
  735. Vector<RefPtr<Expression>> elements;
  736. while (match_expression() || match(TokenType::TripleDot) || match(TokenType::Comma)) {
  737. RefPtr<Expression> expression;
  738. if (match(TokenType::TripleDot)) {
  739. consume(TokenType::TripleDot);
  740. expression = create_ast_node<SpreadExpression>(parse_expression(2));
  741. } else if (match_expression()) {
  742. expression = parse_expression(2);
  743. }
  744. elements.append(expression);
  745. if (!match(TokenType::Comma))
  746. break;
  747. consume(TokenType::Comma);
  748. }
  749. consume(TokenType::BracketClose);
  750. return create_ast_node<ArrayExpression>(move(elements));
  751. }
  752. NonnullRefPtr<StringLiteral> Parser::parse_string_literal(Token token)
  753. {
  754. auto status = Token::StringValueStatus::Ok;
  755. auto string = token.string_value(status);
  756. if (status != Token::StringValueStatus::Ok) {
  757. String message;
  758. if (status == Token::StringValueStatus::MalformedHexEscape || status == Token::StringValueStatus::MalformedUnicodeEscape) {
  759. auto type = status == Token::StringValueStatus::MalformedUnicodeEscape ? "unicode" : "hexadecimal";
  760. message = String::format("Malformed %s escape sequence", type);
  761. } else if (status == Token::StringValueStatus::UnicodeEscapeOverflow) {
  762. message = "Unicode code_point must not be greater than 0x10ffff in escape sequence";
  763. }
  764. syntax_error(
  765. message,
  766. m_parser_state.m_current_token.line_number(),
  767. m_parser_state.m_current_token.line_column());
  768. }
  769. if (m_parser_state.m_use_strict_directive == UseStrictDirectiveState::Looking) {
  770. if (string == "use strict" && token.type() != TokenType::TemplateLiteralString) {
  771. m_parser_state.m_use_strict_directive = UseStrictDirectiveState::Found;
  772. } else {
  773. m_parser_state.m_use_strict_directive = UseStrictDirectiveState::None;
  774. }
  775. }
  776. return create_ast_node<StringLiteral>(string);
  777. }
  778. NonnullRefPtr<TemplateLiteral> Parser::parse_template_literal(bool is_tagged)
  779. {
  780. consume(TokenType::TemplateLiteralStart);
  781. NonnullRefPtrVector<Expression> expressions;
  782. NonnullRefPtrVector<Expression> raw_strings;
  783. auto append_empty_string = [&expressions, &raw_strings, is_tagged]() {
  784. auto string_literal = create_ast_node<StringLiteral>("");
  785. expressions.append(string_literal);
  786. if (is_tagged)
  787. raw_strings.append(string_literal);
  788. };
  789. if (!match(TokenType::TemplateLiteralString))
  790. append_empty_string();
  791. while (!done() && !match(TokenType::TemplateLiteralEnd) && !match(TokenType::UnterminatedTemplateLiteral)) {
  792. if (match(TokenType::TemplateLiteralString)) {
  793. auto token = consume();
  794. expressions.append(parse_string_literal(token));
  795. if (is_tagged)
  796. raw_strings.append(create_ast_node<StringLiteral>(token.value()));
  797. } else if (match(TokenType::TemplateLiteralExprStart)) {
  798. consume(TokenType::TemplateLiteralExprStart);
  799. if (match(TokenType::TemplateLiteralExprEnd)) {
  800. syntax_error("Empty template literal expression block");
  801. return create_ast_node<TemplateLiteral>(expressions);
  802. }
  803. expressions.append(parse_expression(0));
  804. if (match(TokenType::UnterminatedTemplateLiteral)) {
  805. syntax_error("Unterminated template literal");
  806. return create_ast_node<TemplateLiteral>(expressions);
  807. }
  808. consume(TokenType::TemplateLiteralExprEnd);
  809. if (!match(TokenType::TemplateLiteralString))
  810. append_empty_string();
  811. } else {
  812. expected("Template literal string or expression");
  813. break;
  814. }
  815. }
  816. if (match(TokenType::UnterminatedTemplateLiteral)) {
  817. syntax_error("Unterminated template literal");
  818. } else {
  819. consume(TokenType::TemplateLiteralEnd);
  820. }
  821. if (is_tagged)
  822. return create_ast_node<TemplateLiteral>(expressions, raw_strings);
  823. return create_ast_node<TemplateLiteral>(expressions);
  824. }
  825. NonnullRefPtr<Expression> Parser::parse_expression(int min_precedence, Associativity associativity, Vector<TokenType> forbidden)
  826. {
  827. auto expression = parse_primary_expression();
  828. while (match(TokenType::TemplateLiteralStart)) {
  829. auto template_literal = parse_template_literal(true);
  830. expression = create_ast_node<TaggedTemplateLiteral>(move(expression), move(template_literal));
  831. }
  832. while (match_secondary_expression(forbidden)) {
  833. int new_precedence = g_operator_precedence.get(m_parser_state.m_current_token.type());
  834. if (new_precedence < min_precedence)
  835. break;
  836. if (new_precedence == min_precedence && associativity == Associativity::Left)
  837. break;
  838. Associativity new_associativity = operator_associativity(m_parser_state.m_current_token.type());
  839. expression = parse_secondary_expression(move(expression), new_precedence, new_associativity);
  840. while (match(TokenType::TemplateLiteralStart)) {
  841. auto template_literal = parse_template_literal(true);
  842. expression = create_ast_node<TaggedTemplateLiteral>(move(expression), move(template_literal));
  843. }
  844. }
  845. if (match(TokenType::Comma) && min_precedence <= 1) {
  846. NonnullRefPtrVector<Expression> expressions;
  847. expressions.append(expression);
  848. while (match(TokenType::Comma)) {
  849. consume();
  850. expressions.append(parse_expression(2));
  851. }
  852. expression = create_ast_node<SequenceExpression>(move(expressions));
  853. }
  854. return expression;
  855. }
  856. NonnullRefPtr<Expression> Parser::parse_secondary_expression(NonnullRefPtr<Expression> lhs, int min_precedence, Associativity associativity)
  857. {
  858. switch (m_parser_state.m_current_token.type()) {
  859. case TokenType::Plus:
  860. consume();
  861. return create_ast_node<BinaryExpression>(BinaryOp::Addition, move(lhs), parse_expression(min_precedence, associativity));
  862. case TokenType::PlusEquals:
  863. consume();
  864. return create_ast_node<AssignmentExpression>(AssignmentOp::AdditionAssignment, move(lhs), parse_expression(min_precedence, associativity));
  865. case TokenType::Minus:
  866. consume();
  867. return create_ast_node<BinaryExpression>(BinaryOp::Subtraction, move(lhs), parse_expression(min_precedence, associativity));
  868. case TokenType::MinusEquals:
  869. consume();
  870. return create_ast_node<AssignmentExpression>(AssignmentOp::SubtractionAssignment, move(lhs), parse_expression(min_precedence, associativity));
  871. case TokenType::Asterisk:
  872. consume();
  873. return create_ast_node<BinaryExpression>(BinaryOp::Multiplication, move(lhs), parse_expression(min_precedence, associativity));
  874. case TokenType::AsteriskEquals:
  875. consume();
  876. return create_ast_node<AssignmentExpression>(AssignmentOp::MultiplicationAssignment, move(lhs), parse_expression(min_precedence, associativity));
  877. case TokenType::Slash:
  878. consume();
  879. return create_ast_node<BinaryExpression>(BinaryOp::Division, move(lhs), parse_expression(min_precedence, associativity));
  880. case TokenType::SlashEquals:
  881. consume();
  882. return create_ast_node<AssignmentExpression>(AssignmentOp::DivisionAssignment, move(lhs), parse_expression(min_precedence, associativity));
  883. case TokenType::Percent:
  884. consume();
  885. return create_ast_node<BinaryExpression>(BinaryOp::Modulo, move(lhs), parse_expression(min_precedence, associativity));
  886. case TokenType::PercentEquals:
  887. consume();
  888. return create_ast_node<AssignmentExpression>(AssignmentOp::ModuloAssignment, move(lhs), parse_expression(min_precedence, associativity));
  889. case TokenType::DoubleAsterisk:
  890. consume();
  891. return create_ast_node<BinaryExpression>(BinaryOp::Exponentiation, move(lhs), parse_expression(min_precedence, associativity));
  892. case TokenType::DoubleAsteriskEquals:
  893. consume();
  894. return create_ast_node<AssignmentExpression>(AssignmentOp::ExponentiationAssignment, move(lhs), parse_expression(min_precedence, associativity));
  895. case TokenType::GreaterThan:
  896. consume();
  897. return create_ast_node<BinaryExpression>(BinaryOp::GreaterThan, move(lhs), parse_expression(min_precedence, associativity));
  898. case TokenType::GreaterThanEquals:
  899. consume();
  900. return create_ast_node<BinaryExpression>(BinaryOp::GreaterThanEquals, move(lhs), parse_expression(min_precedence, associativity));
  901. case TokenType::LessThan:
  902. consume();
  903. return create_ast_node<BinaryExpression>(BinaryOp::LessThan, move(lhs), parse_expression(min_precedence, associativity));
  904. case TokenType::LessThanEquals:
  905. consume();
  906. return create_ast_node<BinaryExpression>(BinaryOp::LessThanEquals, move(lhs), parse_expression(min_precedence, associativity));
  907. case TokenType::EqualsEqualsEquals:
  908. consume();
  909. return create_ast_node<BinaryExpression>(BinaryOp::TypedEquals, move(lhs), parse_expression(min_precedence, associativity));
  910. case TokenType::ExclamationMarkEqualsEquals:
  911. consume();
  912. return create_ast_node<BinaryExpression>(BinaryOp::TypedInequals, move(lhs), parse_expression(min_precedence, associativity));
  913. case TokenType::EqualsEquals:
  914. consume();
  915. return create_ast_node<BinaryExpression>(BinaryOp::AbstractEquals, move(lhs), parse_expression(min_precedence, associativity));
  916. case TokenType::ExclamationMarkEquals:
  917. consume();
  918. return create_ast_node<BinaryExpression>(BinaryOp::AbstractInequals, move(lhs), parse_expression(min_precedence, associativity));
  919. case TokenType::In:
  920. consume();
  921. return create_ast_node<BinaryExpression>(BinaryOp::In, move(lhs), parse_expression(min_precedence, associativity));
  922. case TokenType::Instanceof:
  923. consume();
  924. return create_ast_node<BinaryExpression>(BinaryOp::InstanceOf, move(lhs), parse_expression(min_precedence, associativity));
  925. case TokenType::Ampersand:
  926. consume();
  927. return create_ast_node<BinaryExpression>(BinaryOp::BitwiseAnd, move(lhs), parse_expression(min_precedence, associativity));
  928. case TokenType::AmpersandEquals:
  929. consume();
  930. return create_ast_node<AssignmentExpression>(AssignmentOp::BitwiseAndAssignment, move(lhs), parse_expression(min_precedence, associativity));
  931. case TokenType::Pipe:
  932. consume();
  933. return create_ast_node<BinaryExpression>(BinaryOp::BitwiseOr, move(lhs), parse_expression(min_precedence, associativity));
  934. case TokenType::PipeEquals:
  935. consume();
  936. return create_ast_node<AssignmentExpression>(AssignmentOp::BitwiseOrAssignment, move(lhs), parse_expression(min_precedence, associativity));
  937. case TokenType::Caret:
  938. consume();
  939. return create_ast_node<BinaryExpression>(BinaryOp::BitwiseXor, move(lhs), parse_expression(min_precedence, associativity));
  940. case TokenType::CaretEquals:
  941. consume();
  942. return create_ast_node<AssignmentExpression>(AssignmentOp::BitwiseXorAssignment, move(lhs), parse_expression(min_precedence, associativity));
  943. case TokenType::ShiftLeft:
  944. consume();
  945. return create_ast_node<BinaryExpression>(BinaryOp::LeftShift, move(lhs), parse_expression(min_precedence, associativity));
  946. case TokenType::ShiftLeftEquals:
  947. consume();
  948. return create_ast_node<AssignmentExpression>(AssignmentOp::LeftShiftAssignment, move(lhs), parse_expression(min_precedence, associativity));
  949. case TokenType::ShiftRight:
  950. consume();
  951. return create_ast_node<BinaryExpression>(BinaryOp::RightShift, move(lhs), parse_expression(min_precedence, associativity));
  952. case TokenType::ShiftRightEquals:
  953. consume();
  954. return create_ast_node<AssignmentExpression>(AssignmentOp::RightShiftAssignment, move(lhs), parse_expression(min_precedence, associativity));
  955. case TokenType::UnsignedShiftRight:
  956. consume();
  957. return create_ast_node<BinaryExpression>(BinaryOp::UnsignedRightShift, move(lhs), parse_expression(min_precedence, associativity));
  958. case TokenType::UnsignedShiftRightEquals:
  959. consume();
  960. return create_ast_node<AssignmentExpression>(AssignmentOp::UnsignedRightShiftAssignment, move(lhs), parse_expression(min_precedence, associativity));
  961. case TokenType::ParenOpen:
  962. return parse_call_expression(move(lhs));
  963. case TokenType::Equals:
  964. consume();
  965. if (!lhs->is_identifier() && !lhs->is_member_expression() && !lhs->is_call_expression()) {
  966. syntax_error("Invalid left-hand side in assignment");
  967. return create_ast_node<ErrorExpression>();
  968. }
  969. if (m_parser_state.m_strict_mode && lhs->is_identifier()) {
  970. auto name = static_cast<const Identifier&>(*lhs).string();
  971. if (name == "eval" || name == "arguments") {
  972. syntax_error(
  973. String::format("'%s' cannot be assigned to in strict mode code", name.characters()),
  974. m_parser_state.m_current_token.line_number(),
  975. m_parser_state.m_current_token.line_column());
  976. }
  977. }
  978. return create_ast_node<AssignmentExpression>(AssignmentOp::Assignment, move(lhs), parse_expression(min_precedence, associativity));
  979. case TokenType::Period:
  980. consume();
  981. if (!match_identifier_name())
  982. expected("IdentifierName");
  983. return create_ast_node<MemberExpression>(move(lhs), create_ast_node<Identifier>(consume().value()));
  984. case TokenType::BracketOpen: {
  985. consume(TokenType::BracketOpen);
  986. auto expression = create_ast_node<MemberExpression>(move(lhs), parse_expression(0), true);
  987. consume(TokenType::BracketClose);
  988. return expression;
  989. }
  990. case TokenType::PlusPlus:
  991. // FIXME: Apparently for functions this should also not be enforced on a parser level,
  992. // other engines throw ReferenceError for foo()++
  993. if (!lhs->is_identifier() && !lhs->is_member_expression())
  994. syntax_error(String::format("Left-hand side of postfix increment operator must be identifier or member expression, got %s", lhs->class_name()));
  995. consume();
  996. return create_ast_node<UpdateExpression>(UpdateOp::Increment, move(lhs));
  997. case TokenType::MinusMinus:
  998. // FIXME: Apparently for functions this should also not be enforced on a parser level,
  999. // other engines throw ReferenceError for foo()--
  1000. if (!lhs->is_identifier() && !lhs->is_member_expression())
  1001. syntax_error(String::format("Left-hand side of postfix increment operator must be identifier or member expression, got %s", lhs->class_name()));
  1002. consume();
  1003. return create_ast_node<UpdateExpression>(UpdateOp::Decrement, move(lhs));
  1004. case TokenType::DoubleAmpersand:
  1005. consume();
  1006. return create_ast_node<LogicalExpression>(LogicalOp::And, move(lhs), parse_expression(min_precedence, associativity));
  1007. case TokenType::DoublePipe:
  1008. consume();
  1009. return create_ast_node<LogicalExpression>(LogicalOp::Or, move(lhs), parse_expression(min_precedence, associativity));
  1010. case TokenType::DoubleQuestionMark:
  1011. consume();
  1012. return create_ast_node<LogicalExpression>(LogicalOp::NullishCoalescing, move(lhs), parse_expression(min_precedence, associativity));
  1013. case TokenType::QuestionMark:
  1014. return parse_conditional_expression(move(lhs));
  1015. default:
  1016. expected("secondary expression (missing switch case)");
  1017. consume();
  1018. return create_ast_node<ErrorExpression>();
  1019. }
  1020. }
  1021. NonnullRefPtr<CallExpression> Parser::parse_call_expression(NonnullRefPtr<Expression> lhs)
  1022. {
  1023. if (!m_parser_state.m_allow_super_constructor_call && lhs->is_super_expression())
  1024. syntax_error("'super' keyword unexpected here");
  1025. consume(TokenType::ParenOpen);
  1026. Vector<CallExpression::Argument> arguments;
  1027. while (match_expression() || match(TokenType::TripleDot)) {
  1028. if (match(TokenType::TripleDot)) {
  1029. consume();
  1030. arguments.append({ parse_expression(2), true });
  1031. } else {
  1032. arguments.append({ parse_expression(2), false });
  1033. }
  1034. if (!match(TokenType::Comma))
  1035. break;
  1036. consume();
  1037. }
  1038. consume(TokenType::ParenClose);
  1039. return create_ast_node<CallExpression>(move(lhs), move(arguments));
  1040. }
  1041. NonnullRefPtr<NewExpression> Parser::parse_new_expression()
  1042. {
  1043. consume(TokenType::New);
  1044. auto callee = parse_expression(g_operator_precedence.get(TokenType::New), Associativity::Right, { TokenType::ParenOpen });
  1045. Vector<CallExpression::Argument> arguments;
  1046. if (match(TokenType::ParenOpen)) {
  1047. consume(TokenType::ParenOpen);
  1048. while (match_expression() || match(TokenType::TripleDot)) {
  1049. if (match(TokenType::TripleDot)) {
  1050. consume();
  1051. arguments.append({ parse_expression(2), true });
  1052. } else {
  1053. arguments.append({ parse_expression(2), false });
  1054. }
  1055. if (!match(TokenType::Comma))
  1056. break;
  1057. consume();
  1058. }
  1059. consume(TokenType::ParenClose);
  1060. }
  1061. return create_ast_node<NewExpression>(move(callee), move(arguments));
  1062. }
  1063. NonnullRefPtr<ReturnStatement> Parser::parse_return_statement()
  1064. {
  1065. consume(TokenType::Return);
  1066. // Automatic semicolon insertion: terminate statement when return is followed by newline
  1067. if (m_parser_state.m_current_token.trivia().contains('\n'))
  1068. return create_ast_node<ReturnStatement>(nullptr);
  1069. if (match_expression()) {
  1070. auto expression = parse_expression(0);
  1071. consume_or_insert_semicolon();
  1072. return create_ast_node<ReturnStatement>(move(expression));
  1073. }
  1074. consume_or_insert_semicolon();
  1075. return create_ast_node<ReturnStatement>(nullptr);
  1076. }
  1077. NonnullRefPtr<BlockStatement> Parser::parse_block_statement()
  1078. {
  1079. ScopePusher scope(*this, ScopePusher::Let);
  1080. auto block = create_ast_node<BlockStatement>();
  1081. consume(TokenType::CurlyOpen);
  1082. bool first = true;
  1083. bool initial_strict_mode_state = m_parser_state.m_strict_mode;
  1084. if (initial_strict_mode_state) {
  1085. m_parser_state.m_use_strict_directive = UseStrictDirectiveState::None;
  1086. block->set_strict_mode();
  1087. } else {
  1088. m_parser_state.m_use_strict_directive = UseStrictDirectiveState::Looking;
  1089. }
  1090. while (!done() && !match(TokenType::CurlyClose)) {
  1091. if (match(TokenType::Semicolon)) {
  1092. consume();
  1093. } else if (match_statement()) {
  1094. block->append(parse_statement());
  1095. if (first && !initial_strict_mode_state) {
  1096. if (m_parser_state.m_use_strict_directive == UseStrictDirectiveState::Found) {
  1097. block->set_strict_mode();
  1098. m_parser_state.m_strict_mode = true;
  1099. }
  1100. m_parser_state.m_use_strict_directive = UseStrictDirectiveState::None;
  1101. }
  1102. } else {
  1103. expected("statement");
  1104. consume();
  1105. }
  1106. first = false;
  1107. }
  1108. m_parser_state.m_strict_mode = initial_strict_mode_state;
  1109. consume(TokenType::CurlyClose);
  1110. block->add_variables(m_parser_state.m_let_scopes.last());
  1111. block->add_functions(m_parser_state.m_function_scopes.last());
  1112. return block;
  1113. }
  1114. template<typename FunctionNodeType>
  1115. NonnullRefPtr<FunctionNodeType> Parser::parse_function_node(bool check_for_function_and_name, bool allow_super_property_lookup, bool allow_super_constructor_call)
  1116. {
  1117. TemporaryChange super_property_access_rollback(m_parser_state.m_allow_super_property_lookup, allow_super_property_lookup);
  1118. TemporaryChange super_constructor_call_rollback(m_parser_state.m_allow_super_constructor_call, allow_super_constructor_call);
  1119. ScopePusher scope(*this, ScopePusher::Var | ScopePusher::Function);
  1120. if (check_for_function_and_name)
  1121. consume(TokenType::Function);
  1122. String name;
  1123. if (check_for_function_and_name) {
  1124. if (FunctionNodeType::must_have_name()) {
  1125. name = consume(TokenType::Identifier).value();
  1126. } else {
  1127. if (match(TokenType::Identifier))
  1128. name = consume(TokenType::Identifier).value();
  1129. }
  1130. }
  1131. consume(TokenType::ParenOpen);
  1132. Vector<FunctionNode::Parameter> parameters;
  1133. i32 function_length = -1;
  1134. while (match(TokenType::Identifier) || match(TokenType::TripleDot)) {
  1135. if (match(TokenType::TripleDot)) {
  1136. consume();
  1137. auto parameter_name = consume(TokenType::Identifier).value();
  1138. function_length = parameters.size();
  1139. parameters.append({ parameter_name, nullptr, true });
  1140. break;
  1141. }
  1142. auto parameter_name = consume(TokenType::Identifier).value();
  1143. RefPtr<Expression> default_value;
  1144. if (match(TokenType::Equals)) {
  1145. consume(TokenType::Equals);
  1146. function_length = parameters.size();
  1147. default_value = parse_expression(2);
  1148. }
  1149. parameters.append({ parameter_name, default_value });
  1150. if (match(TokenType::ParenClose))
  1151. break;
  1152. consume(TokenType::Comma);
  1153. }
  1154. consume(TokenType::ParenClose);
  1155. if (function_length == -1)
  1156. function_length = parameters.size();
  1157. auto body = parse_block_statement();
  1158. body->add_variables(m_parser_state.m_var_scopes.last());
  1159. body->add_functions(m_parser_state.m_function_scopes.last());
  1160. return create_ast_node<FunctionNodeType>(name, move(body), move(parameters), function_length, NonnullRefPtrVector<VariableDeclaration>());
  1161. }
  1162. NonnullRefPtr<VariableDeclaration> Parser::parse_variable_declaration(bool with_semicolon)
  1163. {
  1164. DeclarationKind declaration_kind;
  1165. switch (m_parser_state.m_current_token.type()) {
  1166. case TokenType::Var:
  1167. declaration_kind = DeclarationKind::Var;
  1168. consume(TokenType::Var);
  1169. break;
  1170. case TokenType::Let:
  1171. declaration_kind = DeclarationKind::Let;
  1172. consume(TokenType::Let);
  1173. break;
  1174. case TokenType::Const:
  1175. declaration_kind = DeclarationKind::Const;
  1176. consume(TokenType::Const);
  1177. break;
  1178. default:
  1179. ASSERT_NOT_REACHED();
  1180. }
  1181. NonnullRefPtrVector<VariableDeclarator> declarations;
  1182. for (;;) {
  1183. auto id = consume(TokenType::Identifier).value();
  1184. RefPtr<Expression> init;
  1185. if (match(TokenType::Equals)) {
  1186. consume();
  1187. init = parse_expression(2);
  1188. }
  1189. declarations.append(create_ast_node<VariableDeclarator>(create_ast_node<Identifier>(move(id)), move(init)));
  1190. if (match(TokenType::Comma)) {
  1191. consume();
  1192. continue;
  1193. }
  1194. break;
  1195. }
  1196. if (with_semicolon)
  1197. consume_or_insert_semicolon();
  1198. auto declaration = create_ast_node<VariableDeclaration>(declaration_kind, move(declarations));
  1199. if (declaration_kind == DeclarationKind::Var)
  1200. m_parser_state.m_var_scopes.last().append(declaration);
  1201. else
  1202. m_parser_state.m_let_scopes.last().append(declaration);
  1203. return declaration;
  1204. }
  1205. NonnullRefPtr<ThrowStatement> Parser::parse_throw_statement()
  1206. {
  1207. consume(TokenType::Throw);
  1208. // Automatic semicolon insertion: terminate statement when throw is followed by newline
  1209. if (m_parser_state.m_current_token.trivia().contains('\n')) {
  1210. syntax_error("No line break is allowed between 'throw' and its expression");
  1211. return create_ast_node<ThrowStatement>(create_ast_node<ErrorExpression>());
  1212. }
  1213. auto expression = parse_expression(0);
  1214. consume_or_insert_semicolon();
  1215. return create_ast_node<ThrowStatement>(move(expression));
  1216. }
  1217. NonnullRefPtr<BreakStatement> Parser::parse_break_statement()
  1218. {
  1219. consume(TokenType::Break);
  1220. FlyString target_label;
  1221. if (match(TokenType::Semicolon)) {
  1222. consume();
  1223. return create_ast_node<BreakStatement>(target_label);
  1224. }
  1225. if (match(TokenType::Identifier) && !m_parser_state.m_current_token.trivia().contains('\n'))
  1226. target_label = consume().value();
  1227. consume_or_insert_semicolon();
  1228. return create_ast_node<BreakStatement>(target_label);
  1229. }
  1230. NonnullRefPtr<ContinueStatement> Parser::parse_continue_statement()
  1231. {
  1232. consume(TokenType::Continue);
  1233. FlyString target_label;
  1234. if (match(TokenType::Semicolon)) {
  1235. consume();
  1236. return create_ast_node<ContinueStatement>(target_label);
  1237. }
  1238. if (match(TokenType::Identifier) && !m_parser_state.m_current_token.trivia().contains('\n'))
  1239. target_label = consume().value();
  1240. consume_or_insert_semicolon();
  1241. return create_ast_node<ContinueStatement>(target_label);
  1242. }
  1243. NonnullRefPtr<ConditionalExpression> Parser::parse_conditional_expression(NonnullRefPtr<Expression> test)
  1244. {
  1245. consume(TokenType::QuestionMark);
  1246. auto consequent = parse_expression(2);
  1247. consume(TokenType::Colon);
  1248. auto alternate = parse_expression(2);
  1249. return create_ast_node<ConditionalExpression>(move(test), move(consequent), move(alternate));
  1250. }
  1251. NonnullRefPtr<TryStatement> Parser::parse_try_statement()
  1252. {
  1253. consume(TokenType::Try);
  1254. auto block = parse_block_statement();
  1255. RefPtr<CatchClause> handler;
  1256. if (match(TokenType::Catch))
  1257. handler = parse_catch_clause();
  1258. RefPtr<BlockStatement> finalizer;
  1259. if (match(TokenType::Finally)) {
  1260. consume();
  1261. finalizer = parse_block_statement();
  1262. }
  1263. return create_ast_node<TryStatement>(move(block), move(handler), move(finalizer));
  1264. }
  1265. NonnullRefPtr<DoWhileStatement> Parser::parse_do_while_statement()
  1266. {
  1267. consume(TokenType::Do);
  1268. auto body = parse_statement();
  1269. consume(TokenType::While);
  1270. consume(TokenType::ParenOpen);
  1271. auto test = parse_expression(0);
  1272. consume(TokenType::ParenClose);
  1273. consume_or_insert_semicolon();
  1274. return create_ast_node<DoWhileStatement>(move(test), move(body));
  1275. }
  1276. NonnullRefPtr<WhileStatement> Parser::parse_while_statement()
  1277. {
  1278. consume(TokenType::While);
  1279. consume(TokenType::ParenOpen);
  1280. auto test = parse_expression(0);
  1281. consume(TokenType::ParenClose);
  1282. auto body = parse_statement();
  1283. return create_ast_node<WhileStatement>(move(test), move(body));
  1284. }
  1285. NonnullRefPtr<SwitchStatement> Parser::parse_switch_statement()
  1286. {
  1287. consume(TokenType::Switch);
  1288. consume(TokenType::ParenOpen);
  1289. auto determinant = parse_expression(0);
  1290. consume(TokenType::ParenClose);
  1291. consume(TokenType::CurlyOpen);
  1292. NonnullRefPtrVector<SwitchCase> cases;
  1293. while (match(TokenType::Case) || match(TokenType::Default))
  1294. cases.append(parse_switch_case());
  1295. consume(TokenType::CurlyClose);
  1296. return create_ast_node<SwitchStatement>(move(determinant), move(cases));
  1297. }
  1298. NonnullRefPtr<SwitchCase> Parser::parse_switch_case()
  1299. {
  1300. RefPtr<Expression> test;
  1301. if (consume().type() == TokenType::Case) {
  1302. test = parse_expression(0);
  1303. }
  1304. consume(TokenType::Colon);
  1305. NonnullRefPtrVector<Statement> consequent;
  1306. while (match_statement())
  1307. consequent.append(parse_statement());
  1308. return create_ast_node<SwitchCase>(move(test), move(consequent));
  1309. }
  1310. NonnullRefPtr<CatchClause> Parser::parse_catch_clause()
  1311. {
  1312. consume(TokenType::Catch);
  1313. String parameter;
  1314. if (match(TokenType::ParenOpen)) {
  1315. consume();
  1316. parameter = consume(TokenType::Identifier).value();
  1317. consume(TokenType::ParenClose);
  1318. }
  1319. auto body = parse_block_statement();
  1320. return create_ast_node<CatchClause>(parameter, move(body));
  1321. }
  1322. NonnullRefPtr<IfStatement> Parser::parse_if_statement()
  1323. {
  1324. consume(TokenType::If);
  1325. consume(TokenType::ParenOpen);
  1326. auto predicate = parse_expression(0);
  1327. consume(TokenType::ParenClose);
  1328. auto consequent = parse_statement();
  1329. RefPtr<Statement> alternate;
  1330. if (match(TokenType::Else)) {
  1331. consume(TokenType::Else);
  1332. alternate = parse_statement();
  1333. }
  1334. return create_ast_node<IfStatement>(move(predicate), move(consequent), move(alternate));
  1335. }
  1336. NonnullRefPtr<Statement> Parser::parse_for_statement()
  1337. {
  1338. auto match_for_in_of = [&]() {
  1339. return match(TokenType::In) || (match(TokenType::Identifier) && m_parser_state.m_current_token.value() == "of");
  1340. };
  1341. consume(TokenType::For);
  1342. consume(TokenType::ParenOpen);
  1343. bool in_scope = false;
  1344. RefPtr<ASTNode> init;
  1345. if (!match(TokenType::Semicolon)) {
  1346. if (match_expression()) {
  1347. init = parse_expression(0, Associativity::Right, { TokenType::In });
  1348. if (match_for_in_of())
  1349. return parse_for_in_of_statement(*init);
  1350. } else if (match_variable_declaration()) {
  1351. if (!match(TokenType::Var)) {
  1352. m_parser_state.m_let_scopes.append(NonnullRefPtrVector<VariableDeclaration>());
  1353. in_scope = true;
  1354. }
  1355. init = parse_variable_declaration(false);
  1356. if (match_for_in_of())
  1357. return parse_for_in_of_statement(*init);
  1358. } else {
  1359. syntax_error("Unexpected token in for loop");
  1360. }
  1361. }
  1362. consume(TokenType::Semicolon);
  1363. RefPtr<Expression> test;
  1364. if (!match(TokenType::Semicolon))
  1365. test = parse_expression(0);
  1366. consume(TokenType::Semicolon);
  1367. RefPtr<Expression> update;
  1368. if (!match(TokenType::ParenClose))
  1369. update = parse_expression(0);
  1370. consume(TokenType::ParenClose);
  1371. auto body = parse_statement();
  1372. if (in_scope) {
  1373. m_parser_state.m_let_scopes.take_last();
  1374. }
  1375. return create_ast_node<ForStatement>(move(init), move(test), move(update), move(body));
  1376. }
  1377. NonnullRefPtr<Statement> Parser::parse_for_in_of_statement(NonnullRefPtr<ASTNode> lhs)
  1378. {
  1379. if (lhs->is_variable_declaration()) {
  1380. auto declarations = static_cast<VariableDeclaration*>(lhs.ptr())->declarations();
  1381. if (declarations.size() > 1) {
  1382. syntax_error("multiple declarations not allowed in for..in/of");
  1383. lhs = create_ast_node<ErrorExpression>();
  1384. }
  1385. if (declarations.first().init() != nullptr) {
  1386. syntax_error("variable initializer not allowed in for..in/of");
  1387. lhs = create_ast_node<ErrorExpression>();
  1388. }
  1389. }
  1390. auto in_or_of = consume();
  1391. auto rhs = parse_expression(0);
  1392. consume(TokenType::ParenClose);
  1393. auto body = parse_statement();
  1394. if (in_or_of.type() == TokenType::In)
  1395. return create_ast_node<ForInStatement>(move(lhs), move(rhs), move(body));
  1396. return create_ast_node<ForOfStatement>(move(lhs), move(rhs), move(body));
  1397. }
  1398. NonnullRefPtr<DebuggerStatement> Parser::parse_debugger_statement()
  1399. {
  1400. consume(TokenType::Debugger);
  1401. consume_or_insert_semicolon();
  1402. return create_ast_node<DebuggerStatement>();
  1403. }
  1404. bool Parser::match(TokenType type) const
  1405. {
  1406. return m_parser_state.m_current_token.type() == type;
  1407. }
  1408. bool Parser::match_variable_declaration() const
  1409. {
  1410. switch (m_parser_state.m_current_token.type()) {
  1411. case TokenType::Var:
  1412. case TokenType::Let:
  1413. case TokenType::Const:
  1414. return true;
  1415. default:
  1416. return false;
  1417. }
  1418. }
  1419. bool Parser::match_expression() const
  1420. {
  1421. auto type = m_parser_state.m_current_token.type();
  1422. return type == TokenType::BoolLiteral
  1423. || type == TokenType::NumericLiteral
  1424. || type == TokenType::BigIntLiteral
  1425. || type == TokenType::StringLiteral
  1426. || type == TokenType::TemplateLiteralStart
  1427. || type == TokenType::NullLiteral
  1428. || type == TokenType::Identifier
  1429. || type == TokenType::New
  1430. || type == TokenType::CurlyOpen
  1431. || type == TokenType::BracketOpen
  1432. || type == TokenType::ParenOpen
  1433. || type == TokenType::Function
  1434. || type == TokenType::This
  1435. || type == TokenType::Super
  1436. || type == TokenType::RegexLiteral
  1437. || match_unary_prefixed_expression();
  1438. }
  1439. bool Parser::match_unary_prefixed_expression() const
  1440. {
  1441. auto type = m_parser_state.m_current_token.type();
  1442. return type == TokenType::PlusPlus
  1443. || type == TokenType::MinusMinus
  1444. || type == TokenType::ExclamationMark
  1445. || type == TokenType::Tilde
  1446. || type == TokenType::Plus
  1447. || type == TokenType::Minus
  1448. || type == TokenType::Typeof
  1449. || type == TokenType::Void
  1450. || type == TokenType::Delete;
  1451. }
  1452. bool Parser::match_secondary_expression(Vector<TokenType> forbidden) const
  1453. {
  1454. auto type = m_parser_state.m_current_token.type();
  1455. if (forbidden.contains_slow(type))
  1456. return false;
  1457. return type == TokenType::Plus
  1458. || type == TokenType::PlusEquals
  1459. || type == TokenType::Minus
  1460. || type == TokenType::MinusEquals
  1461. || type == TokenType::Asterisk
  1462. || type == TokenType::AsteriskEquals
  1463. || type == TokenType::Slash
  1464. || type == TokenType::SlashEquals
  1465. || type == TokenType::Percent
  1466. || type == TokenType::PercentEquals
  1467. || type == TokenType::DoubleAsterisk
  1468. || type == TokenType::DoubleAsteriskEquals
  1469. || type == TokenType::Equals
  1470. || type == TokenType::EqualsEqualsEquals
  1471. || type == TokenType::ExclamationMarkEqualsEquals
  1472. || type == TokenType::EqualsEquals
  1473. || type == TokenType::ExclamationMarkEquals
  1474. || type == TokenType::GreaterThan
  1475. || type == TokenType::GreaterThanEquals
  1476. || type == TokenType::LessThan
  1477. || type == TokenType::LessThanEquals
  1478. || type == TokenType::ParenOpen
  1479. || type == TokenType::Period
  1480. || type == TokenType::BracketOpen
  1481. || type == TokenType::PlusPlus
  1482. || type == TokenType::MinusMinus
  1483. || type == TokenType::In
  1484. || type == TokenType::Instanceof
  1485. || type == TokenType::QuestionMark
  1486. || type == TokenType::Ampersand
  1487. || type == TokenType::AmpersandEquals
  1488. || type == TokenType::Pipe
  1489. || type == TokenType::PipeEquals
  1490. || type == TokenType::Caret
  1491. || type == TokenType::CaretEquals
  1492. || type == TokenType::ShiftLeft
  1493. || type == TokenType::ShiftLeftEquals
  1494. || type == TokenType::ShiftRight
  1495. || type == TokenType::ShiftRightEquals
  1496. || type == TokenType::UnsignedShiftRight
  1497. || type == TokenType::UnsignedShiftRightEquals
  1498. || type == TokenType::DoubleAmpersand
  1499. || type == TokenType::DoublePipe
  1500. || type == TokenType::DoubleQuestionMark;
  1501. }
  1502. bool Parser::match_statement() const
  1503. {
  1504. auto type = m_parser_state.m_current_token.type();
  1505. return match_expression()
  1506. || type == TokenType::Function
  1507. || type == TokenType::Return
  1508. || type == TokenType::Let
  1509. || type == TokenType::Class
  1510. || type == TokenType::Do
  1511. || type == TokenType::If
  1512. || type == TokenType::Throw
  1513. || type == TokenType::Try
  1514. || type == TokenType::While
  1515. || type == TokenType::For
  1516. || type == TokenType::Const
  1517. || type == TokenType::CurlyOpen
  1518. || type == TokenType::Switch
  1519. || type == TokenType::Break
  1520. || type == TokenType::Continue
  1521. || type == TokenType::Var
  1522. || type == TokenType::Debugger
  1523. || type == TokenType::Semicolon;
  1524. }
  1525. bool Parser::match_identifier_name() const
  1526. {
  1527. return m_parser_state.m_current_token.is_identifier_name();
  1528. }
  1529. bool Parser::match_property_key() const
  1530. {
  1531. auto type = m_parser_state.m_current_token.type();
  1532. return match_identifier_name()
  1533. || type == TokenType::BracketOpen
  1534. || type == TokenType::StringLiteral
  1535. || type == TokenType::NumericLiteral
  1536. || type == TokenType::BigIntLiteral;
  1537. }
  1538. bool Parser::done() const
  1539. {
  1540. return match(TokenType::Eof);
  1541. }
  1542. Token Parser::consume()
  1543. {
  1544. auto old_token = m_parser_state.m_current_token;
  1545. m_parser_state.m_current_token = m_parser_state.m_lexer.next();
  1546. return old_token;
  1547. }
  1548. void Parser::consume_or_insert_semicolon()
  1549. {
  1550. // Semicolon was found and will be consumed
  1551. if (match(TokenType::Semicolon)) {
  1552. consume();
  1553. return;
  1554. }
  1555. // Insert semicolon if...
  1556. // ...token is preceded by one or more newlines
  1557. if (m_parser_state.m_current_token.trivia().contains('\n'))
  1558. return;
  1559. // ...token is a closing curly brace
  1560. if (match(TokenType::CurlyClose))
  1561. return;
  1562. // ...token is eof
  1563. if (match(TokenType::Eof))
  1564. return;
  1565. // No rule for semicolon insertion applies -> syntax error
  1566. expected("Semicolon");
  1567. }
  1568. Token Parser::consume(TokenType expected_type)
  1569. {
  1570. if (!match(expected_type)) {
  1571. expected(Token::name(expected_type));
  1572. }
  1573. return consume();
  1574. }
  1575. void Parser::expected(const char* what)
  1576. {
  1577. syntax_error(String::format("Unexpected token %s. Expected %s", m_parser_state.m_current_token.name(), what));
  1578. }
  1579. void Parser::syntax_error(const String& message, size_t line, size_t column)
  1580. {
  1581. if (line == 0 || column == 0) {
  1582. line = m_parser_state.m_current_token.line_number();
  1583. column = m_parser_state.m_current_token.line_column();
  1584. }
  1585. m_parser_state.m_errors.append({ message, line, column });
  1586. }
  1587. void Parser::save_state()
  1588. {
  1589. m_saved_state.append(m_parser_state);
  1590. }
  1591. void Parser::load_state()
  1592. {
  1593. ASSERT(!m_saved_state.is_empty());
  1594. m_parser_state = m_saved_state.take_last();
  1595. }
  1596. }