Changeset 246108 in webkit
- Timestamp:
- Jun 5, 2019 9:48:16 AM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r246107 r246108 1 2019-06-05 Truitt Savell <tsavell@apple.com> 2 3 Unreviewed, rolling out r246052. 4 5 Caused 3 webgpu/ failures. 6 7 Reverted changeset: 8 9 "[WHLSL] Parsing and lexing the standard library is slow" 10 https://bugs.webkit.org/show_bug.cgi?id=192890 11 https://trac.webkit.org/changeset/246052 12 1 13 2019-06-05 Michael Catanzaro <mcatanzaro@igalia.com> 2 14 -
trunk/Source/WebCore/Modules/webgpu/WHLSL/WHLSLLexer.h
r246052 r246108 47 47 { 48 48 skipWhitespaceAndComments(); 49 m_ringBuffer[0] = consumeTokenFromStream();50 m_ringBuffer[1] = consumeTokenFromStream();51 49 } 52 50 … … 180 178 Optional<Token> consumeToken() 181 179 { 182 auto result = m_ringBuffer[m_ringBufferIndex]; 183 m_ringBuffer[m_ringBufferIndex] = consumeTokenFromStream(); 184 m_ringBufferIndex = (m_ringBufferIndex + 1) % 2; 185 return result; 186 } 187 188 Optional<Token> peek() 189 { 190 return m_ringBuffer[m_ringBufferIndex]; 191 } 192 193 Optional<Token> peekFurther() 194 { 195 return m_ringBuffer[(m_ringBufferIndex + 1) % 2]; 196 } 197 198 // FIXME: We should not need this 199 // https://bugs.webkit.org/show_bug.cgi?id=198357 180 if (!m_stack.isEmpty()) 181 return m_stack.takeLast(); 182 return consumeTokenFromStream(); 183 } 184 185 void unconsumeToken(Token&& token) 186 { 187 m_stack.append(WTFMove(token)); 188 } 189 200 190 struct State { 201 Optional<Token> ringBuffer[2]; 202 unsigned ringBufferIndex; 191 Vector<Token> stack; 203 192 unsigned offset; 204 193 unsigned lineNumber; … … 207 196 State state() const 208 197 { 209 State state; 210 state.ringBuffer[0] = m_ringBuffer[0]; 211 state.ringBuffer[1] = m_ringBuffer[1]; 212 state.ringBufferIndex = m_ringBufferIndex; 213 state.offset = m_offset; 214 state.lineNumber = m_lineNumber; 215 return state; 198 return { m_stack, m_offset, m_lineNumber }; 216 199 } 217 200 218 201 void setState(const State& state) 219 202 { 220 m_ringBuffer[0] = state.ringBuffer[0]; 221 m_ringBuffer[1] = state.ringBuffer[1]; 222 m_ringBufferIndex = state.ringBufferIndex; 203 m_stack = state.stack; 223 204 m_offset = state.offset; 224 205 m_lineNumber = state.lineNumber; 225 226 206 } 227 207 228 208 void setState(State&& state) 229 209 { 230 m_ringBuffer[0] = WTFMove(state.ringBuffer[0]); 231 m_ringBuffer[1] = WTFMove(state.ringBuffer[1]); 232 m_ringBufferIndex = WTFMove(state.ringBufferIndex); 210 m_stack = WTFMove(state.stack); 233 211 m_offset = WTFMove(state.offset); 234 212 m_lineNumber = WTFMove(state.lineNumber); … … 276 254 277 255 StringView m_stringView; 278 Optional<Token> m_ringBuffer[2]; 279 unsigned m_ringBufferIndex { 0 }; 256 Vector<Token> m_stack; 280 257 unsigned m_offset { 0 }; 281 258 unsigned m_lineNumber { 0 }; -
trunk/Source/WebCore/Modules/webgpu/WHLSL/WHLSLParser.cpp
r246052 r246108 39 39 namespace WHLSL { 40 40 41 #define PARSE(name, element, ...) \42 auto name = parse##element(__VA_ARGS__); \43 if (!name) \44 return Unexpected<Error>(name.error());45 46 #define CONSUME_TYPE(name, type) \47 auto name = consumeType(Lexer::Token::Type::type); \48 if (!name) \49 return Unexpected<Error>(name.error());50 51 #define PEEK(name) \52 auto name = peek(); \53 if (!name) \54 return Unexpected<Error>(name.error());55 56 #define PEEK_FURTHER(name) \57 auto name = peekFurther(); \58 if (!name) \59 return Unexpected<Error>(name.error());60 61 41 // FIXME: https://bugs.webkit.org/show_bug.cgi?id=195682 Return a better error code from this, and report it to JavaScript. 62 42 auto Parser::parse(Program& program, StringView stringView, Mode mode) -> Optional<Error> … … 66 46 67 47 while (!m_lexer.isFullyConsumed()) { 68 auto token = m_lexer.peek(); 69 if (!token) 70 break; 71 switch (token->type) { 72 case Lexer::Token::Type::Semicolon: 48 if (tryType(Lexer::Token::Type::Semicolon)) { 73 49 m_lexer.consumeToken(); 74 50 continue; 75 case Lexer::Token::Type::Typedef: { 76 auto typeDefinition = parseTypeDefinition(); 77 if (!typeDefinition) 78 return typeDefinition.error(); 79 program.append(WTFMove(*typeDefinition)); 80 continue; 81 } 82 case Lexer::Token::Type::Struct: { 83 auto structureDefinition = parseStructureDefinition(); 84 if (!structureDefinition) 85 return structureDefinition.error(); 86 program.append(WTFMove(*structureDefinition)); 87 continue; 88 } 89 case Lexer::Token::Type::Enum: { 90 auto enumerationDefinition = parseEnumerationDefinition(); 91 if (!enumerationDefinition) 92 return enumerationDefinition.error(); 93 program.append(WTFMove(*enumerationDefinition)); 94 continue; 95 } 96 case Lexer::Token::Type::Native: { 97 ASSERT(m_mode == Mode::StandardLibrary); 98 auto furtherToken = peekFurther(); 99 if (!furtherToken) 100 return WTF::nullopt; 101 if (furtherToken->type == Lexer::Token::Type::Typedef) { 102 auto nativeTypeDeclaration = parseNativeTypeDeclaration(); 103 if (!nativeTypeDeclaration) 104 return nativeTypeDeclaration.error(); 105 program.append(WTFMove(*nativeTypeDeclaration)); 51 } 52 53 { 54 auto typeDefinition = backtrackingScope<Expected<AST::TypeDefinition, Error>>([&]() { 55 return parseTypeDefinition(); 56 }); 57 if (typeDefinition) { 58 auto success = program.append(WTFMove(*typeDefinition)); 59 if (!success) 60 return WTF::nullopt; 106 61 continue; 107 62 } 108 auto nativeFunctionDeclaration = parseNativeFunctionDeclaration(); 109 if (!nativeFunctionDeclaration) 110 return nativeFunctionDeclaration.error(); 111 program.append(WTFMove(*nativeFunctionDeclaration)); 112 continue; 113 } 114 default: { 115 auto functionDefinition = parseFunctionDefinition(); 116 if (!functionDefinition) 117 return functionDefinition.error(); 118 program.append(WTFMove(*functionDefinition)); 119 continue; 120 } 121 } 122 } 123 63 } 64 65 { 66 auto structureDefinition = backtrackingScope<Expected<AST::StructureDefinition, Error>>([&]() { 67 return parseStructureDefinition(); 68 }); 69 if (structureDefinition) { 70 auto success = program.append(WTFMove(*structureDefinition)); 71 if (!success) 72 return WTF::nullopt; 73 continue; 74 } 75 } 76 77 { 78 auto enumerationDefinition = backtrackingScope<Expected<AST::EnumerationDefinition, Error>>([&]() { 79 return parseEnumerationDefinition(); 80 }); 81 if (enumerationDefinition) { 82 auto success = program.append(WTFMove(*enumerationDefinition)); 83 if (!success) 84 return WTF::nullopt; 85 continue; 86 } 87 } 88 89 Optional<Error> error; 90 { 91 auto functionDefinition = backtrackingScope<Expected<AST::FunctionDefinition, Error>>([&]() { 92 return parseFunctionDefinition(); 93 }); 94 if (functionDefinition) { 95 auto success = program.append(WTFMove(*functionDefinition)); 96 if (!success) 97 return WTF::nullopt; 98 continue; 99 } 100 error = functionDefinition.error(); 101 } 102 103 if (m_mode == Mode::StandardLibrary) { 104 auto nativeFunctionDeclaration = backtrackingScope<Expected<AST::NativeFunctionDeclaration, Error>>([&]() { 105 return parseNativeFunctionDeclaration(); 106 }); 107 if (nativeFunctionDeclaration) { 108 auto success = program.append(WTFMove(*nativeFunctionDeclaration)); 109 if (!success) 110 return WTF::nullopt; 111 continue; 112 } 113 } 114 115 if (m_mode == Mode::StandardLibrary) { 116 auto nativeTypeDeclaration = backtrackingScope<Expected<AST::NativeTypeDeclaration, Error>>([&]() { 117 return parseNativeTypeDeclaration(); 118 }); 119 if (nativeTypeDeclaration) { 120 auto success = program.append(WTFMove(*nativeTypeDeclaration)); 121 if (!success) 122 return WTF::nullopt; 123 continue; 124 } 125 } 126 127 return WTFMove(*error); 128 } 124 129 return WTF::nullopt; 125 130 } … … 136 141 auto Parser::peek() -> Expected<Lexer::Token, Error> 137 142 { 138 if (auto token = m_lexer.peek()) { 143 if (auto token = m_lexer.consumeToken()) { 144 m_lexer.unconsumeToken(Lexer::Token(*token)); 139 145 return *token; 140 146 } … … 142 148 } 143 149 144 auto Parser::peekFurther() -> Expected<Lexer::Token, Error>145 {146 if (auto token = m_lexer.peekFurther()) {147 return *token;148 }149 return fail("Cannot consume two tokens"_str, TryToPeek::No);150 }151 152 bool Parser::peekTypes(const Vector<Lexer::Token::Type>& types)153 {154 if (auto token = m_lexer.peek())155 return std::find(types.begin(), types.end(), token->type) != types.end();156 return false;157 }158 159 150 Optional<Lexer::Token> Parser::tryType(Lexer::Token::Type type) 160 151 { 161 if (auto token = m_lexer. peek()) {152 if (auto token = m_lexer.consumeToken()) { 162 153 if (token->type == type) 163 return m_lexer.consumeToken(); 154 return token; 155 m_lexer.unconsumeToken(Lexer::Token(*token)); 164 156 } 165 157 return WTF::nullopt; 166 158 } 167 159 168 Optional<Lexer::Token> Parser::tryTypes( const Vector<Lexer::Token::Type>&types)169 { 170 if (auto token = m_lexer. peek()) {160 Optional<Lexer::Token> Parser::tryTypes(Vector<Lexer::Token::Type> types) 161 { 162 if (auto token = m_lexer.consumeToken()) { 171 163 if (std::find(types.begin(), types.end(), token->type) != types.end()) 172 return m_lexer.consumeToken(); 164 return token; 165 m_lexer.unconsumeToken(Lexer::Token(*token)); 173 166 } 174 167 return WTF::nullopt; … … 185 178 } 186 179 187 auto Parser::consumeTypes( const Vector<Lexer::Token::Type>&types) -> Expected<Lexer::Token, Error>180 auto Parser::consumeTypes(Vector<Lexer::Token::Type> types) -> Expected<Lexer::Token, Error> 188 181 { 189 182 auto buildExpectedString = [&]() -> String { … … 375 368 default: { 376 369 ASSERT(type->type == Lexer::Token::Type::Identifier); 377 CONSUME_TYPE(origin, FullStop); 378 CONSUME_TYPE(next, Identifier); 370 auto origin = consumeType(Lexer::Token::Type::FullStop); 371 if (!origin) 372 return Unexpected<Error>(origin.error()); 373 auto next = consumeType(Lexer::Token::Type::Identifier); 374 if (!next) 375 return Unexpected<Error>(next.error()); 379 376 return { AST::EnumerationMemberLiteral(WTFMove(*origin), type->stringView.toString(), next->stringView.toString()) }; 380 377 } … … 384 381 auto Parser::parseTypeArgument() -> Expected<AST::TypeArgument, Error> 385 382 { 386 PEEK(nextToken);387 PEEK_FURTHER(furtherToken);388 if (nextToken->type != Lexer::Token::Type::Identifier || furtherToken->type == Lexer::Token::Type::FullStop) {389 PARSE(constantExpression, ConstantExpression);383 auto constantExpression = backtrackingScope<Expected<AST::ConstantExpression, Error>>([&]() { 384 return parseConstantExpression(); 385 }); 386 if (constantExpression) 390 387 return AST::TypeArgument(WTFMove(*constantExpression)); 391 } 392 CONSUME_TYPE(result, Identifier); 388 auto result = consumeType(Lexer::Token::Type::Identifier); 389 if (!result) 390 return Unexpected<Error>(result.error()); 393 391 return AST::TypeArgument(makeUniqueRef<AST::TypeReference>(Lexer::Token(*result), result->stringView.toString(), AST::TypeArguments())); 394 392 } … … 396 394 auto Parser::parseTypeArguments() -> Expected<AST::TypeArguments, Error> 397 395 { 398 AST::TypeArguments typeArguments; 399 auto lessThanSign = tryType(Lexer::Token::Type::LessThanSign); 400 if (!lessThanSign) 396 auto typeArguments = backtrackingScope<Optional<AST::TypeArguments>>([&]() -> Optional<AST::TypeArguments> { 397 auto lessThanSign = consumeType(Lexer::Token::Type::LessThanSign); 398 if (!lessThanSign) 399 return WTF::nullopt; 400 AST::TypeArguments typeArguments; 401 auto typeArgument = parseTypeArgument(); 402 if (!typeArgument) 403 return WTF::nullopt; 404 typeArguments.append(WTFMove(*typeArgument)); 405 while (tryType(Lexer::Token::Type::Comma)) { 406 auto typeArgument = parseTypeArgument(); 407 if (!typeArgument) 408 return WTF::nullopt; 409 typeArguments.append(WTFMove(*typeArgument)); 410 } 411 auto greaterThanSign = consumeType(Lexer::Token::Type::GreaterThanSign); 412 if (!greaterThanSign) 413 return WTF::nullopt; 401 414 return typeArguments; 402 403 auto greaterThanSign = tryType(Lexer::Token::Type::GreaterThanSign); 404 if (greaterThanSign) 405 return typeArguments; 406 407 PARSE(typeArgument, TypeArgument); 408 typeArguments.append(WTFMove(*typeArgument)); 409 410 while (true) { 411 auto greaterThanSign = tryType(Lexer::Token::Type::GreaterThanSign); 412 if (greaterThanSign) 413 break; 414 415 CONSUME_TYPE(comma, Comma); 416 PARSE(typeArgument, TypeArgument); 417 typeArguments.append(WTFMove(*typeArgument)); 418 } 419 420 return typeArguments; 415 }); 416 if (typeArguments) 417 return WTFMove(*typeArguments); 418 419 typeArguments = backtrackingScope<Optional<AST::TypeArguments>>([&]() -> Optional<AST::TypeArguments> { 420 auto lessThanSign = consumeType(Lexer::Token::Type::LessThanSign); 421 if (!lessThanSign) 422 return WTF::nullopt; 423 auto greaterThanSign = consumeType(Lexer::Token::Type::GreaterThanSign); 424 if (!greaterThanSign) 425 return WTF::nullopt; 426 return {{ }}; 427 }); 428 if (typeArguments) 429 return WTFMove(*typeArguments); 430 431 return AST::TypeArguments(); 421 432 } 422 433 … … 430 441 if (!numElements) 431 442 return Unexpected<Error>(numElements.error()); 432 CONSUME_TYPE(rightSquareBracket, RightSquareBracket); 443 auto rightSquareBracket = consumeType(Lexer::Token::Type::RightSquareBracket); 444 if (!rightSquareBracket) 445 return Unexpected<Error>(rightSquareBracket.error()); 433 446 return {{ *token, *numElements }}; 434 447 } … … 445 458 if (!numElements) 446 459 return Unexpected<Error>(numElements.error()); 447 CONSUME_TYPE(rightSquareBracket, RightSquareBracket); 460 auto rightSquareBracket = consumeType(Lexer::Token::Type::RightSquareBracket); 461 if (!rightSquareBracket) 462 return Unexpected<Error>(rightSquareBracket.error()); 448 463 return {{ *token, WTF::nullopt, *numElements }}; 449 464 } … … 470 485 } 471 486 472 auto Parser::parseType() -> Expected<UniqueRef<AST::UnnamedType>, Error> 473 { 474 auto addressSpaceToken = tryTypes({ Lexer::Token::Type::Constant, Lexer::Token::Type::Device, Lexer::Token::Type::Threadgroup, Lexer::Token::Type::Thread}); 475 476 CONSUME_TYPE(name, Identifier); 477 PARSE(typeArguments, TypeArguments); 478 479 if (addressSpaceToken) { 480 AST::AddressSpace addressSpace; 481 switch (addressSpaceToken->type) { 482 case Lexer::Token::Type::Constant: 483 addressSpace = AST::AddressSpace::Constant; 487 auto Parser::parseAddressSpaceType() -> Expected<UniqueRef<AST::UnnamedType>, Error> 488 { 489 auto addressSpaceToken = consumeTypes({ Lexer::Token::Type::Constant, Lexer::Token::Type::Device, Lexer::Token::Type::Threadgroup, Lexer::Token::Type::Thread}); 490 if (!addressSpaceToken) 491 return Unexpected<Error>(addressSpaceToken.error()); 492 AST::AddressSpace addressSpace; 493 switch (addressSpaceToken->type) { 494 case Lexer::Token::Type::Constant: 495 addressSpace = AST::AddressSpace::Constant; 496 break; 497 case Lexer::Token::Type::Device: 498 addressSpace = AST::AddressSpace::Device; 499 break; 500 case Lexer::Token::Type::Threadgroup: 501 addressSpace = AST::AddressSpace::Threadgroup; 502 break; 503 default: 504 ASSERT(addressSpaceToken->type == Lexer::Token::Type::Thread); 505 addressSpace = AST::AddressSpace::Thread; 506 break; 507 } 508 auto name = consumeType(Lexer::Token::Type::Identifier); 509 if (!name) 510 return Unexpected<Error>(name.error()); 511 auto typeArguments = parseTypeArguments(); 512 if (!typeArguments) 513 return Unexpected<Error>(typeArguments.error()); 514 515 auto constructTypeFromSuffixAbbreviated = [&](const TypeSuffixAbbreviated& typeSuffixAbbreviated, UniqueRef<AST::UnnamedType>&& previous) -> UniqueRef<AST::UnnamedType> { 516 switch (typeSuffixAbbreviated.token.type) { 517 case Lexer::Token::Type::Star: 518 return { makeUniqueRef<AST::PointerType>(Lexer::Token(typeSuffixAbbreviated.token), addressSpace, WTFMove(previous)) }; 519 case Lexer::Token::Type::SquareBracketPair: 520 return { makeUniqueRef<AST::ArrayReferenceType>(Lexer::Token(typeSuffixAbbreviated.token), addressSpace, WTFMove(previous)) }; 521 default: 522 ASSERT(typeSuffixAbbreviated.token.type == Lexer::Token::Type::LeftSquareBracket); 523 return { makeUniqueRef<AST::ArrayType>(Lexer::Token(typeSuffixAbbreviated.token), WTFMove(previous), *typeSuffixAbbreviated.numElements) }; 524 } 525 }; 526 527 auto firstTypeSuffixAbbreviated = parseTypeSuffixAbbreviated(); 528 if (!firstTypeSuffixAbbreviated) 529 return Unexpected<Error>(firstTypeSuffixAbbreviated.error()); 530 UniqueRef<AST::UnnamedType> result = makeUniqueRef<AST::TypeReference>(WTFMove(*addressSpaceToken), name->stringView.toString(), WTFMove(*typeArguments)); 531 auto next = constructTypeFromSuffixAbbreviated(*firstTypeSuffixAbbreviated, WTFMove(result)); 532 result = WTFMove(next); 533 while (true) { 534 auto typeSuffixAbbreviated = backtrackingScope<Expected<TypeSuffixAbbreviated, Error>>([&]() { 535 return parseTypeSuffixAbbreviated(); 536 }); 537 if (!typeSuffixAbbreviated) 484 538 break; 485 case Lexer::Token::Type::Device: 486 addressSpace = AST::AddressSpace::Device; 487 break; 488 case Lexer::Token::Type::Threadgroup: 489 addressSpace = AST::AddressSpace::Threadgroup; 490 break; 491 default: 492 ASSERT(addressSpaceToken->type == Lexer::Token::Type::Thread); 493 addressSpace = AST::AddressSpace::Thread; 494 break; 495 } 496 auto constructTypeFromSuffixAbbreviated = [&](const TypeSuffixAbbreviated& typeSuffixAbbreviated, UniqueRef<AST::UnnamedType>&& previous) -> UniqueRef<AST::UnnamedType> { 497 switch (typeSuffixAbbreviated.token.type) { 498 case Lexer::Token::Type::Star: 499 return { makeUniqueRef<AST::PointerType>(Lexer::Token(typeSuffixAbbreviated.token), addressSpace, WTFMove(previous)) }; 500 case Lexer::Token::Type::SquareBracketPair: 501 return { makeUniqueRef<AST::ArrayReferenceType>(Lexer::Token(typeSuffixAbbreviated.token), addressSpace, WTFMove(previous)) }; 502 default: 503 ASSERT(typeSuffixAbbreviated.token.type == Lexer::Token::Type::LeftSquareBracket); 504 return { makeUniqueRef<AST::ArrayType>(Lexer::Token(typeSuffixAbbreviated.token), WTFMove(previous), *typeSuffixAbbreviated.numElements) }; 505 } 506 }; 507 PARSE(firstTypeSuffixAbbreviated, TypeSuffixAbbreviated); 508 UniqueRef<AST::UnnamedType> result = makeUniqueRef<AST::TypeReference>(WTFMove(*addressSpaceToken), name->stringView.toString(), WTFMove(*typeArguments)); 509 auto next = constructTypeFromSuffixAbbreviated(*firstTypeSuffixAbbreviated, WTFMove(result)); 539 // FIXME: The nesting here might be in the wrong order. 540 next = constructTypeFromSuffixAbbreviated(*typeSuffixAbbreviated, WTFMove(result)); 510 541 result = WTFMove(next); 511 while (true) { 512 PEEK(nextToken); 513 if (nextToken->type != Lexer::Token::Type::Star 514 && nextToken->type != Lexer::Token::Type::SquareBracketPair 515 && nextToken->type != Lexer::Token::Type::LeftSquareBracket) { 516 break; 517 } 518 PARSE(typeSuffixAbbreviated, TypeSuffixAbbreviated); 519 // FIXME: The nesting here might be in the wrong order. 520 next = constructTypeFromSuffixAbbreviated(*typeSuffixAbbreviated, WTFMove(result)); 521 result = WTFMove(next); 522 } 523 return WTFMove(result); 524 } 542 } 543 544 return WTFMove(result); 545 } 546 547 auto Parser::parseNonAddressSpaceType() -> Expected<UniqueRef<AST::UnnamedType>, Error> 548 { 549 auto origin = peek(); 550 if (!origin) 551 return Unexpected<Error>(origin.error()); 552 auto name = consumeType(Lexer::Token::Type::Identifier); 553 if (!name) 554 return Unexpected<Error>(name.error()); 555 auto typeArguments = parseTypeArguments(); 556 if (!typeArguments) 557 return Unexpected<Error>(typeArguments.error()); 525 558 526 559 auto constructTypeFromSuffixNonAbbreviated = [&](const TypeSuffixNonAbbreviated& typeSuffixNonAbbreviated, UniqueRef<AST::UnnamedType>&& previous) -> UniqueRef<AST::UnnamedType> { … … 535 568 } 536 569 }; 537 UniqueRef<AST::UnnamedType> result = makeUniqueRef<AST::TypeReference>(WTFMove(*name), name->stringView.toString(), WTFMove(*typeArguments)); 570 571 UniqueRef<AST::UnnamedType> result = makeUniqueRef<AST::TypeReference>(WTFMove(*origin), name->stringView.toString(), WTFMove(*typeArguments)); 538 572 while (true) { 539 PEEK(nextToken);540 if (nextToken->type != Lexer::Token::Type::Star541 && nextToken->type != Lexer::Token::Type::SquareBracketPair542 && nextToken->type != Lexer::Token::Type::LeftSquareBracket) {573 auto typeSuffixNonAbbreviated = backtrackingScope<Expected<TypeSuffixNonAbbreviated, Error>>([&]() { 574 return parseTypeSuffixNonAbbreviated(); 575 }); 576 if (!typeSuffixNonAbbreviated) 543 577 break; 544 }545 PARSE(typeSuffixNonAbbreviated, TypeSuffixNonAbbreviated);546 578 // FIXME: The nesting here might be in the wrong order. 547 579 auto next = constructTypeFromSuffixNonAbbreviated(*typeSuffixNonAbbreviated, WTFMove(result)); 548 580 result = WTFMove(next); 549 581 } 582 550 583 return WTFMove(result); 551 584 } 552 585 586 auto Parser::parseType() -> Expected<UniqueRef<AST::UnnamedType>, Error> 587 { 588 { 589 auto type = backtrackingScope<Expected<UniqueRef<AST::UnnamedType>, Error>>([&]() { 590 return parseAddressSpaceType(); 591 }); 592 if (type) 593 return type; 594 } 595 596 auto type = backtrackingScope<Expected<UniqueRef<AST::UnnamedType>, Error>>([&]() { 597 return parseNonAddressSpaceType(); 598 }); 599 if (type) 600 return type; 601 602 return Unexpected<Error>(type.error()); 603 } 604 553 605 auto Parser::parseTypeDefinition() -> Expected<AST::TypeDefinition, Error> 554 606 { 555 CONSUME_TYPE(origin, Typedef); 556 CONSUME_TYPE(name, Identifier); 557 CONSUME_TYPE(equals, EqualsSign); 558 PARSE(type, Type); 559 CONSUME_TYPE(semicolon, Semicolon); 607 auto origin = consumeType(Lexer::Token::Type::Typedef); 608 if (!origin) 609 return Unexpected<Error>(origin.error()); 610 auto name = consumeType(Lexer::Token::Type::Identifier); 611 if (!name) 612 return Unexpected<Error>(name.error()); 613 auto equals = consumeType(Lexer::Token::Type::EqualsSign); 614 if (!equals) 615 return Unexpected<Error>(equals.error()); 616 auto type = parseType(); 617 if (!type) 618 return Unexpected<Error>(type.error()); 619 auto semicolon = consumeType(Lexer::Token::Type::Semicolon); 620 if (!semicolon) 621 return Unexpected<Error>(semicolon.error()); 560 622 return AST::TypeDefinition(WTFMove(*origin), name->stringView.toString(), WTFMove(*type)); 561 623 } … … 620 682 auto Parser::parseResourceSemantic() -> Expected<AST::ResourceSemantic, Error> 621 683 { 622 CONSUME_TYPE(origin, Register); 623 CONSUME_TYPE(leftParenthesis, LeftParenthesis); 624 625 CONSUME_TYPE(info, Identifier); 684 auto origin = consumeType(Lexer::Token::Type::Register); 685 if (!origin) 686 return Unexpected<Error>(origin.error()); 687 688 auto leftParenthesis = consumeType(Lexer::Token::Type::LeftParenthesis); 689 if (!leftParenthesis) 690 return Unexpected<Error>(leftParenthesis.error()); 691 692 auto info = consumeType(Lexer::Token::Type::Identifier); 693 if (!info) 694 return Unexpected<Error>(info.error()); 626 695 if (info->stringView.length() < 2 || (info->stringView[0] != 'u' 627 696 && info->stringView[0] != 't' … … 652 721 unsigned space = 0; 653 722 if (tryType(Lexer::Token::Type::Comma)) { 654 CONSUME_TYPE(spaceToken, Identifier); 723 auto spaceToken = consumeType(Lexer::Token::Type::Identifier); 724 if (!spaceToken) 725 return Unexpected<Error>(spaceToken.error()); 655 726 auto prefix = "space"_str; 656 727 if (!spaceToken->stringView.startsWith(StringView(prefix))) … … 664 735 } 665 736 666 CONSUME_TYPE(rightParenthesis, RightParenthesis); 737 auto rightParenthesis = consumeType(Lexer::Token::Type::RightParenthesis); 738 if (!rightParenthesis) 739 return Unexpected<Error>(rightParenthesis.error()); 667 740 668 741 return AST::ResourceSemantic(WTFMove(*origin), mode, *index, space); … … 671 744 auto Parser::parseSpecializationConstantSemantic() -> Expected<AST::SpecializationConstantSemantic, Error> 672 745 { 673 CONSUME_TYPE(origin, Specialized); 746 auto origin = consumeType(Lexer::Token::Type::Specialized); 747 if (!origin) 748 return Unexpected<Error>(origin.error()); 674 749 return AST::SpecializationConstantSemantic(WTFMove(*origin)); 675 750 } … … 677 752 auto Parser::parseStageInOutSemantic() -> Expected<AST::StageInOutSemantic, Error> 678 753 { 679 CONSUME_TYPE(origin, Attribute); 680 CONSUME_TYPE(leftParenthesis, LeftParenthesis); 754 auto origin = consumeType(Lexer::Token::Type::Attribute); 755 if (!origin) 756 return Unexpected<Error>(origin.error()); 757 758 auto leftParenthesis = consumeType(Lexer::Token::Type::LeftParenthesis); 759 if (!leftParenthesis) 760 return Unexpected<Error>(leftParenthesis.error()); 681 761 682 762 auto index = consumeNonNegativeIntegralLiteral(); … … 684 764 return Unexpected<Error>(index.error()); 685 765 686 CONSUME_TYPE(rightParenthesis, RightParenthesis); 766 auto rightParenthesis = consumeType(Lexer::Token::Type::RightParenthesis); 767 if (!rightParenthesis) 768 return Unexpected<Error>(rightParenthesis.error()); 687 769 688 770 return AST::StageInOutSemantic(WTFMove(*origin), *index); 689 771 } 690 772 691 auto Parser::parseSemantic() -> Expected<Optional<AST::Semantic>, Error> 692 { 693 if (!tryType(Lexer::Token::Type::Colon)) 694 return { WTF::nullopt }; 695 696 PEEK(token); 697 switch (token->type) { 698 case Lexer::Token::Type::Attribute: { 699 PARSE(result, StageInOutSemantic); 700 return { AST::Semantic(WTFMove(*result)) }; 701 } 702 case Lexer::Token::Type::Specialized: { 703 PARSE(result, SpecializationConstantSemantic); 704 return { AST::Semantic(WTFMove(*result)) }; 705 } 706 case Lexer::Token::Type::Register: { 707 PARSE(result, ResourceSemantic); 708 return { AST::Semantic(WTFMove(*result)) }; 709 } 710 default: { 711 PARSE(result, BuiltInSemantic); 712 return { AST::Semantic(WTFMove(*result)) }; 713 } 714 } 773 auto Parser::parseSemantic() -> Expected<AST::Semantic, Error> 774 { 775 auto builtInSemantic = backtrackingScope<Expected<AST::BuiltInSemantic, Error>>([&]() { 776 return parseBuiltInSemantic(); 777 }); 778 if (builtInSemantic) 779 return AST::Semantic(WTFMove(*builtInSemantic)); 780 781 auto resourceSemantic = backtrackingScope<Expected<AST::ResourceSemantic, Error>>([&]() { 782 return parseResourceSemantic(); 783 }); 784 if (resourceSemantic) 785 return AST::Semantic(WTFMove(*resourceSemantic)); 786 787 auto specializationConstantSemantic = backtrackingScope<Expected<AST::SpecializationConstantSemantic, Error>>([&]() { 788 return parseSpecializationConstantSemantic(); 789 }); 790 if (specializationConstantSemantic) 791 return AST::Semantic(WTFMove(*specializationConstantSemantic)); 792 793 auto stageInOutSemantic = backtrackingScope<Expected<AST::StageInOutSemantic, Error>>([&]() { 794 return parseStageInOutSemantic(); 795 }); 796 if (stageInOutSemantic) 797 return AST::Semantic(WTFMove(*stageInOutSemantic)); 798 799 return Unexpected<Error>(stageInOutSemantic.error()); 715 800 } 716 801 AST::Qualifiers Parser::parseQualifiers() 717 802 { 718 803 AST::Qualifiers qualifiers; 719 while (auto next = tryType(Lexer::Token::Type::Qualifier)) { 720 if ("nointerpolation" == next->stringView) 721 qualifiers.append(AST::Qualifier::Nointerpolation); 722 else if ("noperspective" == next->stringView) 723 qualifiers.append(AST::Qualifier::Noperspective); 724 else if ("uniform" == next->stringView) 725 qualifiers.append(AST::Qualifier::Uniform); 726 else if ("centroid" == next->stringView) 727 qualifiers.append(AST::Qualifier::Centroid); 728 else { 729 ASSERT("sample" == next->stringView); 730 qualifiers.append(AST::Qualifier::Sample); 731 } 804 while (true) { 805 if (auto next = tryType(Lexer::Token::Type::Qualifier)) { 806 if ("nointerpolation" == next->stringView) 807 qualifiers.append(AST::Qualifier::Nointerpolation); 808 else if ("noperspective" == next->stringView) 809 qualifiers.append(AST::Qualifier::Noperspective); 810 else if ("uniform" == next->stringView) 811 qualifiers.append(AST::Qualifier::Uniform); 812 else if ("centroid" == next->stringView) 813 qualifiers.append(AST::Qualifier::Centroid); 814 else { 815 ASSERT("sample" == next->stringView); 816 qualifiers.append(AST::Qualifier::Sample); 817 } 818 } else 819 break; 732 820 } 733 821 return qualifiers; … … 736 824 auto Parser::parseStructureElement() -> Expected<AST::StructureElement, Error> 737 825 { 738 PEEK(origin); 826 auto origin = peek(); 827 if (!origin) 828 return Unexpected<Error>(origin.error()); 739 829 740 830 AST::Qualifiers qualifiers = parseQualifiers(); 741 831 742 PARSE(type, Type); 743 CONSUME_TYPE(name, Identifier); 744 PARSE(semantic, Semantic); 745 CONSUME_TYPE(semicolon, Semicolon); 746 747 return AST::StructureElement(WTFMove(*origin), WTFMove(qualifiers), WTFMove(*type), name->stringView.toString(), WTFMove(*semantic)); 832 auto type = parseType(); 833 if (!type) 834 return Unexpected<Error>(type.error()); 835 836 auto name = consumeType(Lexer::Token::Type::Identifier); 837 if (!name) 838 return Unexpected<Error>(name.error()); 839 840 if (tryType(Lexer::Token::Type::Colon)) { 841 auto semantic = parseSemantic(); 842 if (!semantic) 843 return Unexpected<Error>(semantic.error()); 844 845 auto semicolon = consumeType(Lexer::Token::Type::Semicolon); 846 if (!semicolon) 847 return Unexpected<Error>(semicolon.error()); 848 849 return AST::StructureElement(WTFMove(*origin), WTFMove(qualifiers), WTFMove(*type), name->stringView.toString(), WTFMove(*semantic)); 850 } 851 852 auto semicolon = consumeType(Lexer::Token::Type::Semicolon); 853 if (!semicolon) 854 return Unexpected<Error>(semicolon.error()); 855 856 return AST::StructureElement(WTFMove(*origin), WTFMove(qualifiers), WTFMove(*type), name->stringView.toString(), WTF::nullopt); 748 857 } 749 858 750 859 auto Parser::parseStructureDefinition() -> Expected<AST::StructureDefinition, Error> 751 860 { 752 CONSUME_TYPE(origin, Struct); 753 CONSUME_TYPE(name, Identifier); 754 CONSUME_TYPE(leftCurlyBracket, LeftCurlyBracket); 861 auto origin = consumeType(Lexer::Token::Type::Struct); 862 if (!origin) 863 return Unexpected<Error>(origin.error()); 864 865 auto name = consumeType(Lexer::Token::Type::Identifier); 866 if (!name) 867 return Unexpected<Error>(name.error()); 868 869 auto leftCurlyBracket = consumeType(Lexer::Token::Type::LeftCurlyBracket); 870 if (!leftCurlyBracket) 871 return Unexpected<Error>(leftCurlyBracket.error()); 755 872 756 873 AST::StructureElements structureElements; 757 while (!tryType(Lexer::Token::Type::RightCurlyBracket)) { 758 PARSE(structureElement, StructureElement); 759 structureElements.append(WTFMove(*structureElement)); 760 } 874 while (true) { 875 auto structureElement = backtrackingScope<Expected<AST::StructureElement, Error>>([&]() { 876 return parseStructureElement(); 877 }); 878 if (structureElement) 879 structureElements.append(WTFMove(*structureElement)); 880 else 881 break; 882 } 883 884 auto rightCurlyBracket = consumeType(Lexer::Token::Type::RightCurlyBracket); 885 if (!rightCurlyBracket) 886 return Unexpected<Error>(rightCurlyBracket.error()); 761 887 762 888 return AST::StructureDefinition(WTFMove(*origin), name->stringView.toString(), WTFMove(structureElements)); … … 765 891 auto Parser::parseEnumerationDefinition() -> Expected<AST::EnumerationDefinition, Error> 766 892 { 767 CONSUME_TYPE(origin, Enum); 768 CONSUME_TYPE(name, Identifier); 893 auto origin = consumeType(Lexer::Token::Type::Enum); 894 if (!origin) 895 return Unexpected<Error>(origin.error()); 896 897 auto name = consumeType(Lexer::Token::Type::Identifier); 898 if (!name) 899 return Unexpected<Error>(name.error()); 769 900 770 901 auto type = ([&]() -> Expected<UniqueRef<AST::UnnamedType>, Error> { 771 902 if (tryType(Lexer::Token::Type::Colon)) { 772 PARSE(parsedType, Type); 903 auto parsedType = parseType(); 904 if (!parsedType) 905 return Unexpected<Error>(parsedType.error()); 773 906 return WTFMove(*parsedType); 774 907 } … … 778 911 return Unexpected<Error>(type.error()); 779 912 780 CONSUME_TYPE(leftCurlyBracket, LeftCurlyBracket); 781 782 PARSE(firstEnumerationMember, EnumerationMember); 913 auto leftCurlyBracket = consumeType(Lexer::Token::Type::LeftCurlyBracket); 914 if (!leftCurlyBracket) 915 return Unexpected<Error>(leftCurlyBracket.error()); 916 917 auto firstEnumerationMember = parseEnumerationMember(); 918 if (!firstEnumerationMember) 919 return Unexpected<Error>(firstEnumerationMember.error()); 783 920 784 921 AST::EnumerationDefinition result(WTFMove(*origin), name->stringView.toString(), WTFMove(*type)); … … 788 925 789 926 while (tryType(Lexer::Token::Type::Comma)) { 790 PARSE(member, EnumerationMember); 927 auto member = parseEnumerationMember(); 928 if (!member) 929 return Unexpected<Error>(member.error()); 791 930 success = result.add(WTFMove(*member)); 792 931 if (!success) … … 794 933 } 795 934 796 CONSUME_TYPE(rightCurlyBracket, RightCurlyBracket); 935 auto rightCurlyBracket = consumeType(Lexer::Token::Type::RightCurlyBracket); 936 if (!rightCurlyBracket) 937 return Unexpected<Error>(rightCurlyBracket.error()); 797 938 798 939 return WTFMove(result); … … 801 942 auto Parser::parseEnumerationMember() -> Expected<AST::EnumerationMember, Error> 802 943 { 803 CONSUME_TYPE(identifier, Identifier); 944 auto identifier = consumeType(Lexer::Token::Type::Identifier); 945 if (!identifier) 946 return Unexpected<Error>(identifier.error()); 804 947 auto name = identifier->stringView.toString(); 805 948 806 949 if (tryType(Lexer::Token::Type::EqualsSign)) { 807 PARSE(constantExpression, ConstantExpression); 950 auto constantExpression = parseConstantExpression(); 951 if (!constantExpression) 952 return Unexpected<Error>(constantExpression.error()); 808 953 return AST::EnumerationMember(Lexer::Token(*identifier), WTFMove(name), WTFMove(*constantExpression)); 809 954 } … … 813 958 auto Parser::parseNativeTypeDeclaration() -> Expected<AST::NativeTypeDeclaration, Error> 814 959 { 815 CONSUME_TYPE(origin, Native); 816 CONSUME_TYPE(parsedTypedef, Typedef); 817 CONSUME_TYPE(name, Identifier); 818 PARSE(typeArguments, TypeArguments); 819 CONSUME_TYPE(semicolon, Semicolon); 960 auto origin = consumeType(Lexer::Token::Type::Native); 961 if (!origin) 962 return Unexpected<Error>(origin.error()); 963 964 auto parsedTypedef = consumeType(Lexer::Token::Type::Typedef); 965 if (!parsedTypedef) 966 return Unexpected<Error>(parsedTypedef.error()); 967 968 auto name = consumeType(Lexer::Token::Type::Identifier); 969 if (!name) 970 return Unexpected<Error>(name.error()); 971 972 auto typeArguments = parseTypeArguments(); 973 if (!typeArguments) 974 return Unexpected<Error>(typeArguments.error()); 975 976 auto semicolon = consumeType(Lexer::Token::Type::Semicolon); 977 if (!semicolon) 978 return Unexpected<Error>(semicolon.error()); 820 979 821 980 return AST::NativeTypeDeclaration(WTFMove(*origin), name->stringView.toString(), WTFMove(*typeArguments)); … … 824 983 auto Parser::parseNumThreadsFunctionAttribute() -> Expected<AST::NumThreadsFunctionAttribute, Error> 825 984 { 826 CONSUME_TYPE(origin, NumThreads); 827 CONSUME_TYPE(leftParenthesis, LeftParenthesis); 985 auto origin = consumeType(Lexer::Token::Type::NumThreads); 986 if (!origin) 987 return Unexpected<Error>(origin.error()); 988 989 auto leftParenthesis = consumeType(Lexer::Token::Type::LeftParenthesis); 990 if (!leftParenthesis) 991 return Unexpected<Error>(leftParenthesis.error()); 828 992 829 993 auto width = consumeNonNegativeIntegralLiteral(); … … 831 995 return Unexpected<Error>(width.error()); 832 996 833 CONSUME_TYPE(comma, Comma); 997 auto comma = consumeType(Lexer::Token::Type::Comma); 998 if (!comma) 999 return Unexpected<Error>(comma.error()); 834 1000 835 1001 auto height = consumeNonNegativeIntegralLiteral(); … … 837 1003 return Unexpected<Error>(height.error()); 838 1004 839 CONSUME_TYPE(secondComma, Comma); 1005 comma = consumeType(Lexer::Token::Type::Comma); 1006 if (!comma) 1007 return Unexpected<Error>(comma.error()); 840 1008 841 1009 auto depth = consumeNonNegativeIntegralLiteral(); … … 843 1011 return Unexpected<Error>(depth.error()); 844 1012 845 CONSUME_TYPE(rightParenthesis, RightParenthesis); 1013 auto rightParenthesis = consumeType(Lexer::Token::Type::RightParenthesis); 1014 if (!rightParenthesis) 1015 return Unexpected<Error>(rightParenthesis.error()); 846 1016 847 1017 return AST::NumThreadsFunctionAttribute(WTFMove(*origin), *width, *height, *depth); … … 850 1020 auto Parser::parseAttributeBlock() -> Expected<AST::AttributeBlock, Error> 851 1021 { 852 CONSUME_TYPE(leftSquareBracket, LeftSquareBracket); 1022 auto leftSquareBracket = consumeType(Lexer::Token::Type::LeftSquareBracket); 1023 if (!leftSquareBracket) 1024 return Unexpected<Error>(leftSquareBracket.error()); 853 1025 854 1026 AST::AttributeBlock result; … … 866 1038 } 867 1039 868 CONSUME_TYPE(rightSquareBracket, RightSquareBracket); 1040 auto rightSquareBracket = consumeType(Lexer::Token::Type::RightSquareBracket); 1041 if (!rightSquareBracket) 1042 return Unexpected<Error>(rightSquareBracket.error()); 869 1043 870 1044 return WTFMove(result); … … 873 1047 auto Parser::parseParameter() -> Expected<AST::VariableDeclaration, Error> 874 1048 { 875 PEEK(origin); 1049 auto origin = peek(); 1050 if (!origin) 1051 return Unexpected<Error>(origin.error()); 876 1052 877 1053 AST::Qualifiers qualifiers = parseQualifiers(); 878 1054 879 PARSE(type, Type); 1055 auto type = parseType(); 1056 if (!type) 1057 return Unexpected<Error>(type.error()); 880 1058 881 1059 String name; … … 883 1061 name = token->stringView.toString(); 884 1062 885 PARSE(semantic, Semantic); 886 887 return AST::VariableDeclaration(WTFMove(*origin), WTFMove(qualifiers), { WTFMove(*type) }, WTFMove(name), WTFMove(*semantic), WTF::nullopt); 1063 if (tryType(Lexer::Token::Type::Colon)) { 1064 auto semantic = parseSemantic(); 1065 if (!semantic) 1066 return Unexpected<Error>(semantic.error()); 1067 return AST::VariableDeclaration(WTFMove(*origin), WTFMove(qualifiers), Optional<UniqueRef<AST::UnnamedType>>(WTFMove(*type)), WTFMove(name), WTFMove(*semantic), WTF::nullopt); 1068 } 1069 1070 return AST::VariableDeclaration(WTFMove(*origin), WTFMove(qualifiers), { WTFMove(*type) }, WTFMove(name), WTF::nullopt, WTF::nullopt); 888 1071 } 889 1072 890 1073 auto Parser::parseParameters() -> Expected<AST::VariableDeclarations, Error> 891 1074 { 1075 auto leftParenthesis = consumeType(Lexer::Token::Type::LeftParenthesis); 1076 if (!leftParenthesis) 1077 return Unexpected<Error>(leftParenthesis.error()); 1078 892 1079 AST::VariableDeclarations parameters; 893 894 CONSUME_TYPE(leftParenthesis, LeftParenthesis);895 896 1080 if (tryType(Lexer::Token::Type::RightParenthesis)) 897 1081 return WTFMove(parameters); 898 1082 899 PARSE(firstParameter, Parameter); 1083 auto firstParameter = parseParameter(); 1084 if (!firstParameter) 1085 return Unexpected<Error>(firstParameter.error()); 900 1086 parameters.append(makeUniqueRef<AST::VariableDeclaration>(WTFMove(*firstParameter))); 901 1087 902 1088 while (tryType(Lexer::Token::Type::Comma)) { 903 PARSE(parameter, Parameter); 1089 auto parameter = parseParameter(); 1090 if (!parameter) 1091 return Unexpected<Error>(parameter.error()); 904 1092 parameters.append(makeUniqueRef<AST::VariableDeclaration>(WTFMove(*parameter))); 905 1093 } 906 1094 907 CONSUME_TYPE(rightParenthesis, RightParenthesis); 1095 auto rightParenthesis = consumeType(Lexer::Token::Type::RightParenthesis); 1096 if (!rightParenthesis) 1097 return Unexpected<Error>(rightParenthesis.error()); 908 1098 909 1099 return WTFMove(parameters); … … 912 1102 auto Parser::parseFunctionDefinition() -> Expected<AST::FunctionDefinition, Error> 913 1103 { 914 PARSE(functionDeclaration, FunctionDeclaration); 915 PARSE(block, Block); 1104 auto functionDeclaration = parseFunctionDeclaration(); 1105 if (!functionDeclaration) 1106 return Unexpected<Error>(functionDeclaration.error()); 1107 1108 auto block = parseBlock(); 1109 if (!block) 1110 return Unexpected<Error>(block.error()); 1111 916 1112 return AST::FunctionDefinition(WTFMove(*functionDeclaration), WTFMove(*block)); 917 1113 } 918 1114 919 auto Parser::parseComputeFunctionDeclaration() -> Expected<AST::FunctionDeclaration, Error> 920 { 921 PEEK(origin); 922 923 PARSE(attributeBlock, AttributeBlock); 924 CONSUME_TYPE(compute, Compute); 925 PARSE(type, Type); 926 CONSUME_TYPE(name, Identifier); 927 PARSE(parameters, Parameters); 928 PARSE(semantic, Semantic); 1115 auto Parser::parseEntryPointFunctionDeclaration() -> Expected<AST::FunctionDeclaration, Error> 1116 { 1117 auto origin = peek(); 1118 if (!origin) 1119 return Unexpected<Error>(origin.error()); 1120 1121 AST::AttributeBlock attributeBlock; 1122 AST::EntryPointType entryPointType; 1123 1124 auto parsedAttributeBlock = backtrackingScope<Expected<AST::AttributeBlock, Error>>([&]() { 1125 return parseAttributeBlock(); 1126 }); 1127 if (parsedAttributeBlock) { 1128 auto compute = consumeType(Lexer::Token::Type::Compute); 1129 if (!compute) 1130 return Unexpected<Error>(compute.error()); 1131 attributeBlock = WTFMove(*parsedAttributeBlock); 1132 entryPointType = AST::EntryPointType::Compute; 1133 } else { 1134 auto type = consumeTypes({ Lexer::Token::Type::Vertex, Lexer::Token::Type::Fragment }); 1135 if (!type) 1136 return Unexpected<Error>(type.error()); 1137 1138 switch (origin->type) { 1139 case Lexer::Token::Type::Vertex: 1140 entryPointType = AST::EntryPointType::Vertex; 1141 break; 1142 default: 1143 ASSERT(origin->type == Lexer::Token::Type::Fragment); 1144 entryPointType = AST::EntryPointType::Fragment; 1145 break; 1146 } 1147 } 1148 1149 auto type = parseType(); 1150 if (!type) 1151 return Unexpected<Error>(type.error()); 1152 1153 auto name = consumeType(Lexer::Token::Type::Identifier); 1154 if (!name) 1155 return Unexpected<Error>(name.error()); 1156 1157 auto parameters = parseParameters(); 1158 if (!parameters) 1159 return Unexpected<Error>(parameters.error()); 1160 929 1161 bool isOperator = false; 930 return AST::FunctionDeclaration(WTFMove(*origin), WTFMove(*attributeBlock), AST::EntryPointType::Compute, WTFMove(*type), name->stringView.toString(), WTFMove(*parameters), WTFMove(*semantic), isOperator); 931 } 932 933 auto Parser::parseVertexOrFragmentFunctionDeclaration() -> Expected<AST::FunctionDeclaration, Error> 934 { 935 auto entryPoint = consumeTypes({ Lexer::Token::Type::Vertex, Lexer::Token::Type::Fragment }); 936 if (!entryPoint) 937 return Unexpected<Error>(entryPoint.error()); 938 auto entryPointType = (entryPoint->type == Lexer::Token::Type::Vertex) ? AST::EntryPointType::Vertex : AST::EntryPointType::Fragment; 939 940 PARSE(type, Type); 941 CONSUME_TYPE(name, Identifier); 942 PARSE(parameters, Parameters); 943 PARSE(semantic, Semantic); 944 945 bool isOperator = false; 946 return AST::FunctionDeclaration(WTFMove(*entryPoint), { }, entryPointType, WTFMove(*type), name->stringView.toString(), WTFMove(*parameters), WTFMove(*semantic), isOperator); 1162 1163 if (tryType(Lexer::Token::Type::Colon)) { 1164 auto semantic = parseSemantic(); 1165 if (!semantic) 1166 return Unexpected<Error>(semantic.error()); 1167 return AST::FunctionDeclaration(WTFMove(*origin), WTFMove(attributeBlock), entryPointType, WTFMove(*type), name->stringView.toString(), WTFMove(*parameters), WTFMove(*semantic), isOperator); 1168 } 1169 1170 return AST::FunctionDeclaration(WTFMove(*origin), WTFMove(attributeBlock), entryPointType, WTFMove(*type), name->stringView.toString(), WTFMove(*parameters), WTF::nullopt, isOperator); 947 1171 } 948 1172 949 1173 auto Parser::parseRegularFunctionDeclaration() -> Expected<AST::FunctionDeclaration, Error> 950 1174 { 951 PEEK(origin); 952 953 PARSE(type, Type); 1175 auto origin = peek(); 1176 if (!origin) 1177 return Unexpected<Error>(origin.error()); 1178 1179 auto type = parseType(); 1180 if (!type) 1181 return Unexpected<Error>(type.error()); 954 1182 955 1183 auto name = consumeTypes({ Lexer::Token::Type::Identifier, Lexer::Token::Type::OperatorName }); … … 958 1186 auto isOperator = name->type == Lexer::Token::Type::OperatorName; 959 1187 960 PARSE(parameters, Parameters); 961 PARSE(semantic, Semantic); 962 963 return AST::FunctionDeclaration(WTFMove(*origin), { }, WTF::nullopt, WTFMove(*type), name->stringView.toString(), WTFMove(*parameters), WTFMove(*semantic), isOperator); 1188 auto parameters = parseParameters(); 1189 if (!parameters) 1190 return Unexpected<Error>(parameters.error()); 1191 1192 if (tryType(Lexer::Token::Type::Colon)) { 1193 auto semantic = parseSemantic(); 1194 if (!semantic) 1195 return Unexpected<Error>(semantic.error()); 1196 return AST::FunctionDeclaration(WTFMove(*origin), { }, WTF::nullopt, WTFMove(*type), name->stringView.toString(), WTFMove(*parameters), WTFMove(*semantic), isOperator); 1197 } 1198 1199 return AST::FunctionDeclaration(WTFMove(*origin), { }, WTF::nullopt, WTFMove(*type), name->stringView.toString(), WTFMove(*parameters), WTF::nullopt, isOperator); 964 1200 } 965 1201 966 1202 auto Parser::parseOperatorFunctionDeclaration() -> Expected<AST::FunctionDeclaration, Error> 967 1203 { 968 CONSUME_TYPE(origin, Operator); 969 PARSE(type, Type); 970 PARSE(parameters, Parameters); 971 PARSE(semantic, Semantic); 1204 auto origin = consumeType(Lexer::Token::Type::Operator); 1205 if (!origin) 1206 return Unexpected<Error>(origin.error()); 1207 1208 auto type = parseType(); 1209 if (!type) 1210 return Unexpected<Error>(type.error()); 1211 1212 auto parameters = parseParameters(); 1213 if (!parameters) 1214 return Unexpected<Error>(parameters.error()); 972 1215 973 1216 bool isOperator = true; 974 return AST::FunctionDeclaration(WTFMove(*origin), { }, WTF::nullopt, WTFMove(*type), "operator cast"_str, WTFMove(*parameters), WTFMove(*semantic), isOperator); 1217 1218 if (tryType(Lexer::Token::Type::Colon)) { 1219 auto semantic = parseSemantic(); 1220 if (!semantic) 1221 return Unexpected<Error>(semantic.error()); 1222 return AST::FunctionDeclaration(WTFMove(*origin), { }, WTF::nullopt, WTFMove(*type), "operator cast"_str, WTFMove(*parameters), WTFMove(*semantic), isOperator); 1223 } 1224 1225 return AST::FunctionDeclaration(WTFMove(*origin), { }, WTF::nullopt, WTFMove(*type), "operator cast"_str, WTFMove(*parameters), WTF::nullopt, isOperator); 975 1226 } 976 1227 977 1228 auto Parser::parseFunctionDeclaration() -> Expected<AST::FunctionDeclaration, Error> 978 1229 { 979 PEEK(token); 980 switch (token->type) { 981 case Lexer::Token::Type::Operator: 1230 auto entryPointFunctionDeclaration = backtrackingScope<Expected<AST::FunctionDeclaration, Error>>([&]() { 1231 return parseEntryPointFunctionDeclaration(); 1232 }); 1233 if (entryPointFunctionDeclaration) 1234 return WTFMove(*entryPointFunctionDeclaration); 1235 1236 auto regularFunctionDeclaration = backtrackingScope<Expected<AST::FunctionDeclaration, Error>>([&]() { 1237 return parseRegularFunctionDeclaration(); 1238 }); 1239 if (regularFunctionDeclaration) 1240 return WTFMove(*regularFunctionDeclaration); 1241 1242 auto operatorFunctionDeclaration = backtrackingScope<Expected<AST::FunctionDeclaration, Error>>([&]() { 982 1243 return parseOperatorFunctionDeclaration(); 983 case Lexer::Token::Type::Vertex: 984 case Lexer::Token::Type::Fragment: 985 return parseVertexOrFragmentFunctionDeclaration(); 986 case Lexer::Token::Type::LeftSquareBracket: 987 return parseComputeFunctionDeclaration(); 988 default: 989 return parseRegularFunctionDeclaration(); 990 } 1244 }); 1245 if (operatorFunctionDeclaration) 1246 return WTFMove(*operatorFunctionDeclaration); 1247 1248 return Unexpected<Error>(operatorFunctionDeclaration.error()); 991 1249 } 992 1250 993 1251 auto Parser::parseNativeFunctionDeclaration() -> Expected<AST::NativeFunctionDeclaration, Error> 994 1252 { 995 CONSUME_TYPE(native, Native); 996 PARSE(functionDeclaration, FunctionDeclaration); 997 CONSUME_TYPE(semicolon, Semicolon); 1253 Optional<Lexer::Token> origin; 1254 1255 auto native = consumeType(Lexer::Token::Type::Native); 1256 if (!native) 1257 return Unexpected<Error>(native.error()); 1258 if (!origin) 1259 origin = *native; 1260 1261 auto functionDeclaration = parseFunctionDeclaration(); 1262 if (!functionDeclaration) 1263 return Unexpected<Error>(functionDeclaration.error()); 1264 1265 auto semicolon = consumeType(Lexer::Token::Type::Semicolon); 1266 if (!semicolon) 1267 return Unexpected<Error>(semicolon.error()); 998 1268 999 1269 return AST::NativeFunctionDeclaration(WTFMove(*functionDeclaration)); … … 1002 1272 auto Parser::parseBlock() -> Expected<AST::Block, Error> 1003 1273 { 1004 CONSUME_TYPE(origin, LeftCurlyBracket); 1005 PARSE(result, BlockBody, WTFMove(*origin)); 1006 CONSUME_TYPE(rightCurlyBracket, RightCurlyBracket); 1007 return WTFMove(*result); 1008 } 1009 1010 auto Parser::parseBlockBody(Lexer::Token&& origin) -> Expected<AST::Block, Error> 1274 auto origin = consumeType(Lexer::Token::Type::LeftCurlyBracket); 1275 if (!origin) 1276 return Unexpected<Error>(origin.error()); 1277 1278 auto result = parseBlockBody(WTFMove(*origin)); 1279 1280 auto rightCurlyBracket = consumeType(Lexer::Token::Type::RightCurlyBracket); 1281 if (!rightCurlyBracket) 1282 return Unexpected<Error>(rightCurlyBracket.error()); 1283 1284 return WTFMove(result); 1285 } 1286 1287 AST::Block Parser::parseBlockBody(Lexer::Token&& origin) 1011 1288 { 1012 1289 AST::Statements statements; 1013 while (!peekTypes({Lexer::Token::Type::RightCurlyBracket, Lexer::Token::Type::Case, Lexer::Token::Type::Default})) { 1014 PARSE(statement, Statement); 1015 statements.append(WTFMove(*statement)); 1290 while (true) { 1291 auto statement = backtrackingScope<Expected<UniqueRef<AST::Statement>, Error>>([&]() { 1292 return parseStatement(); 1293 }); 1294 if (statement) 1295 statements.append(WTFMove(*statement)); 1296 else 1297 break; 1016 1298 } 1017 1299 return AST::Block(WTFMove(origin), WTFMove(statements)); … … 1020 1302 auto Parser::parseIfStatement() -> Expected<AST::IfStatement, Error> 1021 1303 { 1022 CONSUME_TYPE(origin, If); 1023 CONSUME_TYPE(leftParenthesis, LeftParenthesis); 1024 PARSE(conditional, Expression); 1025 CONSUME_TYPE(rightParenthesis, RightParenthesis); 1026 PARSE(body, Statement); 1304 auto origin = consumeType(Lexer::Token::Type::If); 1305 if (!origin) 1306 return Unexpected<Error>(origin.error()); 1307 1308 auto leftParenthesis = consumeType(Lexer::Token::Type::LeftParenthesis); 1309 if (!leftParenthesis) 1310 return Unexpected<Error>(leftParenthesis.error()); 1311 1312 auto conditional = parseExpression(); 1313 if (!conditional) 1314 return Unexpected<Error>(conditional.error()); 1315 1316 auto rightParenthesis = consumeType(Lexer::Token::Type::RightParenthesis); 1317 if (!rightParenthesis) 1318 return Unexpected<Error>(rightParenthesis.error()); 1319 1320 auto body = parseStatement(); 1321 if (!body) 1322 return Unexpected<Error>(body.error()); 1027 1323 1028 1324 Optional<UniqueRef<AST::Statement>> elseBody; 1029 1325 if (tryType(Lexer::Token::Type::Else)) { 1030 PARSE(parsedElseBody, Statement); 1326 auto parsedElseBody = parseStatement(); 1327 if (!parsedElseBody) 1328 return Unexpected<Error>(parsedElseBody.error()); 1031 1329 elseBody = WTFMove(*parsedElseBody); 1032 1330 } … … 1040 1338 auto Parser::parseSwitchStatement() -> Expected<AST::SwitchStatement, Error> 1041 1339 { 1042 CONSUME_TYPE(origin, Switch); 1043 CONSUME_TYPE(leftParenthesis, LeftParenthesis); 1044 PARSE(value, Expression); 1045 CONSUME_TYPE(rightParenthesis, RightParenthesis); 1046 CONSUME_TYPE(leftCurlyBracket, LeftCurlyBracket); 1340 auto origin = consumeType(Lexer::Token::Type::Switch); 1341 if (!origin) 1342 return Unexpected<Error>(origin.error()); 1343 1344 auto leftParenthesis = consumeType(Lexer::Token::Type::LeftParenthesis); 1345 if (!leftParenthesis) 1346 return Unexpected<Error>(leftParenthesis.error()); 1347 1348 auto value = parseExpression(); 1349 if (!value) 1350 return Unexpected<Error>(value.error()); 1351 1352 auto rightParenthesis = consumeType(Lexer::Token::Type::RightParenthesis); 1353 if (!rightParenthesis) 1354 return Unexpected<Error>(rightParenthesis.error()); 1355 1356 auto leftCurlyBracket = consumeType(Lexer::Token::Type::LeftCurlyBracket); 1357 if (!leftCurlyBracket) 1358 return Unexpected<Error>(leftCurlyBracket.error()); 1047 1359 1048 1360 Vector<AST::SwitchCase> switchCases; 1049 PEEK(nextToken); 1050 while (nextToken->type != Lexer::Token::Type::RightCurlyBracket) { 1051 PARSE(switchCase, SwitchCase); 1052 switchCases.append(WTFMove(*switchCase)); 1053 } 1054 1055 m_lexer.consumeToken(); 1361 while (true) { 1362 auto switchCase = backtrackingScope<Expected<AST::SwitchCase, Error>>([&]() { 1363 return parseSwitchCase(); 1364 }); 1365 if (switchCase) 1366 switchCases.append(WTFMove(*switchCase)); 1367 else 1368 break; 1369 } 1370 1371 auto rightCurlyBracket = consumeType(Lexer::Token::Type::RightCurlyBracket); 1372 if (!rightCurlyBracket) 1373 return Unexpected<Error>(rightCurlyBracket.error()); 1056 1374 1057 1375 return AST::SwitchStatement(WTFMove(*origin), WTFMove(*value), WTFMove(switchCases)); … … 1066 1384 switch (origin->type) { 1067 1385 case Lexer::Token::Type::Case: { 1068 PARSE(value, ConstantExpression); 1069 CONSUME_TYPE(colon, Colon); 1070 1071 PARSE(block, BlockBody, Lexer::Token(*origin)); 1072 1073 return AST::SwitchCase(WTFMove(*origin), WTFMove(*value), WTFMove(*block)); 1386 auto value = parseConstantExpression(); 1387 if (!value) 1388 return Unexpected<Error>(value.error()); 1389 1390 auto origin = consumeType(Lexer::Token::Type::Colon); 1391 if (!origin) 1392 return Unexpected<Error>(origin.error()); 1393 1394 auto block = parseBlockBody(Lexer::Token(*origin)); 1395 1396 return AST::SwitchCase(WTFMove(*origin), WTFMove(*value), WTFMove(block)); 1074 1397 } 1075 1398 default: { 1076 1399 ASSERT(origin->type == Lexer::Token::Type::Default); 1077 CONSUME_TYPE(colon, Colon); 1078 1079 PARSE(block, BlockBody, Lexer::Token(*origin)); 1080 1081 return AST::SwitchCase(WTFMove(*origin), WTF::nullopt, WTFMove(*block)); 1400 auto origin = consumeType(Lexer::Token::Type::Colon); 1401 if (!origin) 1402 return Unexpected<Error>(origin.error()); 1403 1404 auto block = parseBlockBody(Lexer::Token(*origin)); 1405 1406 return AST::SwitchCase(WTFMove(*origin), WTF::nullopt, WTFMove(block)); 1082 1407 } 1083 1408 } … … 1086 1411 auto Parser::parseForLoop() -> Expected<AST::ForLoop, Error> 1087 1412 { 1088 CONSUME_TYPE(origin, For); 1089 CONSUME_TYPE(leftParenthesis, LeftParenthesis); 1413 auto origin = consumeType(Lexer::Token::Type::For); 1414 if (!origin) 1415 return Unexpected<Error>(origin.error()); 1090 1416 1091 1417 auto parseRemainder = [&](Variant<AST::VariableDeclarationsStatement, UniqueRef<AST::Expression>>&& initialization) -> Expected<AST::ForLoop, Error> { 1092 CONSUME_TYPE(semicolon, Semicolon); 1093 1094 Optional<UniqueRef<AST::Expression>> condition = WTF::nullopt; 1095 if (!tryType(Lexer::Token::Type::Semicolon)) { 1418 auto semicolon = consumeType(Lexer::Token::Type::Semicolon); 1419 if (!semicolon) 1420 return Unexpected<Error>(semicolon.error()); 1421 1422 auto condition = backtrackingScope<Optional<UniqueRef<AST::Expression>>>([&]() -> Optional<UniqueRef<AST::Expression>> { 1096 1423 if (auto expression = parseExpression()) 1097 condition = { WTFMove(*expression) }; 1098 else 1099 return Unexpected<Error>(expression.error()); 1100 CONSUME_TYPE(secondSemicolon, Semicolon); 1101 } 1102 1103 Optional<UniqueRef<AST::Expression>> increment = WTF::nullopt; 1104 if (!tryType(Lexer::Token::Type::RightParenthesis)) { 1424 return { WTFMove(*expression) }; 1425 return WTF::nullopt; 1426 }); 1427 1428 semicolon = consumeType(Lexer::Token::Type::Semicolon); 1429 if (!semicolon) 1430 return Unexpected<Error>(semicolon.error()); 1431 1432 auto increment = backtrackingScope<Optional<UniqueRef<AST::Expression>>>([&]() -> Optional<UniqueRef<AST::Expression>> { 1105 1433 if (auto expression = parseExpression()) 1106 increment = { WTFMove(*expression) }; 1107 else 1108 return Unexpected<Error>(expression.error()); 1109 CONSUME_TYPE(rightParenthesis, RightParenthesis); 1110 } 1111 1112 PARSE(body, Statement); 1434 return { WTFMove(*expression) }; 1435 return WTF::nullopt; 1436 }); 1437 1438 auto rightParenthesis = consumeType(Lexer::Token::Type::RightParenthesis); 1439 if (!rightParenthesis) 1440 return Unexpected<Error>(rightParenthesis.error()); 1441 1442 auto body = parseStatement(); 1443 if (!body) 1444 return Unexpected<Error>(body.error()); 1113 1445 1114 1446 return AST::ForLoop(WTFMove(*origin), WTFMove(initialization), WTFMove(condition), WTFMove(increment), WTFMove(*body)); 1115 1447 }; 1116 1448 1449 auto leftParenthesis = consumeType(Lexer::Token::Type::LeftParenthesis); 1450 if (!leftParenthesis) 1451 return Unexpected<Error>(leftParenthesis.error()); 1452 1117 1453 auto variableDeclarations = backtrackingScope<Expected<AST::VariableDeclarationsStatement, Error>>([&]() { 1118 1454 return parseVariableDeclarations(); … … 1121 1457 return parseRemainder(WTFMove(*variableDeclarations)); 1122 1458 1123 PARSE(effectfulExpression, EffectfulExpression); 1459 auto effectfulExpression = parseEffectfulExpression(); 1460 if (!effectfulExpression) 1461 return Unexpected<Error>(effectfulExpression.error()); 1124 1462 1125 1463 return parseRemainder(WTFMove(*effectfulExpression)); … … 1128 1466 auto Parser::parseWhileLoop() -> Expected<AST::WhileLoop, Error> 1129 1467 { 1130 CONSUME_TYPE(origin, While); 1131 CONSUME_TYPE(leftParenthesis, LeftParenthesis); 1132 PARSE(conditional, Expression); 1133 CONSUME_TYPE(rightParenthesis, RightParenthesis); 1134 PARSE(body, Statement); 1468 auto origin = consumeType(Lexer::Token::Type::While); 1469 if (!origin) 1470 return Unexpected<Error>(origin.error()); 1471 1472 auto leftParenthesis = consumeType(Lexer::Token::Type::LeftParenthesis); 1473 if (!leftParenthesis) 1474 return Unexpected<Error>(leftParenthesis.error()); 1475 1476 auto conditional = parseExpression(); 1477 if (!conditional) 1478 return Unexpected<Error>(conditional.error()); 1479 1480 auto rightParenthesis = consumeType(Lexer::Token::Type::RightParenthesis); 1481 if (!rightParenthesis) 1482 return Unexpected<Error>(rightParenthesis.error()); 1483 1484 auto body = parseStatement(); 1485 if (!body) 1486 return Unexpected<Error>(body.error()); 1135 1487 1136 1488 return AST::WhileLoop(WTFMove(*origin), WTFMove(*conditional), WTFMove(*body)); … … 1139 1491 auto Parser::parseDoWhileLoop() -> Expected<AST::DoWhileLoop, Error> 1140 1492 { 1141 CONSUME_TYPE(origin, Do); 1142 PARSE(body, Statement); 1143 CONSUME_TYPE(whileKeyword, While); 1144 CONSUME_TYPE(leftParenthesis, LeftParenthesis); 1145 PARSE(conditional, Expression); 1146 CONSUME_TYPE(rightParenthesis, RightParenthesis); 1147 CONSUME_TYPE(semicolon, Semicolon); 1493 auto origin = consumeType(Lexer::Token::Type::Do); 1494 if (!origin) 1495 return Unexpected<Error>(origin.error()); 1496 1497 auto body = parseStatement(); 1498 if (!body) 1499 return Unexpected<Error>(body.error()); 1500 1501 auto whileKeyword = consumeType(Lexer::Token::Type::While); 1502 if (!whileKeyword) 1503 return Unexpected<Error>(whileKeyword.error()); 1504 1505 auto leftParenthesis = consumeType(Lexer::Token::Type::LeftParenthesis); 1506 if (!leftParenthesis) 1507 return Unexpected<Error>(leftParenthesis.error()); 1508 1509 auto conditional = parseExpression(); 1510 if (!conditional) 1511 return Unexpected<Error>(conditional.error()); 1512 1513 auto rightParenthesis = consumeType(Lexer::Token::Type::RightParenthesis); 1514 if (!rightParenthesis) 1515 return Unexpected<Error>(rightParenthesis.error()); 1148 1516 1149 1517 return AST::DoWhileLoop(WTFMove(*origin), WTFMove(*body), WTFMove(*conditional)); … … 1152 1520 auto Parser::parseVariableDeclaration(UniqueRef<AST::UnnamedType>&& type) -> Expected<AST::VariableDeclaration, Error> 1153 1521 { 1154 PEEK(origin); 1522 auto origin = peek(); 1523 if (!origin) 1524 return Unexpected<Error>(origin.error()); 1155 1525 1156 1526 auto qualifiers = parseQualifiers(); 1157 1527 1158 CONSUME_TYPE(name, Identifier); 1159 PARSE(semantic, Semantic); 1528 auto name = consumeType(Lexer::Token::Type::Identifier); 1529 if (!name) 1530 return Unexpected<Error>(name.error()); 1531 1532 if (tryType(Lexer::Token::Type::Colon)) { 1533 auto semantic = parseSemantic(); 1534 if (!semantic) 1535 return Unexpected<Error>(semantic.error()); 1536 1537 if (tryType(Lexer::Token::Type::EqualsSign)) { 1538 auto initializer = parseExpression(); 1539 if (!initializer) 1540 return Unexpected<Error>(initializer.error()); 1541 return AST::VariableDeclaration(WTFMove(*origin), WTFMove(qualifiers), { WTFMove(type) }, name->stringView.toString(), WTFMove(*semantic), WTFMove(*initializer)); 1542 } 1543 1544 return AST::VariableDeclaration(WTFMove(*origin), WTFMove(qualifiers), { WTFMove(type) }, name->stringView.toString(), WTFMove(*semantic), WTF::nullopt); 1545 } 1160 1546 1161 1547 if (tryType(Lexer::Token::Type::EqualsSign)) { 1162 PARSE(initializer, PossibleTernaryConditional); 1163 return AST::VariableDeclaration(WTFMove(*origin), WTFMove(qualifiers), { WTFMove(type) }, name->stringView.toString(), WTFMove(*semantic), WTFMove(*initializer)); 1164 } 1165 1166 return AST::VariableDeclaration(WTFMove(*origin), WTFMove(qualifiers), { WTFMove(type) }, name->stringView.toString(), WTFMove(*semantic), WTF::nullopt); 1548 auto initializer = parseExpression(); 1549 if (!initializer) 1550 return Unexpected<Error>(initializer.error()); 1551 return AST::VariableDeclaration(WTFMove(*origin), WTFMove(qualifiers), { WTFMove(type) }, name->stringView.toString(), WTF::nullopt, WTFMove(*initializer)); 1552 } 1553 1554 return AST::VariableDeclaration(WTFMove(*origin), WTFMove(qualifiers), { WTFMove(type) }, name->stringView.toString(), WTF::nullopt, WTF::nullopt); 1167 1555 } 1168 1556 1169 1557 auto Parser::parseVariableDeclarations() -> Expected<AST::VariableDeclarationsStatement, Error> 1170 1558 { 1171 PEEK(origin); 1172 1173 PARSE(type, Type); 1559 auto origin = peek(); 1560 if (!origin) 1561 return Unexpected<Error>(origin.error()); 1562 1563 auto type = parseType(); 1564 if (!type) 1565 return Unexpected<Error>(type.error()); 1174 1566 1175 1567 auto firstVariableDeclaration = parseVariableDeclaration((*type)->clone()); … … 1192 1584 auto Parser::parseStatement() -> Expected<UniqueRef<AST::Statement>, Error> 1193 1585 { 1194 PEEK(token);1195 switch (token->type) {1196 case Lexer::Token::Type::LeftCurlyBracket: {1197 PARSE(block, Block);1198 return { makeUniqueRef<AST::Block>(WTFMove(*block)) };1199 }1200 case Lexer::Token::Type::If: {1201 PARSE(ifStatement, IfStatement);1202 return { makeUniqueRef<AST::IfStatement>(WTFMove(*ifStatement)) };1203 }1204 case Lexer::Token::Type::Switch: {1205 PARSE(switchStatement, SwitchStatement);1206 return { makeUniqueRef<AST::SwitchStatement>(WTFMove(*switchStatement)) };1207 }1208 case Lexer::Token::Type::For: {1209 PARSE(forLoop, ForLoop);1210 return { makeUniqueRef<AST::ForLoop>(WTFMove(*forLoop)) };1211 }1212 case Lexer::Token::Type::While: {1213 PARSE(whileLoop, WhileLoop);1214 return { makeUniqueRef<AST::WhileLoop>(WTFMove(*whileLoop)) };1215 }1216 case Lexer::Token::Type::Do: {1217 PARSE(doWhileLoop, DoWhileLoop);1218 return { makeUniqueRef<AST::DoWhileLoop>(WTFMove(*doWhileLoop)) };1219 }1220 case Lexer::Token::Type::Break: {1221 auto breakToken = m_lexer.consumeToken();1222 CONSUME_TYPE(semicolon, Semicolon);1223 auto breakObject = AST::Break(WTFMove(*breakToken));1224 return { makeUniqueRef<AST::Break>(WTFMove(breakObject)) };1225 }1226 case Lexer::Token::Type::Continue: {1227 auto continueToken = m_lexer.consumeToken();1228 CONSUME_TYPE(semicolon, Semicolon);1229 auto continueObject = AST::Continue(WTFMove(*continueToken));1230 return { makeUniqueRef<AST::Continue>(WTFMove(continueObject)) };1231 }1232 case Lexer::Token::Type::Fallthrough: {1233 auto fallthroughToken = m_lexer.consumeToken();1234 CONSUME_TYPE(semicolon, Semicolon);1235 auto fallthroughObject = AST::Fallthrough(WTFMove(*fallthroughToken));1236 return { makeUniqueRef<AST::Fallthrough>(WTFMove(fallthroughObject)) };1237 }1238 case Lexer::Token::Type::Trap: {1239 auto trapToken = m_lexer.consumeToken();1240 CONSUME_TYPE(semicolon, Semicolon);1241 auto trapObject = AST::Trap(WTFMove(*trapToken));1242 return { makeUniqueRef<AST::Trap>(WTFMove(trapObject)) };1243 }1244 case Lexer::Token::Type::Return: {1245 auto returnToken = m_lexer.consumeToken();1246 if (auto semicolon = tryType(Lexer::Token::Type::Semicolon)) {1247 auto returnObject = AST::Return(WTFMove(*returnToken), WTF::nullopt);1248 return { makeUniqueRef<AST::Return>(WTFMove(returnObject)) };1249 }1250 PARSE(expression, Expression);1251 CONSUME_TYPE(finalSemicolon, Semicolon);1252 auto returnObject = AST::Return(WTFMove(*returnToken), { WTFMove(*expression) });1253 return { makeUniqueRef<AST::Return>(WTFMove(returnObject)) };1254 }1255 case Lexer::Token::Type::Constant:1256 case Lexer::Token::Type::Device:1257 case Lexer::Token::Type::Threadgroup:1258 case Lexer::Token::Type::Thread: {1259 PARSE(variableDeclarations, VariableDeclarations);1260 CONSUME_TYPE(semicolon, Semicolon);1261 return { makeUniqueRef<AST::VariableDeclarationsStatement>(WTFMove(*variableDeclarations)) };1262 }1263 case Lexer::Token::Type::Identifier: {1264 PEEK_FURTHER(nextToken);1265 switch (nextToken->type) {1266 case Lexer::Token::Type::Identifier:1267 case Lexer::Token::Type::LessThanSign:1268 case Lexer::Token::Type::Star:1269 case Lexer::Token::Type::Qualifier: {1270 PARSE(variableDeclarations, VariableDeclarations);1271 CONSUME_TYPE(semicolon, Semicolon);1272 return { makeUniqueRef<AST::VariableDeclarationsStatement>(WTFMove(*variableDeclarations)) };1273 }1274 default:1275 break;1276 }1277 break;1278 }1279 default:1280 break;1281 }1282 1283 1586 { 1284 auto effectfulExpression = backtrackingScope<Expected<UniqueRef<AST::Expression>, Error>>([&]() -> Expected<UniqueRef<AST::Expression>, Error> { 1285 PARSE(result, EffectfulExpression); 1286 CONSUME_TYPE(semicolon, Semicolon); 1587 auto block = backtrackingScope<Expected<AST::Block, Error>>([&]() { 1588 return parseBlock(); 1589 }); 1590 if (block) 1591 return { makeUniqueRef<AST::Block>(WTFMove(*block)) }; 1592 } 1593 1594 { 1595 auto ifStatement = backtrackingScope<Expected<AST::IfStatement, Error>>([&]() { 1596 return parseIfStatement(); 1597 }); 1598 if (ifStatement) 1599 return { makeUniqueRef<AST::IfStatement>(WTFMove(*ifStatement)) }; 1600 } 1601 1602 { 1603 auto switchStatement = backtrackingScope<Expected<AST::SwitchStatement, Error>>([&]() { 1604 return parseSwitchStatement(); 1605 }); 1606 if (switchStatement) 1607 return { makeUniqueRef<AST::SwitchStatement>(WTFMove(*switchStatement)) }; 1608 } 1609 1610 { 1611 auto forLoop = backtrackingScope<Expected<AST::ForLoop, Error>>([&]() { 1612 return parseForLoop(); 1613 }); 1614 if (forLoop) 1615 return { makeUniqueRef<AST::ForLoop>(WTFMove(*forLoop)) }; 1616 } 1617 1618 { 1619 auto whileLoop = backtrackingScope<Expected<AST::WhileLoop, Error>>([&]() { 1620 return parseWhileLoop(); 1621 }); 1622 if (whileLoop) 1623 return { makeUniqueRef<AST::WhileLoop>(WTFMove(*whileLoop)) }; 1624 } 1625 1626 { 1627 auto doWhileLoop = backtrackingScope<Expected<AST::DoWhileLoop, Error>>([&]() -> Expected<AST::DoWhileLoop, Error> { 1628 auto result = parseDoWhileLoop(); 1629 if (!result) 1630 return Unexpected<Error>(result.error()); 1631 1632 auto semicolon = consumeType(Lexer::Token::Type::Semicolon); 1633 if (!semicolon) 1634 return Unexpected<Error>(semicolon.error()); 1635 1287 1636 return result; 1288 1637 }); 1289 if (effectfulExpression) 1290 return { makeUniqueRef<AST::EffectfulExpressionStatement>(WTFMove(*effectfulExpression)) }; 1291 } 1292 1293 PARSE(variableDeclarations, VariableDeclarations); 1294 CONSUME_TYPE(semicolon, Semicolon); 1295 return { makeUniqueRef<AST::VariableDeclarationsStatement>(WTFMove(*variableDeclarations)) }; 1638 if (doWhileLoop) 1639 return { makeUniqueRef<AST::DoWhileLoop>(WTFMove(*doWhileLoop)) }; 1640 } 1641 1642 { 1643 auto breakObject = backtrackingScope<Expected<AST::Break, Error>>([&]() -> Expected<AST::Break, Error> { 1644 auto origin = consumeType(Lexer::Token::Type::Break); 1645 if (!origin) 1646 return Unexpected<Error>(origin.error()); 1647 1648 auto semicolon = consumeType(Lexer::Token::Type::Semicolon); 1649 if (!semicolon) 1650 return Unexpected<Error>(semicolon.error()); 1651 1652 return AST::Break(WTFMove(*origin)); 1653 }); 1654 if (breakObject) 1655 return { makeUniqueRef<AST::Break>(WTFMove(*breakObject)) }; 1656 } 1657 1658 { 1659 auto continueObject = backtrackingScope<Expected<AST::Continue, Error>>([&]() -> Expected<AST::Continue, Error> { 1660 auto origin = consumeType(Lexer::Token::Type::Continue); 1661 if (!origin) 1662 return Unexpected<Error>(origin.error()); 1663 1664 auto semicolon = consumeType(Lexer::Token::Type::Semicolon); 1665 if (!semicolon) 1666 return Unexpected<Error>(semicolon.error()); 1667 1668 return AST::Continue(WTFMove(*origin)); 1669 }); 1670 if (continueObject) 1671 return { makeUniqueRef<AST::Continue>(WTFMove(*continueObject)) }; 1672 } 1673 1674 { 1675 auto fallthroughObject = backtrackingScope<Expected<AST::Fallthrough, Error>>([&]() -> Expected<AST::Fallthrough, Error> { 1676 auto origin = consumeType(Lexer::Token::Type::Fallthrough); 1677 if (!origin) 1678 return Unexpected<Error>(origin.error()); 1679 1680 auto semicolon = consumeType(Lexer::Token::Type::Semicolon); 1681 if (!semicolon) 1682 return Unexpected<Error>(semicolon.error()); 1683 1684 return AST::Fallthrough(WTFMove(*origin)); 1685 }); 1686 if (fallthroughObject) 1687 return { makeUniqueRef<AST::Fallthrough>(WTFMove(*fallthroughObject)) }; 1688 } 1689 1690 { 1691 auto trapObject = backtrackingScope<Expected<AST::Trap, Error>>([&]() -> Expected<AST::Trap, Error> { 1692 auto origin = consumeType(Lexer::Token::Type::Trap); 1693 if (!origin) 1694 return Unexpected<Error>(origin.error()); 1695 1696 auto semicolon = consumeType(Lexer::Token::Type::Semicolon); 1697 if (!semicolon) 1698 return Unexpected<Error>(semicolon.error()); 1699 1700 return AST::Trap(WTFMove(*origin)); 1701 }); 1702 if (trapObject) 1703 return { makeUniqueRef<AST::Trap>(WTFMove(*trapObject)) }; 1704 } 1705 1706 { 1707 auto returnObject = backtrackingScope<Expected<AST::Return, Error>>([&]() -> Expected<AST::Return, Error> { 1708 auto origin = consumeType(Lexer::Token::Type::Return); 1709 if (!origin) 1710 return Unexpected<Error>(origin.error()); 1711 1712 if (auto semicolon = tryType(Lexer::Token::Type::Semicolon)) 1713 return AST::Return(WTFMove(*origin), WTF::nullopt); 1714 1715 auto expression = parseExpression(); 1716 if (!expression) 1717 return Unexpected<Error>(expression.error()); 1718 1719 auto semicolon = consumeType(Lexer::Token::Type::Semicolon); 1720 if (!semicolon) 1721 return Unexpected<Error>(semicolon.error()); 1722 1723 return AST::Return(WTFMove(*origin), { WTFMove(*expression) }); 1724 }); 1725 if (returnObject) 1726 return { makeUniqueRef<AST::Return>(WTFMove(*returnObject)) }; 1727 } 1728 1729 { 1730 auto variableDeclarations = backtrackingScope<Expected<AST::VariableDeclarationsStatement, Error>>([&]() -> Expected<AST::VariableDeclarationsStatement, Error> { 1731 auto result = parseVariableDeclarations(); 1732 if (!result) 1733 return Unexpected<Error>(result.error()); 1734 1735 auto semicolon = consumeType(Lexer::Token::Type::Semicolon); 1736 if (!semicolon) 1737 return Unexpected<Error>(semicolon.error()); 1738 1739 return result; 1740 }); 1741 if (variableDeclarations) 1742 return { makeUniqueRef<AST::VariableDeclarationsStatement>(WTFMove(*variableDeclarations)) }; 1743 } 1744 1745 auto effectfulExpression = backtrackingScope<Expected<UniqueRef<AST::Expression>, Error>>([&]() -> Expected<UniqueRef<AST::Expression>, Error> { 1746 auto result = parseEffectfulExpression(); 1747 if (!result) 1748 return Unexpected<Error>(result.error()); 1749 1750 auto semicolon = consumeType(Lexer::Token::Type::Semicolon); 1751 if (!semicolon) 1752 return Unexpected<Error>(semicolon.error()); 1753 1754 return result; 1755 }); 1756 if (effectfulExpression) 1757 return { makeUniqueRef<AST::EffectfulExpressionStatement>(WTFMove(*effectfulExpression)) }; 1758 1759 return Unexpected<Error>(effectfulExpression.error()); 1296 1760 } 1297 1761 1298 1762 auto Parser::parseEffectfulExpression() -> Expected<UniqueRef<AST::Expression>, Error> 1299 1763 { 1300 PEEK(origin); 1764 auto origin = peek(); 1765 if (!origin) 1766 return Unexpected<Error>(origin.error()); 1301 1767 1302 1768 Vector<UniqueRef<AST::Expression>> expressions; 1303 if (origin->type == Lexer::Token::Type::Semicolon) 1769 1770 auto first = backtrackingScope<Optional<UniqueRef<AST::Expression>>>([&]() -> Optional<UniqueRef<AST::Expression>> { 1771 auto effectfulExpression = parseEffectfulAssignment(); 1772 if (!effectfulExpression) 1773 return WTF::nullopt; 1774 return { WTFMove(*effectfulExpression) }; 1775 }); 1776 if (!first) 1304 1777 return { makeUniqueRef<AST::CommaExpression>(WTFMove(*origin), WTFMove(expressions)) }; 1305 1778 1306 PARSE(effectfulExpression, EffectfulAssignment); 1307 expressions.append(WTFMove(*effectfulExpression)); 1779 expressions.append(WTFMove(*first)); 1308 1780 1309 1781 while (tryType(Lexer::Token::Type::Comma)) { 1310 PARSE(expression, EffectfulAssignment); 1782 auto expression = parseEffectfulAssignment(); 1783 if (!expression) 1784 return Unexpected<Error>(expression.error()); 1311 1785 expressions.append(WTFMove(*expression)); 1312 1786 } … … 1319 1793 auto Parser::parseEffectfulAssignment() -> Expected<UniqueRef<AST::Expression>, Error> 1320 1794 { 1321 PEEK(origin); 1322 1323 bool isEffectful = false; 1324 PARSE(expression, PossiblePrefix, &isEffectful); 1325 1326 if (!isEffectful || peekTypes({ 1327 Lexer::Token::Type::EqualsSign, 1328 Lexer::Token::Type::PlusEquals, 1329 Lexer::Token::Type::MinusEquals, 1330 Lexer::Token::Type::TimesEquals, 1331 Lexer::Token::Type::DivideEquals, 1332 Lexer::Token::Type::ModEquals, 1333 Lexer::Token::Type::XorEquals, 1334 Lexer::Token::Type::AndEquals, 1335 Lexer::Token::Type::OrEquals, 1336 Lexer::Token::Type::RightShiftEquals, 1337 Lexer::Token::Type::LeftShiftEquals 1338 })) { 1339 return completeAssignment(WTFMove(*origin), WTFMove(*expression)); 1340 } 1341 1342 return expression; 1795 auto assignment = backtrackingScope<Expected<UniqueRef<AST::Expression>, Error>>([&]() { 1796 return parseAssignment(); 1797 }); 1798 if (assignment) 1799 return assignment; 1800 1801 assignment = backtrackingScope<Expected<UniqueRef<AST::Expression>, Error>>([&]() { 1802 return parseEffectfulPrefix(); 1803 }); 1804 if (assignment) 1805 return assignment; 1806 1807 return Unexpected<Error>(assignment.error()); 1808 } 1809 1810 auto Parser::parseEffectfulPrefix() -> Expected<UniqueRef<AST::Expression>, Error> 1811 { 1812 auto prefix = consumeTypes({ Lexer::Token::Type::PlusPlus, Lexer::Token::Type::MinusMinus }); 1813 if (!prefix) 1814 return parseEffectfulSuffix(); 1815 1816 auto previous = parsePossiblePrefix(); 1817 if (!previous) 1818 return Unexpected<Error>(previous.error()); 1819 1820 switch (prefix->type) { 1821 case Lexer::Token::Type::PlusPlus: { 1822 auto result = AST::ReadModifyWriteExpression::create(Lexer::Token(*prefix), WTFMove(*previous)); 1823 Vector<UniqueRef<AST::Expression>> callArguments; 1824 callArguments.append(result->oldVariableReference()); 1825 result->setNewValueExpression(makeUniqueRef<AST::CallExpression>(WTFMove(*prefix), "operator++"_str, WTFMove(callArguments))); 1826 result->setResultExpression(result->newVariableReference()); 1827 return { WTFMove(result) }; 1828 } 1829 default: { 1830 ASSERT(prefix->type == Lexer::Token::Type::MinusMinus); 1831 auto result = AST::ReadModifyWriteExpression::create(Lexer::Token(*prefix), WTFMove(*previous)); 1832 Vector<UniqueRef<AST::Expression>> callArguments; 1833 callArguments.append(result->oldVariableReference()); 1834 result->setNewValueExpression(makeUniqueRef<AST::CallExpression>(WTFMove(*prefix), "operator--"_str, WTFMove(callArguments))); 1835 result->setResultExpression(result->newVariableReference()); 1836 return { WTFMove(result) }; 1837 } 1838 } 1839 } 1840 1841 auto Parser::parseEffectfulSuffix() -> Expected<UniqueRef<AST::Expression>, Error> 1842 { 1843 auto effectfulSuffix = backtrackingScope<Expected<UniqueRef<AST::Expression>, Error>>([&]() -> Expected<UniqueRef<AST::Expression>, Error> { 1844 auto previous = parsePossibleSuffix(); 1845 if (!previous) 1846 return Unexpected<Error>(previous.error()); 1847 1848 auto suffix = consumeTypes({ Lexer::Token::Type::PlusPlus, Lexer::Token::Type::MinusMinus }); 1849 if (!suffix) 1850 return Unexpected<Error>(suffix.error()); 1851 1852 switch (suffix->type) { 1853 case Lexer::Token::Type::PlusPlus: { 1854 auto result = AST::ReadModifyWriteExpression::create(Lexer::Token(*suffix), WTFMove(*previous)); 1855 Vector<UniqueRef<AST::Expression>> callArguments; 1856 callArguments.append(result->oldVariableReference()); 1857 result->setNewValueExpression(makeUniqueRef<AST::CallExpression>(WTFMove(*suffix), "operator++"_str, WTFMove(callArguments))); 1858 result->setResultExpression(result->oldVariableReference()); 1859 return { WTFMove(result) }; 1860 } 1861 default: { 1862 ASSERT(suffix->type == Lexer::Token::Type::MinusMinus); 1863 auto result = AST::ReadModifyWriteExpression::create(Lexer::Token(*suffix), WTFMove(*previous)); 1864 Vector<UniqueRef<AST::Expression>> callArguments; 1865 callArguments.append(result->oldVariableReference()); 1866 result->setNewValueExpression(makeUniqueRef<AST::CallExpression>(WTFMove(*suffix), "operator--"_str, WTFMove(callArguments))); 1867 result->setResultExpression(result->oldVariableReference()); 1868 return { WTFMove(result) }; 1869 } 1870 } 1871 }); 1872 if (effectfulSuffix) 1873 return effectfulSuffix; 1874 1875 effectfulSuffix = backtrackingScope<Expected<UniqueRef<AST::Expression>, Error>>([&]() { 1876 return parseCallExpression(); 1877 }); 1878 if (effectfulSuffix) 1879 return effectfulSuffix; 1880 1881 effectfulSuffix = backtrackingScope<Expected<UniqueRef<AST::Expression>, Error>>([&]() -> Expected<UniqueRef<AST::Expression>, Error> { 1882 auto leftParenthesis = consumeType(Lexer::Token::Type::LeftParenthesis); 1883 if (!leftParenthesis) 1884 return Unexpected<Error>(leftParenthesis.error()); 1885 1886 auto expression = parseExpression(); 1887 if (!expression) 1888 return Unexpected<Error>(expression.error()); 1889 1890 auto rightParenthesis = consumeType(Lexer::Token::Type::RightParenthesis); 1891 if (!rightParenthesis) 1892 return Unexpected<Error>(rightParenthesis.error()); 1893 1894 return { WTFMove(*expression) }; 1895 }); 1896 if (effectfulSuffix) 1897 return effectfulSuffix; 1898 1899 return Unexpected<Error>(effectfulSuffix.error()); 1343 1900 } 1344 1901 … … 1423 1980 auto Parser::parseExpression() -> Expected<UniqueRef<AST::Expression>, Error> 1424 1981 { 1425 PEEK(origin); 1426 1427 PARSE(first, PossibleTernaryConditional); 1982 auto origin = peek(); 1983 if (!origin) 1984 return Unexpected<Error>(origin.error()); 1985 1986 auto first = parsePossibleTernaryConditional(); 1987 if (!first) 1988 return Unexpected<Error>(first.error()); 1989 1428 1990 Vector<UniqueRef<AST::Expression>> expressions; 1429 1991 expressions.append(WTFMove(*first)); 1430 1992 1431 1993 while (tryType(Lexer::Token::Type::Comma)) { 1432 PARSE(expression, PossibleTernaryConditional); 1994 auto expression = parsePossibleTernaryConditional(); 1995 if (!expression) 1996 return Unexpected<Error>(expression.error()); 1433 1997 expressions.append(WTFMove(*expression)); 1434 1998 } … … 1441 2005 auto Parser::parseTernaryConditional() -> Expected<UniqueRef<AST::Expression>, Error> 1442 2006 { 1443 PEEK(origin); 1444 1445 PARSE(predicate, PossibleLogicalBinaryOperation); 1446 1447 return completeTernaryConditional(WTFMove(*origin), WTFMove(*predicate)); 1448 } 1449 1450 auto Parser::completeTernaryConditional(Lexer::Token&& origin, UniqueRef<AST::Expression>&& predicate) -> Expected<UniqueRef<AST::Expression>, Error> 1451 { 1452 CONSUME_TYPE(questionMark, QuestionMark); 1453 PARSE(bodyExpression, Expression); 1454 CONSUME_TYPE(colon, Colon); 1455 PARSE(elseExpression, PossibleTernaryConditional); 2007 auto origin = peek(); 2008 if (!origin) 2009 return Unexpected<Error>(origin.error()); 2010 2011 auto predicate = parsePossibleLogicalBinaryOperation(); 2012 if (!predicate) 2013 return Unexpected<Error>(predicate.error()); 2014 2015 auto questionMark = consumeType(Lexer::Token::Type::QuestionMark); 2016 if (!questionMark) 2017 return Unexpected<Error>(questionMark.error()); 2018 2019 auto bodyExpression = parseExpression(); 2020 if (!bodyExpression) 2021 return Unexpected<Error>(bodyExpression.error()); 2022 2023 auto colon = consumeType(Lexer::Token::Type::Colon); 2024 if (!colon) 2025 return Unexpected<Error>(colon.error()); 2026 2027 auto elseExpression = parsePossibleTernaryConditional(); 2028 if (!elseExpression) 2029 return Unexpected<Error>(elseExpression.error()); 1456 2030 1457 2031 Vector<UniqueRef<AST::Expression>> castArguments; 1458 castArguments.append(WTFMove( predicate));1459 auto boolCast = makeUniqueRef<AST::CallExpression>(Lexer::Token( origin), "bool"_str, WTFMove(castArguments));1460 return { makeUniqueRef<AST::TernaryExpression>(WTFMove( origin), WTFMove(boolCast), WTFMove(*bodyExpression), WTFMove(*elseExpression)) };2032 castArguments.append(WTFMove(*predicate)); 2033 auto boolCast = makeUniqueRef<AST::CallExpression>(Lexer::Token(*origin), "bool"_str, WTFMove(castArguments)); 2034 return { makeUniqueRef<AST::TernaryExpression>(WTFMove(*origin), WTFMove(boolCast), WTFMove(*bodyExpression), WTFMove(*elseExpression)) }; 1461 2035 } 1462 2036 1463 2037 auto Parser::parseAssignment() -> Expected<UniqueRef<AST::Expression>, Error> 1464 2038 { 1465 PEEK(origin); 1466 1467 PARSE(left, PossiblePrefix); 1468 1469 return completeAssignment(WTFMove(*origin), WTFMove(*left)); 1470 } 1471 1472 auto Parser::completeAssignment(Lexer::Token&& origin, UniqueRef<AST::Expression>&& left) -> Expected<UniqueRef<AST::Expression>, Error> 1473 { 2039 auto origin = peek(); 2040 if (!origin) 2041 return Unexpected<Error>(origin.error()); 2042 2043 auto left = parsePossiblePrefix(); 2044 if (!left) 2045 return Unexpected<Error>(left.error()); 2046 1474 2047 auto assignmentOperator = consumeTypes({ 1475 2048 Lexer::Token::Type::EqualsSign, … … 1488 2061 return Unexpected<Error>(assignmentOperator.error()); 1489 2062 1490 PARSE(right, PossibleTernaryConditional); 2063 auto right = parsePossibleTernaryConditional(); 2064 if (!right) 2065 return Unexpected<Error>(right.error()); 1491 2066 1492 2067 if (assignmentOperator->type == Lexer::Token::Type::EqualsSign) 1493 return { makeUniqueRef<AST::AssignmentExpression>(WTFMove( origin), WTFMove(left), WTFMove(*right))};2068 return { makeUniqueRef<AST::AssignmentExpression>(WTFMove(*origin), WTFMove(*left), WTFMove(*right))}; 1494 2069 1495 2070 String name; … … 1528 2103 } 1529 2104 1530 auto result = AST::ReadModifyWriteExpression::create(Lexer::Token( origin), WTFMove(left));2105 auto result = AST::ReadModifyWriteExpression::create(Lexer::Token(*origin), WTFMove(*left)); 1531 2106 Vector<UniqueRef<AST::Expression>> callArguments; 1532 2107 callArguments.append(result->oldVariableReference()); 1533 2108 callArguments.append(WTFMove(*right)); 1534 result->setNewValueExpression(makeUniqueRef<AST::CallExpression>(WTFMove( origin), WTFMove(name), WTFMove(callArguments)));2109 result->setNewValueExpression(makeUniqueRef<AST::CallExpression>(WTFMove(*origin), WTFMove(name), WTFMove(callArguments))); 1535 2110 result->setResultExpression(result->newVariableReference()); 1536 2111 return { WTFMove(result) }; … … 1539 2114 auto Parser::parsePossibleTernaryConditional() -> Expected<UniqueRef<AST::Expression>, Error> 1540 2115 { 1541 PEEK(origin); 1542 1543 PARSE(expression, PossiblePrefix); 1544 1545 if (tryTypes({Lexer::Token::Type::EqualsSign, 1546 Lexer::Token::Type::PlusEquals, 1547 Lexer::Token::Type::MinusEquals, 1548 Lexer::Token::Type::TimesEquals, 1549 Lexer::Token::Type::DivideEquals, 1550 Lexer::Token::Type::ModEquals, 1551 Lexer::Token::Type::XorEquals, 1552 Lexer::Token::Type::AndEquals, 1553 Lexer::Token::Type::OrEquals, 1554 Lexer::Token::Type::RightShiftEquals, 1555 Lexer::Token::Type::LeftShiftEquals})) { 1556 return completeAssignment(WTFMove(*origin), WTFMove(*expression)); 1557 } 1558 1559 expression = completePossibleShift(WTFMove(*expression)); 1560 expression = completePossibleMultiply(WTFMove(*expression)); 1561 expression = completePossibleAdd(WTFMove(*expression)); 1562 expression = completePossibleRelationalBinaryOperation(WTFMove(*expression)); 1563 expression = completePossibleLogicalBinaryOperation(WTFMove(*expression)); 1564 1565 PEEK(nextToken); 1566 if (nextToken->type == Lexer::Token::Type::QuestionMark) 1567 return completeTernaryConditional(WTFMove(*origin), WTFMove(*expression)); 1568 return expression; 2116 auto ternaryExpression = backtrackingScope<Expected<UniqueRef<AST::Expression>, Error>>([&]() { 2117 return parseTernaryConditional(); 2118 }); 2119 if (ternaryExpression) 2120 return ternaryExpression; 2121 2122 auto assignmentExpression = backtrackingScope<Expected<UniqueRef<AST::Expression>, Error>>([&]() { 2123 return parseAssignment(); 2124 }); 2125 if (assignmentExpression) 2126 return assignmentExpression; 2127 2128 auto binaryOperation = backtrackingScope<Expected<UniqueRef<AST::Expression>, Error>>([&]() { 2129 return parsePossibleLogicalBinaryOperation(); 2130 }); 2131 if (binaryOperation) 2132 return binaryOperation; 2133 2134 return Unexpected<Error>(binaryOperation.error()); 1569 2135 } 1570 2136 1571 2137 auto Parser::parsePossibleLogicalBinaryOperation() -> Expected<UniqueRef<AST::Expression>, Error> 1572 2138 { 1573 PARSE(parsedPrevious, PossibleRelationalBinaryOperation); 1574 return completePossibleLogicalBinaryOperation(WTFMove(*parsedPrevious)); 1575 } 1576 1577 auto Parser::completePossibleLogicalBinaryOperation(UniqueRef<AST::Expression>&& previous) -> Expected<UniqueRef<AST::Expression>, Error> 1578 { 2139 auto parsedPrevious = parsePossibleRelationalBinaryOperation(); 2140 if (!parsedPrevious) 2141 return Unexpected<Error>(parsedPrevious.error()); 2142 UniqueRef<AST::Expression> previous = WTFMove(*parsedPrevious); 2143 1579 2144 while (auto logicalBinaryOperation = tryTypes({ 1580 2145 Lexer::Token::Type::OrOr, … … 1584 2149 Lexer::Token::Type::And 1585 2150 })) { 1586 PARSE(next, PossibleRelationalBinaryOperation); 2151 auto next = parsePossibleRelationalBinaryOperation(); 2152 if (!next) 2153 return Unexpected<Error>(next.error()); 1587 2154 1588 2155 switch (logicalBinaryOperation->type) { … … 1623 2190 auto Parser::parsePossibleRelationalBinaryOperation() -> Expected<UniqueRef<AST::Expression>, Error> 1624 2191 { 1625 PARSE(parsedPrevious, PossibleShift); 1626 return completePossibleRelationalBinaryOperation(WTFMove(*parsedPrevious)); 1627 } 1628 1629 auto Parser::completePossibleRelationalBinaryOperation(UniqueRef<AST::Expression>&& previous) -> Expected<UniqueRef<AST::Expression>, Error> 1630 { 2192 auto parsedPrevious = parsePossibleShift(); 2193 if (!parsedPrevious) 2194 return Unexpected<Error>(parsedPrevious.error()); 2195 UniqueRef<AST::Expression> previous = WTFMove(*parsedPrevious); 2196 1631 2197 while (auto relationalBinaryOperation = tryTypes({ 1632 2198 Lexer::Token::Type::LessThanSign, … … 1637 2203 Lexer::Token::Type::NotEqual 1638 2204 })) { 1639 PARSE(next, PossibleShift); 1640 1641 Vector<UniqueRef<AST::Expression>> callArguments; 1642 callArguments.append(WTFMove(previous)); 1643 callArguments.append(WTFMove(*next)); 2205 auto next = parsePossibleShift(); 2206 if (!next) 2207 return Unexpected<Error>(next.error()); 1644 2208 1645 2209 switch (relationalBinaryOperation->type) { 1646 2210 case Lexer::Token::Type::LessThanSign: { 2211 Vector<UniqueRef<AST::Expression>> callArguments; 2212 callArguments.append(WTFMove(previous)); 2213 callArguments.append(WTFMove(*next)); 1647 2214 previous = makeUniqueRef<AST::CallExpression>(WTFMove(*relationalBinaryOperation), "operator<"_str, WTFMove(callArguments)); 1648 2215 break; 1649 2216 } 1650 2217 case Lexer::Token::Type::GreaterThanSign: { 2218 Vector<UniqueRef<AST::Expression>> callArguments; 2219 callArguments.append(WTFMove(previous)); 2220 callArguments.append(WTFMove(*next)); 1651 2221 previous = makeUniqueRef<AST::CallExpression>(WTFMove(*relationalBinaryOperation), "operator>"_str, WTFMove(callArguments)); 1652 2222 break; 1653 2223 } 1654 2224 case Lexer::Token::Type::LessThanOrEqualTo: { 2225 Vector<UniqueRef<AST::Expression>> callArguments; 2226 callArguments.append(WTFMove(previous)); 2227 callArguments.append(WTFMove(*next)); 1655 2228 previous = makeUniqueRef<AST::CallExpression>(WTFMove(*relationalBinaryOperation), "operator<="_str, WTFMove(callArguments)); 1656 2229 break; 1657 2230 } 1658 2231 case Lexer::Token::Type::GreaterThanOrEqualTo: { 2232 Vector<UniqueRef<AST::Expression>> callArguments; 2233 callArguments.append(WTFMove(previous)); 2234 callArguments.append(WTFMove(*next)); 1659 2235 previous = makeUniqueRef<AST::CallExpression>(WTFMove(*relationalBinaryOperation), "operator>="_str, WTFMove(callArguments)); 1660 2236 break; 1661 2237 } 1662 2238 case Lexer::Token::Type::EqualComparison: { 2239 Vector<UniqueRef<AST::Expression>> callArguments; 2240 callArguments.append(WTFMove(previous)); 2241 callArguments.append(WTFMove(*next)); 1663 2242 previous = makeUniqueRef<AST::CallExpression>(WTFMove(*relationalBinaryOperation), "operator=="_str, WTFMove(callArguments)); 1664 2243 break; … … 1666 2245 default: { 1667 2246 ASSERT(relationalBinaryOperation->type == Lexer::Token::Type::NotEqual); 2247 Vector<UniqueRef<AST::Expression>> callArguments; 2248 callArguments.append(WTFMove(previous)); 2249 callArguments.append(WTFMove(*next)); 1668 2250 previous = makeUniqueRef<AST::CallExpression>(Lexer::Token(*relationalBinaryOperation), "operator=="_str, WTFMove(callArguments)); 1669 2251 previous = makeUniqueRef<AST::LogicalNotExpression>(WTFMove(*relationalBinaryOperation), WTFMove(previous)); … … 1678 2260 auto Parser::parsePossibleShift() -> Expected<UniqueRef<AST::Expression>, Error> 1679 2261 { 1680 PARSE(parsedPrevious, PossibleAdd); 1681 return completePossibleShift(WTFMove(*parsedPrevious)); 1682 } 1683 1684 auto Parser::completePossibleShift(UniqueRef<AST::Expression>&& previous) -> Expected<UniqueRef<AST::Expression>, Error> 1685 { 2262 auto parsedPrevious = parsePossibleAdd(); 2263 if (!parsedPrevious) 2264 return Unexpected<Error>(parsedPrevious.error()); 2265 UniqueRef<AST::Expression> previous = WTFMove(*parsedPrevious); 2266 1686 2267 while (auto shift = tryTypes({ 1687 2268 Lexer::Token::Type::LeftShift, 1688 2269 Lexer::Token::Type::RightShift 1689 2270 })) { 1690 PARSE(next, PossibleAdd); 1691 1692 Vector<UniqueRef<AST::Expression>> callArguments; 1693 callArguments.append(WTFMove(previous)); 1694 callArguments.append(WTFMove(*next)); 2271 auto next = parsePossibleAdd(); 2272 if (!next) 2273 return Unexpected<Error>(next.error()); 1695 2274 1696 2275 switch (shift->type) { 1697 2276 case Lexer::Token::Type::LeftShift: { 2277 Vector<UniqueRef<AST::Expression>> callArguments; 2278 callArguments.append(WTFMove(previous)); 2279 callArguments.append(WTFMove(*next)); 1698 2280 previous = makeUniqueRef<AST::CallExpression>(WTFMove(*shift), "operator<<"_str, WTFMove(callArguments)); 1699 2281 break; … … 1701 2283 default: { 1702 2284 ASSERT(shift->type == Lexer::Token::Type::RightShift); 2285 Vector<UniqueRef<AST::Expression>> callArguments; 2286 callArguments.append(WTFMove(previous)); 2287 callArguments.append(WTFMove(*next)); 1703 2288 previous = makeUniqueRef<AST::CallExpression>(WTFMove(*shift), "operator>>"_str, WTFMove(callArguments)); 1704 2289 break; … … 1712 2297 auto Parser::parsePossibleAdd() -> Expected<UniqueRef<AST::Expression>, Error> 1713 2298 { 1714 PARSE(parsedPrevious, PossibleMultiply); 1715 return completePossibleAdd(WTFMove(*parsedPrevious)); 1716 } 1717 1718 auto Parser::completePossibleAdd(UniqueRef<AST::Expression>&& previous) -> Expected<UniqueRef<AST::Expression>, Error> 1719 { 2299 auto parsedPrevious = parsePossibleMultiply(); 2300 if (!parsedPrevious) 2301 return Unexpected<Error>(parsedPrevious.error()); 2302 UniqueRef<AST::Expression> previous = WTFMove(*parsedPrevious); 2303 1720 2304 while (auto add = tryTypes({ 1721 2305 Lexer::Token::Type::Plus, 1722 2306 Lexer::Token::Type::Minus 1723 2307 })) { 1724 PARSE(next, PossibleMultiply); 1725 1726 Vector<UniqueRef<AST::Expression>> callArguments; 1727 callArguments.append(WTFMove(previous)); 1728 callArguments.append(WTFMove(*next)); 2308 auto next = parsePossibleMultiply(); 2309 if (!next) 2310 return Unexpected<Error>(next.error()); 1729 2311 1730 2312 switch (add->type) { 1731 2313 case Lexer::Token::Type::Plus: { 2314 Vector<UniqueRef<AST::Expression>> callArguments; 2315 callArguments.append(WTFMove(previous)); 2316 callArguments.append(WTFMove(*next)); 1732 2317 previous = makeUniqueRef<AST::CallExpression>(WTFMove(*add), "operator+"_str, WTFMove(callArguments)); 1733 2318 break; … … 1735 2320 default: { 1736 2321 ASSERT(add->type == Lexer::Token::Type::Minus); 2322 Vector<UniqueRef<AST::Expression>> callArguments; 2323 callArguments.append(WTFMove(previous)); 2324 callArguments.append(WTFMove(*next)); 1737 2325 previous = makeUniqueRef<AST::CallExpression>(WTFMove(*add), "operator-"_str, WTFMove(callArguments)); 1738 2326 break; … … 1746 2334 auto Parser::parsePossibleMultiply() -> Expected<UniqueRef<AST::Expression>, Error> 1747 2335 { 1748 PARSE(parsedPrevious, PossiblePrefix); 1749 return completePossibleMultiply(WTFMove(*parsedPrevious)); 1750 } 1751 1752 auto Parser::completePossibleMultiply(UniqueRef<AST::Expression>&& previous) -> Expected<UniqueRef<AST::Expression>, Error> 1753 { 2336 auto parsedPrevious = parsePossiblePrefix(); 2337 if (!parsedPrevious) 2338 return Unexpected<Error>(parsedPrevious.error()); 2339 UniqueRef<AST::Expression> previous = WTFMove(*parsedPrevious); 2340 1754 2341 while (auto multiply = tryTypes({ 1755 2342 Lexer::Token::Type::Star, … … 1757 2344 Lexer::Token::Type::Mod 1758 2345 })) { 1759 PARSE(next, PossiblePrefix); 1760 1761 Vector<UniqueRef<AST::Expression>> callArguments; 1762 callArguments.append(WTFMove(previous)); 1763 callArguments.append(WTFMove(*next)); 2346 auto next = parsePossiblePrefix(); 2347 if (!next) 2348 return Unexpected<Error>(next.error()); 1764 2349 1765 2350 switch (multiply->type) { 1766 2351 case Lexer::Token::Type::Star: { 2352 Vector<UniqueRef<AST::Expression>> callArguments; 2353 callArguments.append(WTFMove(previous)); 2354 callArguments.append(WTFMove(*next)); 1767 2355 previous = makeUniqueRef<AST::CallExpression>(WTFMove(*multiply), "operator*"_str, WTFMove(callArguments)); 1768 2356 break; 1769 2357 } 1770 2358 case Lexer::Token::Type::Divide: { 2359 Vector<UniqueRef<AST::Expression>> callArguments; 2360 callArguments.append(WTFMove(previous)); 2361 callArguments.append(WTFMove(*next)); 1771 2362 previous = makeUniqueRef<AST::CallExpression>(WTFMove(*multiply), "operator/"_str, WTFMove(callArguments)); 1772 2363 break; … … 1774 2365 default: { 1775 2366 ASSERT(multiply->type == Lexer::Token::Type::Mod); 2367 Vector<UniqueRef<AST::Expression>> callArguments; 2368 callArguments.append(WTFMove(previous)); 2369 callArguments.append(WTFMove(*next)); 1776 2370 previous = makeUniqueRef<AST::CallExpression>(WTFMove(*multiply), "operator%"_str, WTFMove(callArguments)); 1777 2371 break; … … 1783 2377 } 1784 2378 1785 auto Parser::parsePossiblePrefix( bool *isEffectful) -> Expected<UniqueRef<AST::Expression>, Error>2379 auto Parser::parsePossiblePrefix() -> Expected<UniqueRef<AST::Expression>, Error> 1786 2380 { 1787 2381 if (auto prefix = tryTypes({ … … 1796 2390 Lexer::Token::Type::Star 1797 2391 })) { 1798 PARSE(next, PossiblePrefix); 2392 auto next = parsePossiblePrefix(); 2393 if (!next) 2394 return Unexpected<Error>(next.error()); 1799 2395 1800 2396 switch (prefix->type) { 1801 2397 case Lexer::Token::Type::PlusPlus: { 1802 if (isEffectful)1803 *isEffectful = true;1804 2398 auto result = AST::ReadModifyWriteExpression::create(Lexer::Token(*prefix), WTFMove(*next)); 1805 2399 Vector<UniqueRef<AST::Expression>> callArguments; … … 1810 2404 } 1811 2405 case Lexer::Token::Type::MinusMinus: { 1812 if (isEffectful)1813 *isEffectful = true;1814 2406 auto result = AST::ReadModifyWriteExpression::create(Lexer::Token(*prefix), WTFMove(*next)); 1815 2407 Vector<UniqueRef<AST::Expression>> callArguments; … … 1850 2442 } 1851 2443 1852 return parsePossibleSuffix(isEffectful); 1853 } 1854 1855 auto Parser::parsePossibleSuffix(bool *isEffectful) -> Expected<UniqueRef<AST::Expression>, Error> 1856 { 1857 PEEK(token); 1858 PEEK_FURTHER(nextToken); 1859 1860 if (token->type == Lexer::Token::Type::Identifier && nextToken->type == Lexer::Token::Type::LeftParenthesis) { 1861 PARSE(expression, CallExpression); 1862 if (isEffectful) 1863 *isEffectful = true; 2444 return parsePossibleSuffix(); 2445 } 2446 2447 auto Parser::parsePossibleSuffix() -> Expected<UniqueRef<AST::Expression>, Error> 2448 { 2449 auto suffix = backtrackingScope<Expected<UniqueRef<AST::Expression>, Error>>([&]() -> Expected<UniqueRef<AST::Expression>, Error> { 2450 auto expression = parseCallExpression(); 2451 if (!expression) 2452 return Unexpected<Error>(expression.error()); 2453 1864 2454 while (true) { 1865 PEEK(suffixToken); 1866 if (suffixToken->type != Lexer::Token::Type::FullStop && suffixToken->type != Lexer::Token::Type::Arrow && suffixToken->type != Lexer::Token::Type::LeftSquareBracket) 2455 auto result = backtrackingScope<SuffixExpression>([&]() -> SuffixExpression { 2456 return parseLimitedSuffixOperator(WTFMove(*expression)); 2457 }); 2458 expression = WTFMove(result.result); 2459 if (!result) 1867 2460 break; 1868 auto result = parseLimitedSuffixOperator(WTFMove(*expression)); 2461 } 2462 return expression; 2463 }); 2464 if (suffix) 2465 return suffix; 2466 2467 suffix = backtrackingScope<Expected<UniqueRef<AST::Expression>, Error>>([&]() -> Expected<UniqueRef<AST::Expression>, Error> { 2468 auto expression = parseTerm(); 2469 if (!expression) 2470 return Unexpected<Error>(expression.error()); 2471 2472 while (true) { 2473 auto result = backtrackingScope<SuffixExpression>([&]() -> SuffixExpression { 2474 return parseSuffixOperator(WTFMove(*expression)); 2475 }); 1869 2476 expression = WTFMove(result.result); 2477 if (!result) 2478 break; 1870 2479 } 1871 2480 return expression; 1872 } 1873 1874 if (token->type == Lexer::Token::Type::LeftParenthesis && isEffectful) 1875 *isEffectful = true; 1876 1877 PARSE(expression, Term); 1878 bool isLastSuffixTokenEffectful = false; 1879 while (true) { 1880 PEEK(suffixToken); 1881 if (suffixToken->type != Lexer::Token::Type::FullStop 1882 && suffixToken->type != Lexer::Token::Type::Arrow 1883 && suffixToken->type != Lexer::Token::Type::LeftSquareBracket 1884 && suffixToken->type != Lexer::Token::Type::PlusPlus 1885 && suffixToken->type != Lexer::Token::Type::MinusMinus) { 1886 break; 1887 } 1888 isLastSuffixTokenEffectful = suffixToken->type == Lexer::Token::Type::PlusPlus || suffixToken->type == Lexer::Token::Type::MinusMinus; 1889 auto result = parseSuffixOperator(WTFMove(*expression)); 1890 expression = WTFMove(result.result); 1891 } 1892 if (isLastSuffixTokenEffectful && isEffectful) 1893 *isEffectful = true; 1894 return expression; 2481 }); 2482 if (suffix) 2483 return suffix; 2484 2485 return Unexpected<Error>(suffix.error()); 1895 2486 } 1896 2487 1897 2488 auto Parser::parseCallExpression() -> Expected<UniqueRef<AST::Expression>, Error> 1898 2489 { 1899 CONSUME_TYPE(name, Identifier); 2490 auto name = consumeType(Lexer::Token::Type::Identifier); 2491 if (!name) 2492 return Unexpected<Error>(name.error()); 1900 2493 auto callName = name->stringView.toString(); 1901 2494 1902 CONSUME_TYPE(leftParenthesis, LeftParenthesis); 2495 auto leftParenthesis = consumeType(Lexer::Token::Type::LeftParenthesis); 2496 if (!leftParenthesis) 2497 return Unexpected<Error>(leftParenthesis.error()); 1903 2498 1904 2499 Vector<UniqueRef<AST::Expression>> arguments; … … 1906 2501 return { makeUniqueRef<AST::CallExpression>(WTFMove(*name), WTFMove(callName), WTFMove(arguments)) }; 1907 2502 1908 PARSE(firstArgument, PossibleTernaryConditional); 2503 auto firstArgument = parsePossibleTernaryConditional(); 2504 if (!firstArgument) 2505 return Unexpected<Error>(firstArgument.error()); 1909 2506 arguments.append(WTFMove(*firstArgument)); 1910 2507 while (tryType(Lexer::Token::Type::Comma)) { 1911 PARSE(argument, PossibleTernaryConditional); 2508 auto argument = parsePossibleTernaryConditional(); 2509 if (!argument) 2510 return Unexpected<Error>(argument.error()); 1912 2511 arguments.append(WTFMove(*argument)); 1913 2512 } 1914 2513 1915 CONSUME_TYPE(rightParenthesis, RightParenthesis); 2514 auto rightParenthesis = consumeType(Lexer::Token::Type::RightParenthesis); 2515 if (!rightParenthesis) 2516 return Unexpected<Error>(rightParenthesis.error()); 1916 2517 1917 2518 return { makeUniqueRef<AST::CallExpression>(WTFMove(*name), WTFMove(callName), WTFMove(arguments)) }; … … 1964 2565 default: { 1965 2566 ASSERT(type->type == Lexer::Token::Type::LeftParenthesis); 1966 PARSE(expression, Expression); 1967 CONSUME_TYPE(rightParenthesis, RightParenthesis); 2567 auto expression = parseExpression(); 2568 if (!expression) 2569 return Unexpected<Error>(expression.error()); 2570 2571 auto rightParenthesis = consumeType(Lexer::Token::Type::RightParenthesis); 2572 if (!rightParenthesis) 2573 return Unexpected<Error>(rightParenthesis.error()); 1968 2574 1969 2575 return { WTFMove(*expression) }; -
trunk/Source/WebCore/Modules/webgpu/WHLSL/WHLSLParser.h
r246052 r246108 97 97 #include <wtf/Expected.h> 98 98 #include <wtf/Optional.h> 99 #include <wtf/PrintStream.h>100 99 101 100 namespace WebCore { … … 117 116 118 117 String error; 119 120 void dump(PrintStream& out) const121 {122 out.print(error);123 }124 118 }; 125 119 … … 127 121 128 122 private: 129 // FIXME: We should not need this130 // https://bugs.webkit.org/show_bug.cgi?id=198357131 123 template<typename T> T backtrackingScope(std::function<T()> callback) 132 124 { … … 145 137 Unexpected<Error> fail(const String& message, TryToPeek = TryToPeek::Yes); 146 138 Expected<Lexer::Token, Error> peek(); 147 Expected<Lexer::Token, Error> peekFurther();148 bool peekTypes(const Vector<Lexer::Token::Type>&);149 139 Optional<Lexer::Token> tryType(Lexer::Token::Type); 150 Optional<Lexer::Token> tryTypes( const Vector<Lexer::Token::Type>&);140 Optional<Lexer::Token> tryTypes(Vector<Lexer::Token::Type>); 151 141 Expected<Lexer::Token, Error> consumeType(Lexer::Token::Type); 152 Expected<Lexer::Token, Error> consumeTypes( const Vector<Lexer::Token::Type>&);142 Expected<Lexer::Token, Error> consumeTypes(Vector<Lexer::Token::Type>); 153 143 154 144 Expected<Variant<int, unsigned>, Error> consumeIntegralLiteral(); … … 176 166 Expected<AST::SpecializationConstantSemantic, Error> parseSpecializationConstantSemantic(); 177 167 Expected<AST::StageInOutSemantic, Error> parseStageInOutSemantic(); 178 Expected< Optional<AST::Semantic>, Error> parseSemantic();168 Expected<AST::Semantic, Error> parseSemantic(); 179 169 AST::Qualifiers parseQualifiers(); 180 170 Expected<AST::StructureElement, Error> parseStructureElement(); … … 187 177 Expected<AST::VariableDeclaration, Error> parseParameter(); 188 178 Expected<AST::VariableDeclarations, Error> parseParameters(); 189 Expected<AST::FunctionDeclaration, Error> parseComputeFunctionDeclaration(); 190 Expected<AST::FunctionDeclaration, Error> parseVertexOrFragmentFunctionDeclaration(); 179 Expected<AST::FunctionDeclaration, Error> parseEntryPointFunctionDeclaration(); 191 180 Expected<AST::FunctionDeclaration, Error> parseRegularFunctionDeclaration(); 192 181 Expected<AST::FunctionDeclaration, Error> parseOperatorFunctionDeclaration(); … … 196 185 197 186 Expected<AST::Block, Error> parseBlock(); 198 Expected<AST::Block, Error>parseBlockBody(Lexer::Token&& origin);187 AST::Block parseBlockBody(Lexer::Token&& origin); 199 188 Expected<AST::IfStatement, Error> parseIfStatement(); 200 189 Expected<AST::SwitchStatement, Error> parseSwitchStatement(); … … 209 198 Expected<UniqueRef<AST::Expression>, Error> parseEffectfulExpression(); 210 199 Expected<UniqueRef<AST::Expression>, Error> parseEffectfulAssignment(); 200 Expected<UniqueRef<AST::Expression>, Error> parseEffectfulPrefix(); 201 Expected<UniqueRef<AST::Expression>, Error> parseEffectfulSuffix(); 211 202 struct SuffixExpression { 212 203 SuffixExpression(UniqueRef<AST::Expression>&& result, bool success) … … 225 216 Expected<UniqueRef<AST::Expression>, Error> parseExpression(); 226 217 Expected<UniqueRef<AST::Expression>, Error> parseTernaryConditional(); 227 Expected<UniqueRef<AST::Expression>, Error> completeTernaryConditional(Lexer::Token&& origin, UniqueRef<AST::Expression>&& predicate);228 218 Expected<UniqueRef<AST::Expression>, Error> parseAssignment(); 229 Expected<UniqueRef<AST::Expression>, Error> completeAssignment(Lexer::Token&& origin, UniqueRef<AST::Expression>&& left);230 219 Expected<UniqueRef<AST::Expression>, Error> parsePossibleTernaryConditional(); 231 220 Expected<UniqueRef<AST::Expression>, Error> parsePossibleLogicalBinaryOperation(); 232 Expected<UniqueRef<AST::Expression>, Error> completePossibleLogicalBinaryOperation(UniqueRef<AST::Expression>&& previous);233 221 Expected<UniqueRef<AST::Expression>, Error> parsePossibleRelationalBinaryOperation(); 234 Expected<UniqueRef<AST::Expression>, Error> completePossibleRelationalBinaryOperation(UniqueRef<AST::Expression>&& previous);235 222 Expected<UniqueRef<AST::Expression>, Error> parsePossibleShift(); 236 Expected<UniqueRef<AST::Expression>, Error> completePossibleShift(UniqueRef<AST::Expression>&& previous);237 223 Expected<UniqueRef<AST::Expression>, Error> parsePossibleAdd(); 238 Expected<UniqueRef<AST::Expression>, Error> completePossibleAdd(UniqueRef<AST::Expression>&& previous);239 224 Expected<UniqueRef<AST::Expression>, Error> parsePossibleMultiply(); 240 Expected<UniqueRef<AST::Expression>, Error> completePossibleMultiply(UniqueRef<AST::Expression>&& previous); 241 Expected<UniqueRef<AST::Expression>, Error> parsePossiblePrefix(bool *isEffectful = nullptr); 242 Expected<UniqueRef<AST::Expression>, Error> parsePossibleSuffix(bool *isEffectful = nullptr); 225 Expected<UniqueRef<AST::Expression>, Error> parsePossiblePrefix(); 226 Expected<UniqueRef<AST::Expression>, Error> parsePossibleSuffix(); 243 227 Expected<UniqueRef<AST::Expression>, Error> parseCallExpression(); 244 228 Expected<UniqueRef<AST::Expression>, Error> parseTerm();
Note: See TracChangeset
for help on using the changeset viewer.