Parser.cpp 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142
  1. /*
  2. * Copyright (c) 2021, Itamar S. <itamar8910@gmail.com>
  3. * Copyright (c) 2023, Volodymyr V. <vvmposeydon@gmail.com>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #include "Parser.h"
  8. #include "AST.h"
  9. #include <LibGLSL/Lexer.h>
  10. namespace GLSL {
  11. Parser::Parser(Vector<Token> tokens, String const& filename)
  12. : m_filename(move(filename))
  13. , m_tokens(move(tokens))
  14. {
  15. }
  16. ErrorOr<NonnullRefPtr<TranslationUnit>> Parser::parse()
  17. {
  18. if (m_tokens.is_empty())
  19. return create_root_ast_node({}, {});
  20. auto unit = create_root_ast_node(m_tokens.first().start(), m_tokens.last().end());
  21. unit->set_declarations(TRY(parse_declarations_in_translation_unit(*unit)));
  22. return unit;
  23. }
  24. bool Parser::eof() const
  25. {
  26. return m_state.token_index >= m_tokens.size();
  27. }
  28. void Parser::print_tokens() const
  29. {
  30. for (auto& token : m_tokens) {
  31. outln("{}", token.to_string());
  32. }
  33. }
  34. ErrorOr<Optional<Parser::DeclarationType>> Parser::match_declaration_in_translation_unit()
  35. {
  36. if (TRY(match_variable_declaration()))
  37. return DeclarationType::Variable;
  38. if (TRY(match_function_declaration()))
  39. return DeclarationType::Function;
  40. if (TRY(match_struct_declaration()))
  41. return DeclarationType::Struct;
  42. return Optional<DeclarationType>();
  43. }
  44. ErrorOr<bool> Parser::match_struct_declaration()
  45. {
  46. save_state();
  47. ScopeGuard state_guard = [this] { load_state(); };
  48. if (!match_keyword("struct"sv))
  49. return false;
  50. TRY(consume(Token::Type::Keyword));
  51. if (!match(Token::Type::Identifier))
  52. return false;
  53. TRY(consume(Token::Type::Identifier));
  54. return match(Token::Type::LeftCurly);
  55. }
  56. ErrorOr<bool> Parser::match_function_declaration()
  57. {
  58. save_state();
  59. ScopeGuard state_guard = [this] { load_state(); };
  60. if (!TRY(match_type()))
  61. return false;
  62. VERIFY(m_root_node);
  63. (void)parse_type(get_dummy_node());
  64. if (!TRY(match_name()))
  65. return false;
  66. (void)parse_name(get_dummy_node());
  67. if (!peek(Token::Type::LeftParen).has_value())
  68. return false;
  69. TRY(consume());
  70. while (TRY(consume()).type() != Token::Type::RightParen && !eof())
  71. ;
  72. if (peek(Token::Type::Semicolon).has_value() || peek(Token::Type::LeftCurly).has_value())
  73. return true;
  74. return false;
  75. }
  76. ErrorOr<bool> Parser::match_variable_declaration()
  77. {
  78. save_state();
  79. ScopeGuard state_guard = [this] { load_state(); };
  80. if (!TRY(match_type())) {
  81. return false;
  82. }
  83. VERIFY(m_root_node);
  84. (void)parse_type(get_dummy_node());
  85. // Identifier
  86. if (!TRY(match_name()))
  87. return false;
  88. (void)TRY(parse_name(get_dummy_node()));
  89. while (!eof() && (peek().type() == Token::Type::LeftBracket)) {
  90. TRY(consume(Token::Type::LeftBracket));
  91. if (match(Token::Type::Integer)) {
  92. TRY(consume(Token::Type::Integer));
  93. }
  94. if (!match(Token::Type::RightBracket)) {
  95. TRY(error("No closing right bracket"sv));
  96. return false;
  97. }
  98. TRY(consume(Token::Type::RightBracket));
  99. }
  100. if (match(Token::Type::Equals)) {
  101. TRY(consume(Token::Type::Equals));
  102. if (!TRY(match_expression())) {
  103. TRY(error("initial value of variable is not an expression"sv));
  104. return false;
  105. }
  106. return true;
  107. }
  108. return match(Token::Type::Semicolon);
  109. }
  110. ErrorOr<bool> Parser::match_block_statement()
  111. {
  112. return peek().type() == Token::Type::LeftCurly;
  113. }
  114. ErrorOr<bool> Parser::match_expression()
  115. {
  116. return TRY(match_name())
  117. || match_unary_op()
  118. || match(Token::Type::LeftParen)
  119. || TRY(match_boolean_literal())
  120. || TRY(match_numeric_literal())
  121. || TRY(match_string_literal());
  122. }
  123. ErrorOr<bool> Parser::match_name()
  124. {
  125. auto type = peek().type();
  126. return type == Token::Type::Identifier || type == Token::Type::KnownType;
  127. }
  128. ErrorOr<bool> Parser::match_string_literal()
  129. {
  130. return match(Token::Type::DoubleQuotedString) || match(Token::Type::SingleQuotedString);
  131. }
  132. ErrorOr<bool> Parser::match_numeric_literal()
  133. {
  134. return match(Token::Type::Float) || match(Token::Type::Integer);
  135. }
  136. ErrorOr<bool> Parser::match_boolean_literal()
  137. {
  138. auto token = peek();
  139. if (token.type() != Token::Type::Keyword)
  140. return false;
  141. auto text = token.text();
  142. return text == "true" || text == "false";
  143. }
  144. ErrorOr<bool> Parser::match_type()
  145. {
  146. save_state();
  147. ScopeGuard state_guard = [this] { load_state(); };
  148. if (match_storage_qualifier())
  149. TRY(consume_storage_qualifier());
  150. if (!TRY(match_name()))
  151. return false;
  152. return true;
  153. }
  154. ErrorOr<Vector<NonnullRefPtr<Declaration const>>> Parser::parse_declarations_in_translation_unit(ASTNode const& parent)
  155. {
  156. Vector<NonnullRefPtr<Declaration const>> declarations;
  157. while (!eof()) {
  158. auto declaration = TRY(parse_single_declaration_in_translation_unit(parent));
  159. if (declaration) {
  160. declarations.append(declaration.release_nonnull());
  161. } else {
  162. TRY(error("unexpected token"sv));
  163. TRY(consume());
  164. }
  165. }
  166. return declarations;
  167. }
  168. ErrorOr<RefPtr<Declaration const>> Parser::parse_single_declaration_in_translation_unit(ASTNode const& parent)
  169. {
  170. while (!eof()) {
  171. if (match_preprocessor()) {
  172. TRY(consume_preprocessor());
  173. continue;
  174. }
  175. auto declaration = TRY(match_declaration_in_translation_unit());
  176. if (declaration.has_value()) {
  177. return parse_declaration(parent, declaration.value());
  178. }
  179. return nullptr;
  180. }
  181. return nullptr;
  182. }
  183. ErrorOr<NonnullRefPtr<Declaration const>> Parser::parse_declaration(ASTNode const& parent, DeclarationType declaration_type)
  184. {
  185. switch (declaration_type) {
  186. case DeclarationType::Function:
  187. return parse_function_declaration(parent);
  188. case DeclarationType::Variable:
  189. return parse_variable_declaration(parent);
  190. case DeclarationType::Struct:
  191. return parse_struct_declaration(parent);
  192. default:
  193. TRY(error("unexpected declaration type"sv));
  194. return create_ast_node<InvalidDeclaration>(parent, position(), position());
  195. }
  196. }
  197. ErrorOr<NonnullRefPtr<StructDeclaration const>> Parser::parse_struct_declaration(ASTNode const& parent)
  198. {
  199. TRY(consume_keyword("struct"sv));
  200. auto decl = create_ast_node<StructDeclaration>(parent, position(), {});
  201. decl->set_name(TRY(parse_name(*decl)));
  202. TRY(consume(Token::Type::LeftCurly));
  203. while (!eof() && peek().type() != Token::Type::RightCurly) {
  204. decl->set_members(TRY(parse_struct_members(*decl)));
  205. }
  206. TRY(consume(Token::Type::RightCurly));
  207. TRY(consume(Token::Type::Semicolon));
  208. decl->set_end(position());
  209. return decl;
  210. }
  211. ErrorOr<Vector<NonnullRefPtr<Declaration const>>> Parser::parse_struct_members(StructDeclaration& parent)
  212. {
  213. Vector<NonnullRefPtr<Declaration const>> members;
  214. while (!eof() && peek().type() != Token::Type::RightCurly) {
  215. auto member = TRY(parse_variable_declaration(parent));
  216. members.append(move(member));
  217. }
  218. return members;
  219. }
  220. ErrorOr<NonnullRefPtr<FunctionDeclaration const>> Parser::parse_function_declaration(ASTNode const& parent)
  221. {
  222. auto func = create_ast_node<FunctionDeclaration>(parent, position(), {});
  223. func->set_return_type(TRY(parse_type(*func)));
  224. func->set_name(TRY(parse_name(*func)));
  225. TRY(consume(Token::Type::LeftParen));
  226. func->set_parameters(TRY(parse_parameter_list(*func)));
  227. TRY(consume(Token::Type::RightParen));
  228. RefPtr<FunctionDefinition const> body;
  229. Position func_end {};
  230. if (peek(Token::Type::LeftCurly).has_value()) {
  231. body = TRY(parse_function_definition(*func));
  232. func_end = body->end();
  233. } else {
  234. func_end = position();
  235. TRY(consume(Token::Type::Semicolon));
  236. }
  237. func->set_definition(move(body));
  238. func->set_end(func_end);
  239. return func;
  240. }
  241. ErrorOr<Vector<NonnullRefPtr<Parameter const>>> Parser::parse_parameter_list(ASTNode const& parent)
  242. {
  243. Vector<NonnullRefPtr<Parameter const>> parameters;
  244. while (peek().type() != Token::Type::RightParen && !eof()) {
  245. auto type = TRY(parse_type(parent));
  246. RefPtr<Name const> name;
  247. if (TRY(match_name()))
  248. name = TRY(parse_name(parent));
  249. auto param = create_ast_node<Parameter>(parent, type->start(), !name.is_null() ? name->end() : type->end(), name);
  250. const_cast<Type&>(*type).set_parent(*param.ptr());
  251. param->set_type(move(type));
  252. parameters.append(move(param));
  253. if (peek(Token::Type::Comma).has_value())
  254. TRY(consume(Token::Type::Comma));
  255. }
  256. return parameters;
  257. }
  258. ErrorOr<NonnullRefPtr<FunctionDefinition const>> Parser::parse_function_definition(ASTNode const& parent)
  259. {
  260. auto func = create_ast_node<FunctionDefinition>(parent, position(), {});
  261. TRY(consume(Token::Type::LeftCurly));
  262. while (!eof() && peek().type() != Token::Type::RightCurly) {
  263. func->add_statement(TRY(parse_statement(func)));
  264. }
  265. func->set_end(position());
  266. TRY(consume(Token::Type::RightCurly));
  267. return func;
  268. }
  269. ErrorOr<NonnullRefPtr<VariableDeclaration const>> Parser::parse_variable_declaration(ASTNode const& parent, bool expect_semicolon)
  270. {
  271. auto var = create_ast_node<VariableDeclaration>(parent, position(), {});
  272. if (!TRY(match_variable_declaration())) {
  273. TRY(error("unexpected token for variable type"sv));
  274. var->set_end(position());
  275. return var;
  276. }
  277. var->set_type(TRY(parse_type(var)));
  278. auto name = TRY(parse_name(*var, true));
  279. RefPtr<Expression const> initial_value;
  280. if (match(Token::Type::Equals)) {
  281. TRY(consume(Token::Type::Equals));
  282. initial_value = TRY(parse_expression(var));
  283. }
  284. if (expect_semicolon)
  285. TRY(consume(Token::Type::Semicolon));
  286. var->set_end(position());
  287. var->set_name(name);
  288. var->set_initial_value(move(initial_value));
  289. return var;
  290. }
  291. ErrorOr<NonnullRefPtr<Statement const>> Parser::parse_statement(ASTNode const& parent)
  292. {
  293. bool should_consume_semicolon = true;
  294. RefPtr<Statement const> result;
  295. if (TRY(match_block_statement())) {
  296. should_consume_semicolon = false;
  297. result = TRY(parse_block_statement(parent));
  298. } else if (TRY(match_variable_declaration())) {
  299. result = TRY(parse_variable_declaration(parent, false));
  300. } else if (TRY(match_expression())) {
  301. result = TRY(parse_expression(parent));
  302. } else if (match_keyword("return"sv)) {
  303. result = TRY(parse_return_statement(parent));
  304. } else if (match_keyword("discard"sv)) {
  305. auto start = position();
  306. TRY(consume());
  307. result = create_ast_node<DiscardStatement>(parent, start, position());
  308. } else if (match_keyword("for"sv)) {
  309. should_consume_semicolon = false;
  310. result = TRY(parse_for_statement(parent));
  311. } else if (match_keyword("if"sv)) {
  312. should_consume_semicolon = false;
  313. result = TRY(parse_if_statement(parent));
  314. } else {
  315. TRY(error("unexpected statement type"sv));
  316. should_consume_semicolon = false;
  317. TRY(consume());
  318. return create_ast_node<InvalidStatement>(parent, position(), position());
  319. }
  320. if (should_consume_semicolon)
  321. TRY(consume(Token::Type::Semicolon));
  322. return result.release_nonnull();
  323. }
  324. ErrorOr<NonnullRefPtr<BlockStatement const>> Parser::parse_block_statement(ASTNode const& parent)
  325. {
  326. auto block_statement = create_ast_node<BlockStatement>(parent, position(), {});
  327. TRY(consume(Token::Type::LeftCurly));
  328. while (!eof() && peek().type() != Token::Type::RightCurly) {
  329. block_statement->add_statement(TRY(parse_statement(*block_statement)));
  330. }
  331. TRY(consume(Token::Type::RightCurly));
  332. block_statement->set_end(position());
  333. return block_statement;
  334. }
  335. ErrorOr<NonnullRefPtr<IfStatement const>> Parser::parse_if_statement(ASTNode const& parent)
  336. {
  337. auto if_statement = create_ast_node<IfStatement>(parent, position(), {});
  338. TRY(consume_keyword("if"sv));
  339. TRY(consume(Token::Type::LeftParen));
  340. if_statement->set_predicate(TRY(parse_expression(*if_statement)));
  341. TRY(consume(Token::Type::RightParen));
  342. if_statement->set_then_statement(TRY(parse_statement(*if_statement)));
  343. if (match_keyword("else"sv)) {
  344. TRY(consume(Token::Type::Keyword));
  345. if_statement->set_else_statement(TRY(parse_statement(*if_statement)));
  346. if_statement->set_end(if_statement->else_statement()->end());
  347. } else {
  348. if_statement->set_end(if_statement->then_statement()->end());
  349. }
  350. return if_statement;
  351. }
  352. ErrorOr<NonnullRefPtr<ForStatement const>> Parser::parse_for_statement(ASTNode const& parent)
  353. {
  354. auto for_statement = create_ast_node<ForStatement>(parent, position(), {});
  355. TRY(consume_keyword("for"sv));
  356. TRY(consume(Token::Type::LeftParen));
  357. if (peek().type() != Token::Type::Semicolon)
  358. for_statement->set_init(TRY(parse_variable_declaration(*for_statement, false)));
  359. TRY(consume(Token::Type::Semicolon));
  360. if (peek().type() != Token::Type::Semicolon)
  361. for_statement->set_test(TRY(parse_expression(*for_statement)));
  362. TRY(consume(Token::Type::Semicolon));
  363. if (peek().type() != Token::Type::RightParen)
  364. for_statement->set_update(TRY(parse_expression(*for_statement)));
  365. TRY(consume(Token::Type::RightParen));
  366. for_statement->set_body(TRY(parse_statement(*for_statement)));
  367. for_statement->set_end(for_statement->body()->end());
  368. return for_statement;
  369. }
  370. ErrorOr<NonnullRefPtr<ReturnStatement const>> Parser::parse_return_statement(ASTNode const& parent)
  371. {
  372. auto return_statement = create_ast_node<ReturnStatement>(parent, position(), {});
  373. TRY(consume_keyword("return"sv));
  374. if (!peek(Token::Type::Semicolon).has_value()) {
  375. return_statement->set_value(TRY(parse_expression(*return_statement)));
  376. }
  377. return_statement->set_end(position());
  378. return return_statement;
  379. }
  380. HashMap<BinaryOp, int> s_operator_precedence = {
  381. { BinaryOp::Assignment, 1 },
  382. { BinaryOp::AdditionAssignment, 1 },
  383. { BinaryOp::SubtractionAssignment, 1 },
  384. { BinaryOp::MultiplicationAssignment, 1 },
  385. { BinaryOp::DivisionAssignment, 1 },
  386. { BinaryOp::ModuloAssignment, 1 },
  387. { BinaryOp::AndAssignment, 1 },
  388. { BinaryOp::XorAssignment, 1 },
  389. { BinaryOp::OrAssignment, 1 },
  390. { BinaryOp::LeftShiftAssignment, 1 },
  391. { BinaryOp::RightShiftAssignment, 1 },
  392. { BinaryOp::LogicalOr, 2 },
  393. { BinaryOp::LogicalXor, 3 },
  394. { BinaryOp::LogicalAnd, 4 },
  395. { BinaryOp::BitwiseOr, 5 },
  396. { BinaryOp::BitwiseXor, 6 },
  397. { BinaryOp::BitwiseAnd, 7 },
  398. { BinaryOp::EqualsEquals, 8 },
  399. { BinaryOp::NotEqual, 8 },
  400. { BinaryOp::LessThan, 9 },
  401. { BinaryOp::LessThanEquals, 9 },
  402. { BinaryOp::GreaterThan, 9 },
  403. { BinaryOp::GreaterThanEquals, 9 },
  404. { BinaryOp::LeftShift, 10 },
  405. { BinaryOp::RightShift, 10 },
  406. { BinaryOp::Addition, 11 },
  407. { BinaryOp::Subtraction, 11 },
  408. { BinaryOp::Multiplication, 12 },
  409. { BinaryOp::Division, 12 },
  410. { BinaryOp::Modulo, 12 },
  411. };
  412. HashMap<BinaryOp, Parser::Associativity> Parser::s_operator_associativity = {
  413. { BinaryOp::Assignment, Associativity::RightToLeft },
  414. { BinaryOp::AdditionAssignment, Associativity::RightToLeft },
  415. { BinaryOp::SubtractionAssignment, Associativity::RightToLeft },
  416. { BinaryOp::MultiplicationAssignment, Associativity::RightToLeft },
  417. { BinaryOp::DivisionAssignment, Associativity::RightToLeft },
  418. { BinaryOp::ModuloAssignment, Associativity::RightToLeft },
  419. { BinaryOp::AndAssignment, Associativity::RightToLeft },
  420. { BinaryOp::XorAssignment, Associativity::RightToLeft },
  421. { BinaryOp::OrAssignment, Associativity::RightToLeft },
  422. { BinaryOp::LeftShiftAssignment, Associativity::RightToLeft },
  423. { BinaryOp::RightShiftAssignment, Associativity::RightToLeft },
  424. { BinaryOp::LogicalOr, Associativity::LeftToRight },
  425. { BinaryOp::LogicalXor, Associativity::LeftToRight },
  426. { BinaryOp::LogicalAnd, Associativity::LeftToRight },
  427. { BinaryOp::BitwiseOr, Associativity::LeftToRight },
  428. { BinaryOp::BitwiseXor, Associativity::LeftToRight },
  429. { BinaryOp::BitwiseAnd, Associativity::LeftToRight },
  430. { BinaryOp::EqualsEquals, Associativity::LeftToRight },
  431. { BinaryOp::NotEqual, Associativity::LeftToRight },
  432. { BinaryOp::LessThan, Associativity::LeftToRight },
  433. { BinaryOp::LessThanEquals, Associativity::LeftToRight },
  434. { BinaryOp::GreaterThan, Associativity::LeftToRight },
  435. { BinaryOp::GreaterThanEquals, Associativity::LeftToRight },
  436. { BinaryOp::LeftShift, Associativity::LeftToRight },
  437. { BinaryOp::RightShift, Associativity::LeftToRight },
  438. { BinaryOp::Addition, Associativity::LeftToRight },
  439. { BinaryOp::Subtraction, Associativity::LeftToRight },
  440. { BinaryOp::Multiplication, Associativity::LeftToRight },
  441. { BinaryOp::Division, Associativity::LeftToRight },
  442. { BinaryOp::Modulo, Associativity::LeftToRight },
  443. };
  444. ErrorOr<NonnullRefPtr<Expression const>> Parser::parse_expression(ASTNode const& parent, int min_precedence, Associativity associativity)
  445. {
  446. auto start_pos = position();
  447. auto lhs = TRY(parse_unary_expression(get_dummy_node()));
  448. while (match_binary_op()) {
  449. auto op = TRY(peek_binary_op());
  450. auto maybe_op_precedence = s_operator_precedence.get(op);
  451. VERIFY(maybe_op_precedence.has_value());
  452. auto op_precedence = maybe_op_precedence.value();
  453. if (op_precedence < min_precedence || (op_precedence == min_precedence && associativity == Associativity::LeftToRight))
  454. break;
  455. TRY(consume());
  456. auto maybe_op_associativity = s_operator_associativity.get(op);
  457. VERIFY(maybe_op_associativity.has_value());
  458. auto op_associativity = maybe_op_associativity.value();
  459. auto expr = create_ast_node<BinaryExpression>(parent, start_pos, {});
  460. const_cast<Expression&>(*lhs).set_parent(expr);
  461. expr->set_lhs(move(lhs));
  462. expr->set_op(op);
  463. expr->set_rhs(TRY(parse_expression(expr, op_precedence, op_associativity)));
  464. expr->set_end(position());
  465. lhs = move(expr);
  466. }
  467. return lhs;
  468. }
  469. // NOTE: this function should parse everything with precedence of prefix increment and above, e.g. ++/--/!/~, function call, member expressions and expressions in parentheses
  470. ErrorOr<NonnullRefPtr<Expression const>> Parser::parse_unary_expression(const GLSL::ASTNode& parent)
  471. {
  472. if (match(Token::Type::LeftParen)) {
  473. TRY(consume(Token::Type::LeftParen));
  474. auto expr = TRY(parse_expression(parent));
  475. TRY(consume(Token::Type::RightParen));
  476. return expr;
  477. }
  478. if (TRY(match_boolean_literal()))
  479. return parse_boolean_literal(parent);
  480. if (TRY(match_numeric_literal()))
  481. return parse_numeric_literal(parent);
  482. if (TRY(match_string_literal()))
  483. return parse_string_literal(parent);
  484. if (TRY(match_name())) {
  485. NonnullRefPtr<Expression const> lhs = TRY(parse_name(parent));
  486. while (true) {
  487. if (match(Token::Type::LeftParen)) {
  488. TRY(consume(Token::Type::LeftParen));
  489. auto expr = create_ast_node<FunctionCall>(parent, lhs->start(), {});
  490. auto args = TRY(parse_function_call_args(expr));
  491. const_cast<Expression&>(*lhs).set_parent(expr);
  492. expr->set_callee(move(lhs));
  493. expr->set_arguments(move(args));
  494. TRY(consume(Token::Type::RightParen));
  495. expr->set_end(position());
  496. lhs = move(expr);
  497. } else if (match(Token::Type::Dot)) {
  498. TRY(consume(Token::Type::Dot));
  499. auto expr = create_ast_node<MemberExpression>(parent, lhs->start(), {});
  500. auto rhs = TRY(parse_name(expr));
  501. const_cast<Expression&>(*lhs).set_parent(expr);
  502. expr->set_object(move(lhs));
  503. expr->set_property(move(rhs));
  504. expr->set_end(position());
  505. lhs = move(expr);
  506. } else if (match(Token::Type::LeftBracket)) {
  507. TRY(consume(Token::Type::LeftBracket));
  508. auto expr = create_ast_node<ArrayElementExpression>(parent, lhs->start(), {});
  509. auto index = TRY(parse_expression(expr));
  510. TRY(consume(Token::Type::RightBracket));
  511. const_cast<Expression&>(*lhs).set_parent(expr);
  512. expr->set_array(move(lhs));
  513. expr->set_index(move(index));
  514. expr->set_end(position());
  515. lhs = move(expr);
  516. } else if (match(Token::Type::PlusPlus) || match(Token::Type::MinusMinus)) {
  517. auto op = TRY(consume_unary_op());
  518. auto expr = create_ast_node<UnaryExpression>(parent, lhs->start(), position());
  519. const_cast<Expression&>(*lhs).set_parent(expr);
  520. expr->set_lhs(move(lhs));
  521. expr->set_op(op);
  522. expr->set_is_postfix(true);
  523. lhs = move(expr);
  524. } else {
  525. break;
  526. }
  527. }
  528. return lhs;
  529. }
  530. if (match_unary_op()) {
  531. auto expr = create_ast_node<UnaryExpression>(parent, position(), {});
  532. auto op = TRY(consume_unary_op());
  533. auto lhs = TRY(parse_unary_expression(expr));
  534. expr->set_lhs(move(lhs));
  535. expr->set_op(op);
  536. expr->set_end(position());
  537. return expr;
  538. }
  539. TRY(error(TRY(String::formatted("unable to parse unary expression starting with {}", TRY(peek().type_as_string())))));
  540. return create_ast_node<InvalidExpression>(parent, position(), position());
  541. }
  542. ErrorOr<Vector<NonnullRefPtr<Expression const>>> Parser::parse_function_call_args(ASTNode const& parent)
  543. {
  544. Vector<NonnullRefPtr<Expression const>> result;
  545. while (!match(Token::Type::RightParen)) {
  546. auto arg = TRY(parse_expression(parent));
  547. result.append(move(arg));
  548. if (!match(Token::Type::RightParen))
  549. TRY(consume(Token::Type::Comma));
  550. }
  551. return result;
  552. }
  553. ErrorOr<NonnullRefPtr<Expression const>> Parser::parse_boolean_literal(ASTNode const& parent)
  554. {
  555. auto token = TRY(consume(Token::Type::Keyword));
  556. auto text = token.text();
  557. bool value = (text == "true");
  558. return create_ast_node<BooleanLiteral>(parent, token.start(), token.end(), value);
  559. }
  560. ErrorOr<NonnullRefPtr<Expression const>> Parser::parse_numeric_literal(GLSL::ASTNode const& parent)
  561. {
  562. auto token = TRY(consume());
  563. auto text = token.text();
  564. return create_ast_node<NumericLiteral>(parent, token.start(), token.end(), text);
  565. }
  566. ErrorOr<NonnullRefPtr<Expression const>> Parser::parse_string_literal(ASTNode const& parent)
  567. {
  568. Optional<size_t> start_token_index;
  569. Optional<size_t> end_token_index;
  570. while (!eof()) {
  571. auto token = peek();
  572. if (token.type() != Token::Type::DoubleQuotedString && token.type() != Token::Type::SingleQuotedString && token.type() != Token::Type::EscapeSequence) {
  573. VERIFY(start_token_index.has_value());
  574. end_token_index = m_state.token_index - 1;
  575. break;
  576. }
  577. if (!start_token_index.has_value())
  578. start_token_index = m_state.token_index;
  579. TRY(consume());
  580. }
  581. // String was not terminated
  582. if (!end_token_index.has_value()) {
  583. end_token_index = m_tokens.size() - 1;
  584. }
  585. VERIFY(start_token_index.has_value());
  586. VERIFY(end_token_index.has_value());
  587. Token start_token = m_tokens[start_token_index.value()];
  588. Token end_token = m_tokens[end_token_index.value()];
  589. auto text = TRY(text_in_range(start_token.start(), end_token.end()));
  590. auto string_literal = create_ast_node<StringLiteral>(parent, start_token.start(), end_token.end());
  591. string_literal->set_value(move(text));
  592. return string_literal;
  593. }
  594. ErrorOr<NonnullRefPtr<Name const>> Parser::parse_name(ASTNode const& parent, bool allow_sized_name)
  595. {
  596. NonnullRefPtr<Name> name_node = create_ast_node<Name>(parent, position(), {});
  597. if (peek().type() == Token::Type::Identifier || peek().type() == Token::Type::KnownType) {
  598. auto token = TRY(consume());
  599. name_node->set_name(token.text());
  600. name_node->set_end(position());
  601. } else {
  602. TRY(error("expected keyword or identifier while trying to parse name"sv));
  603. name_node->set_end(position());
  604. return name_node;
  605. }
  606. if (peek().type() == Token::Type::LeftBracket && allow_sized_name) {
  607. NonnullRefPtr<SizedName> sized_name = create_ast_node<SizedName>(parent, name_node->start(), {});
  608. sized_name->set_name(name_node->name());
  609. while (peek().type() == Token::Type::LeftBracket) {
  610. TRY(consume(Token::Type::LeftBracket));
  611. StringView size = "0"sv;
  612. if (peek().type() == Token::Type::Integer)
  613. size = TRY(consume(Token::Type::Integer)).text();
  614. sized_name->append_dimension(size);
  615. TRY(consume(Token::Type::RightBracket));
  616. }
  617. name_node->set_end(position());
  618. name_node = sized_name;
  619. }
  620. name_node->set_end(previous_token_end());
  621. return name_node;
  622. }
  623. ErrorOr<NonnullRefPtr<Type const>> Parser::parse_type(ASTNode const& parent)
  624. {
  625. auto type = create_ast_node<Type>(parent, position(), {});
  626. Vector<StorageTypeQualifier> storage_qualifiers;
  627. while (match_storage_qualifier()) {
  628. storage_qualifiers.append(TRY(consume_storage_qualifier()));
  629. }
  630. type->set_storage_qualifiers(move(storage_qualifiers));
  631. if (match_keyword("struct"sv)) {
  632. TRY(consume(Token::Type::Keyword)); // Consume struct prefix
  633. }
  634. if (!TRY(match_name())) {
  635. type->set_end(position());
  636. TRY(error(TRY(String::formatted("expected name instead of: {}", peek().text()))));
  637. return type;
  638. }
  639. type->set_name(TRY(parse_name(*type)));
  640. type->set_end(previous_token_end());
  641. return type;
  642. }
  643. bool Parser::match_unary_op()
  644. {
  645. return match(Token::Type::Plus)
  646. || match(Token::Type::Minus)
  647. || match(Token::Type::PlusPlus)
  648. || match(Token::Type::MinusMinus)
  649. || match(Token::Type::ExclamationMark)
  650. || match(Token::Type::Tilde);
  651. }
  652. ErrorOr<UnaryOp> Parser::consume_unary_op()
  653. {
  654. switch (TRY(consume()).type()) {
  655. case Token::Type::Plus:
  656. return UnaryOp::Plus;
  657. case Token::Type::Minus:
  658. return UnaryOp::Minus;
  659. case Token::Type::PlusPlus:
  660. return UnaryOp::PlusPlus;
  661. case Token::Type::MinusMinus:
  662. return UnaryOp::MinusMinus;
  663. case Token::Type::ExclamationMark:
  664. return UnaryOp::Not;
  665. case Token::Type::Tilde:
  666. return UnaryOp::BitwiseNot;
  667. default:
  668. VERIFY_NOT_REACHED();
  669. }
  670. }
  671. bool Parser::match_binary_op()
  672. {
  673. return match(Token::Type::Plus)
  674. || match(Token::Type::Minus)
  675. || match(Token::Type::Asterisk)
  676. || match(Token::Type::Slash)
  677. || match(Token::Type::Percent)
  678. || match(Token::Type::And)
  679. || match(Token::Type::Pipe)
  680. || match(Token::Type::Caret)
  681. || match(Token::Type::AndAnd)
  682. || match(Token::Type::PipePipe)
  683. || match(Token::Type::CaretCaret)
  684. || match(Token::Type::LessLess)
  685. || match(Token::Type::GreaterGreater)
  686. || match(Token::Type::Less)
  687. || match(Token::Type::LessEquals)
  688. || match(Token::Type::Greater)
  689. || match(Token::Type::GreaterEquals)
  690. || match(Token::Type::EqualsEquals)
  691. || match(Token::Type::ExclamationMarkEquals)
  692. || match(Token::Type::Equals)
  693. || match(Token::Type::PlusEquals)
  694. || match(Token::Type::MinusEquals)
  695. || match(Token::Type::AsteriskEquals)
  696. || match(Token::Type::SlashEquals)
  697. || match(Token::Type::PercentEquals)
  698. || match(Token::Type::LessLessEquals)
  699. || match(Token::Type::GreaterGreaterEquals)
  700. || match(Token::Type::AndEquals)
  701. || match(Token::Type::PipeEquals)
  702. || match(Token::Type::CaretEquals);
  703. }
  704. ErrorOr<BinaryOp> Parser::peek_binary_op()
  705. {
  706. switch (peek().type()) {
  707. case Token::Type::Plus:
  708. return BinaryOp::Addition;
  709. case Token::Type::Minus:
  710. return BinaryOp::Subtraction;
  711. case Token::Type::Asterisk:
  712. return BinaryOp::Multiplication;
  713. case Token::Type::Slash:
  714. return BinaryOp::Division;
  715. case Token::Type::Percent:
  716. return BinaryOp::Modulo;
  717. case Token::Type::And:
  718. return BinaryOp::BitwiseAnd;
  719. case Token::Type::Pipe:
  720. return BinaryOp::BitwiseOr;
  721. case Token::Type::Caret:
  722. return BinaryOp::BitwiseXor;
  723. case Token::Type::AndAnd:
  724. return BinaryOp::LogicalAnd;
  725. case Token::Type::PipePipe:
  726. return BinaryOp::LogicalOr;
  727. case Token::Type::CaretCaret:
  728. return BinaryOp::LogicalXor;
  729. case Token::Type::LessLess:
  730. return BinaryOp::LeftShift;
  731. case Token::Type::GreaterGreater:
  732. return BinaryOp::RightShift;
  733. case Token::Type::Less:
  734. return BinaryOp::LessThan;
  735. case Token::Type::LessEquals:
  736. return BinaryOp::LessThanEquals;
  737. case Token::Type::Greater:
  738. return BinaryOp::GreaterThan;
  739. case Token::Type::GreaterEquals:
  740. return BinaryOp::GreaterThanEquals;
  741. case Token::Type::EqualsEquals:
  742. return BinaryOp::EqualsEquals;
  743. case Token::Type::ExclamationMarkEquals:
  744. return BinaryOp::NotEqual;
  745. case Token::Type::Equals:
  746. return BinaryOp::Assignment;
  747. case Token::Type::PlusEquals:
  748. return BinaryOp::AdditionAssignment;
  749. case Token::Type::MinusEquals:
  750. return BinaryOp::SubtractionAssignment;
  751. case Token::Type::AsteriskEquals:
  752. return BinaryOp::MultiplicationAssignment;
  753. case Token::Type::SlashEquals:
  754. return BinaryOp::DivisionAssignment;
  755. case Token::Type::PercentEquals:
  756. return BinaryOp::ModuloAssignment;
  757. case Token::Type::LessLessEquals:
  758. return BinaryOp::LeftShiftAssignment;
  759. case Token::Type::GreaterGreaterEquals:
  760. return BinaryOp::RightShiftAssignment;
  761. case Token::Type::AndEquals:
  762. return BinaryOp::AndAssignment;
  763. case Token::Type::PipeEquals:
  764. return BinaryOp::OrAssignment;
  765. case Token::Type::CaretEquals:
  766. return BinaryOp::XorAssignment;
  767. default:
  768. VERIFY_NOT_REACHED();
  769. }
  770. }
  771. bool Parser::match_storage_qualifier()
  772. {
  773. return match_keyword("const"sv)
  774. || match_keyword("in"sv)
  775. || match_keyword("out"sv)
  776. || match_keyword("inout"sv)
  777. || match_keyword("centroid"sv)
  778. || match_keyword("patch"sv)
  779. || match_keyword("sample"sv)
  780. || match_keyword("uniform"sv)
  781. || match_keyword("buffer"sv)
  782. || match_keyword("shared"sv)
  783. || match_keyword("coherent"sv)
  784. || match_keyword("volatile"sv)
  785. || match_keyword("restrict"sv)
  786. || match_keyword("readonly"sv)
  787. || match_keyword("writeonly"sv)
  788. || match_keyword("subroutine"sv);
  789. }
  790. ErrorOr<StorageTypeQualifier> Parser::consume_storage_qualifier()
  791. {
  792. VERIFY(peek().type() == Token::Type::Keyword);
  793. auto keyword = MUST(consume()).text();
  794. if (keyword == "buffer")
  795. return StorageTypeQualifier::Buffer;
  796. if (keyword == "centroid")
  797. return StorageTypeQualifier::Centroid;
  798. if (keyword == "coherent")
  799. return StorageTypeQualifier::Coherent;
  800. if (keyword == "const")
  801. return StorageTypeQualifier::Const;
  802. if (keyword == "in")
  803. return StorageTypeQualifier::In;
  804. if (keyword == "inout")
  805. return StorageTypeQualifier::Inout;
  806. if (keyword == "out")
  807. return StorageTypeQualifier::Out;
  808. if (keyword == "patch")
  809. return StorageTypeQualifier::Patch;
  810. if (keyword == "readonly")
  811. return StorageTypeQualifier::Readonly;
  812. if (keyword == "restrict")
  813. return StorageTypeQualifier::Restrict;
  814. if (keyword == "sample")
  815. return StorageTypeQualifier::Sample;
  816. if (keyword == "shared")
  817. return StorageTypeQualifier::Shared;
  818. if (keyword == "subroutine")
  819. return StorageTypeQualifier::Subroutine;
  820. if (keyword == "uniform")
  821. return StorageTypeQualifier::Uniform;
  822. if (keyword == "volatile")
  823. return StorageTypeQualifier::Volatile;
  824. if (keyword == "writeonly")
  825. return StorageTypeQualifier::Writeonly;
  826. VERIFY_NOT_REACHED();
  827. }
  828. Token Parser::peek(size_t offset) const
  829. {
  830. if (m_state.token_index + offset >= m_tokens.size())
  831. return { Token::Type::EOF_TOKEN, position(), position(), {} };
  832. return m_tokens[m_state.token_index + offset];
  833. }
  834. Optional<Token> Parser::peek(Token::Type type) const
  835. {
  836. auto token = peek();
  837. if (token.type() == type)
  838. return token;
  839. return {};
  840. }
  841. bool Parser::match(Token::Type type)
  842. {
  843. return peek().type() == type;
  844. }
  845. bool Parser::match_keyword(StringView keyword)
  846. {
  847. auto token = peek();
  848. if (token.type() != Token::Type::Keyword) {
  849. return false;
  850. }
  851. if (token.text() != keyword) {
  852. return false;
  853. }
  854. return true;
  855. }
  856. bool Parser::match_preprocessor()
  857. {
  858. return match(Token::Type::PreprocessorStatement) || match(Token::Type::IncludeStatement);
  859. }
  860. ErrorOr<Token> Parser::consume()
  861. {
  862. if (eof()) {
  863. TRY(error("GLSL Parser: out of tokens"sv));
  864. return Token { Token::Type::EOF_TOKEN, position(), position(), {} };
  865. }
  866. return m_tokens[m_state.token_index++];
  867. }
  868. ErrorOr<Token> Parser::consume(Token::Type type)
  869. {
  870. auto token = TRY(consume());
  871. if (token.type() != type)
  872. TRY(error(TRY(String::formatted("expected {} at {}:{}, found: {}", Token::type_to_string(type), token.start().line, token.start().column, Token::type_to_string(token.type())))));
  873. return token;
  874. }
  875. ErrorOr<Token> Parser::consume_keyword(StringView keyword)
  876. {
  877. auto token = TRY(consume());
  878. if (token.type() != Token::Type::Keyword) {
  879. TRY(error(TRY(String::formatted("unexpected token: {}, expected Keyword", TRY(token.to_string())))));
  880. return token;
  881. }
  882. if (token.text() != keyword) {
  883. TRY(error(TRY(String::formatted("unexpected keyword: {}, expected {}", token.text(), keyword))));
  884. return token;
  885. }
  886. return token;
  887. }
  888. ErrorOr<void> Parser::consume_preprocessor()
  889. {
  890. switch (peek().type()) {
  891. case Token::Type::PreprocessorStatement:
  892. TRY(consume());
  893. break;
  894. case Token::Type::IncludeStatement:
  895. TRY(consume());
  896. TRY(consume(Token::Type::IncludePath));
  897. break;
  898. default:
  899. TRY(error("unexpected token while parsing preprocessor statement"sv));
  900. TRY(consume());
  901. }
  902. return {};
  903. }
  904. Position Parser::position() const
  905. {
  906. if (m_tokens.is_empty())
  907. return {};
  908. if (eof())
  909. return m_tokens.last().end();
  910. return peek().start();
  911. }
  912. Position Parser::previous_token_end() const
  913. {
  914. if (m_state.token_index < 1)
  915. return {};
  916. return m_tokens[m_state.token_index - 1].end();
  917. }
  918. Optional<size_t> Parser::index_of_token_at(Position pos) const
  919. {
  920. for (size_t token_index = 0; token_index < m_tokens.size(); ++token_index) {
  921. auto token = m_tokens[token_index];
  922. if (token.start() > pos || token.end() < pos)
  923. continue;
  924. return token_index;
  925. }
  926. return {};
  927. }
  928. Vector<Token> Parser::tokens_in_range(Position start, Position end) const
  929. {
  930. auto start_token_index = index_of_token_at(start);
  931. auto end_node_index = index_of_token_at(end);
  932. VERIFY(start_token_index.has_value());
  933. VERIFY(end_node_index.has_value());
  934. Vector<Token> tokens;
  935. for (size_t i = start_token_index.value(); i <= end_node_index.value(); ++i) {
  936. tokens.append(m_tokens[i]);
  937. }
  938. return tokens;
  939. }
  940. ErrorOr<String> Parser::text_in_range(Position start, Position end) const
  941. {
  942. StringBuilder builder;
  943. for (auto token : tokens_in_range(start, end)) {
  944. builder.append(token.text());
  945. }
  946. return builder.to_string();
  947. }
  948. ErrorOr<void> Parser::error(StringView message)
  949. {
  950. if (!m_saved_states.is_empty())
  951. return {};
  952. if (message.is_null() || message.is_empty())
  953. message = "<empty>"sv;
  954. String formatted_message;
  955. if (m_state.token_index >= m_tokens.size()) {
  956. formatted_message = TRY(String::formatted("GLSL Parsed error on EOF.{}", message));
  957. } else {
  958. formatted_message = TRY(String::formatted("GLSL Parser error: {}. token: {} ({}:{})",
  959. message,
  960. m_state.token_index < m_tokens.size() ? m_tokens[m_state.token_index].text() : "EOF"sv,
  961. m_tokens[m_state.token_index].start().line,
  962. m_tokens[m_state.token_index].start().column));
  963. }
  964. m_errors.append(formatted_message);
  965. return {};
  966. }
  967. void Parser::save_state()
  968. {
  969. m_saved_states.append(m_state);
  970. }
  971. void Parser::load_state()
  972. {
  973. m_state = m_saved_states.take_last();
  974. }
  975. }