5#ifndef V8_TORQUE_EARLEY_PARSER_H_
6#define V8_TORQUE_EARLEY_PARSER_H_
29 const T&
Cast()
const;
50 kOptionalIdentifierPtr,
54 kOptionalTypeExpressionPtr,
56 kNameAndTypeExpression,
58 kStdVectorOfEnumEntry,
60 kOptionalImplicitParameters,
65 kOptionalAnnotationParameter,
66 kClassFieldExpression,
67 kStructFieldExpression,
69 kStdVectorOfNameAndTypeExpression,
70 kStdVectorOfNameAndExpression,
71 kStdVectorOfClassFieldExpression,
72 kStdVectorOfStructFieldExpression,
73 kStdVectorOfBitFieldDeclaration,
74 kIncrementDecrementOperator,
76 kStdVectorOfStatementPtr,
77 kStdVectorOfDeclarationPtr,
78 kStdVectorOfStdVectorOfDeclarationPtr,
79 kStdVectorOfExpressionPtr,
80 kExpressionWithSource,
85 kStdVectorOfLabelAndTypes,
86 kStdVectorOfTryHandlerPtr,
87 kOptionalStatementPtr,
88 kOptionalExpressionPtr,
90 kStdVectorOfTypeswitchCase,
91 kStdVectorOfIdentifierPtr,
98 kStdVectorOfJsonValue,
99 kStdVectorOfJsonMember,
143 return std::move(
value_->Cast<T>());
147 std::unique_ptr<ParseResultHolderBase>
value_;
198 if (!child_results->
HasNext())
return std::nullopt;
199 return child_results->
Next();
202template <
class T, Action action>
205 auto result = action(child_results);
207 return ParseResult{std::vector<T>{(*result).Cast<T>()}};
215 explicit Rule(std::vector<Symbol*> right_hand_side,
249 Symbol(std::initializer_list<Rule> rules) { *
this = rules; }
262 rules_.push_back(std::make_unique<Rule>(
rule));
263 rules_.back()->SetLeftHandSide(
this);
270 std::vector<std::unique_ptr<Rule>>
rules_;
307 DCHECK(child->IsComplete());
319 std::vector<const Item*>
Children()
const;
332 return {
start.begin,
end.end, combined};
338 return rule_ == other.rule_ &&
mark_ == other.mark_ &&
348 const std::vector<Symbol*>&
right()
const {
return rule_->right(); }
366 return item->
rule()->RunAction(item, tokens);
375 std::unordered_set<Item, base::hash<Item>> table;
377 return start->RunAction(final_item, tokens);
422 std::optional<ParseResult>
Parse(
const std::string& input) {
435 auto symbol = std::make_unique<Symbol>(rules);
463 template <
class T, T value>
475 template <
class From,
class To>
484 template <
class T,
class Result = T>
493 T
x = child_results->
NextAs<T>();
495 result.push_back(std::move(
x));
502 std::vector<T> l = child_results->
NextAs<std::vector<T>>();
503 T
x = child_results->
NextAs<T>();
504 l.push_back(std::move(
x));
Lexer::PatternFunction PatternFunction
std::vector< std::unique_ptr< Symbol > > generated_symbols_
static std::optional< ParseResult > MakeSingletonVector(ParseResultIterator *child_results)
void SetWhitespace(PatternFunction ws)
Symbol * Pattern(PatternFunction pattern)
Symbol * CheckIf(Symbol *x)
static std::optional< ParseResult > CastParseResult(ParseResultIterator *child_results)
Symbol * TryOrDefault(Symbol *s)
Symbol * NonemptyList(Symbol *element, std::optional< Symbol * > separator={})
static std::optional< ParseResult > YieldDefaultValue(ParseResultIterator *child_results)
Symbol * Sequence(std::vector< Symbol * > symbols)
static std::optional< ParseResult > YieldMatchedInput(ParseResultIterator *child_results)
static std::optional< ParseResult > MakeExtendedVector(ParseResultIterator *child_results)
std::optional< ParseResult > Parse(const std::string &input)
Symbol * List(Symbol *element, std::optional< Symbol * > separator={})
static V8_EXPORT_PRIVATE bool MatchAnyChar(InputPosition *pos)
Symbol * Optional(Symbol *x)
Symbol * Token(const std::string &s)
static std::optional< ParseResult > YieldIntegralConstant(ParseResultIterator *child_results)
static V8_EXPORT_PRIVATE bool MatchString(const char *s, InputPosition *pos)
static V8_EXPORT_PRIVATE bool MatchChar(int(*char_class)(int), InputPosition *pos)
Symbol * NewSymbol(std::initializer_list< Rule > rules={})
friend size_t hash_value(const Item &i)
std::string SplitByChildren(const LexerResult &tokens) const
const Rule * rule() const
bool operator==(const Item &other) const
Symbol * NextSymbol() const
Item Advance(size_t new_pos, const Item *child=nullptr) const
Item(const Rule *rule, size_t mark, size_t start, size_t pos)
const std::vector< Symbol * > & right() const
void CheckAmbiguity(const Item &other, const LexerResult &tokens) const
std::vector< const Item * > Children() const
MatchedInput GetMatchedInput(const LexerResult &tokens) const
bool(*)(InputPosition *pos) PatternFunction
Symbol * MatchToken(InputPosition *pos, InputPosition end)
std::map< PatternFunction, Symbol > patterns_
Symbol * Token(const std::string &keyword)
void SetWhitespace(PatternFunction whitespace)
V8_EXPORT_PRIVATE LexerResult RunLexer(const std::string &input)
PatternFunction match_whitespace_
Symbol * Pattern(PatternFunction pattern)
std::map< std::string, Symbol > keywords_
virtual ~ParseResultHolderBase()=default
ParseResultHolderBase(TypeId type_id)
static V8_EXPORT_PRIVATE const TypeId id
ParseResultHolder(T value)
std::vector< ParseResult > results_
ParseResultIterator(std::vector< ParseResult > results, MatchedInput matched_input)
MatchedInput matched_input_
const MatchedInput & matched_input() const
ParseResultIterator & operator=(const ParseResultIterator &)=delete
ParseResultIterator(const ParseResultIterator &)=delete
std::unique_ptr< ParseResultHolderBase > value_
void SetLeftHandSide(Symbol *left_hand_side)
Rule(std::vector< Symbol * > right_hand_side, Action action=DefaultAction)
std::vector< Symbol * > right_hand_side_
V8_EXPORT_PRIVATE std::optional< ParseResult > RunAction(const Item *completed_item, const LexerResult &tokens) const
const std::vector< Symbol * > & right() const
Symbol & operator=(const Symbol &)=delete
V8_EXPORT_PRIVATE std::optional< ParseResult > RunAction(const Item *item, const LexerResult &tokens)
Rule * rule(size_t index) const
Symbol(const Symbol &)=delete
size_t rule_number() const
std::vector< std::unique_ptr< Rule > > rules_
Symbol(std::initializer_list< Rule > rules)
void AddRule(const Rule &rule)
ZoneVector< RpoNumber > & result
V8_INLINE size_t hash_combine(size_t seed, size_t hash)
std::optional< ParseResult > ParseTokens(Symbol *start, const LexerResult &tokens)
std::optional< ParseResult > DefaultAction(ParseResultIterator *child_results)
const char * InputPosition
std::optional< ParseResult >(*)(ParseResultIterator *child_results) Action
Action AsSingletonVector()
const Item * RunEarleyAlgorithm(Symbol *start, const LexerResult &tokens, std::unordered_set< Item, base::hash< Item > > *processed)
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
#define DCHECK_LE(v1, v2)
#define CHECK_LT(lhs, rhs)
#define DCHECK_NOT_NULL(val)
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)
#define V8_EXPORT_PRIVATE
std::vector< MatchedInput > token_contents
std::vector< Symbol * > token_symbols