Separate syntax rules into flat lists of symbols
This way, every ParseItem can be associated with a particular production for its non-terminal. That lets us keep track of which productions are involved in shift/reduce conflicts.
This commit is contained in:
parent
68a0e16d1e
commit
52daffb3f3
37 changed files with 842 additions and 426 deletions
|
|
@ -10,22 +10,41 @@
|
|||
|
||||
namespace tree_sitter {
|
||||
|
||||
struct ProductionEntry {
|
||||
rules::Symbol symbol;
|
||||
int precedence;
|
||||
int rule_id;
|
||||
|
||||
bool operator==(const ProductionEntry &) const;
|
||||
};
|
||||
|
||||
class Production {
|
||||
public:
|
||||
std::vector<ProductionEntry> entries;
|
||||
int end_rule_id;
|
||||
Production(const std::vector<ProductionEntry> &, int);
|
||||
size_t size() const;
|
||||
const rules::Symbol &symbol_at(size_t) const;
|
||||
int precedence_at(size_t) const;
|
||||
int rule_id_at(size_t) const;
|
||||
};
|
||||
|
||||
std::ostream &operator<<(std::ostream &, const ProductionEntry &);
|
||||
std::ostream &operator<<(std::ostream &, const Production &);
|
||||
|
||||
class SyntaxGrammar {
|
||||
public:
|
||||
SyntaxGrammar();
|
||||
SyntaxGrammar(
|
||||
const std::vector<std::pair<std::string, rules::rule_ptr>> &rules,
|
||||
const std::vector<std::pair<std::string, rules::rule_ptr>> &aux_rules);
|
||||
SyntaxGrammar(
|
||||
const std::vector<std::pair<std::string, rules::rule_ptr>> &rules,
|
||||
const std::vector<std::pair<std::string, rules::rule_ptr>> &aux_rules,
|
||||
const std::vector<std::pair<std::string, std::vector<Production>>> &rules,
|
||||
const std::vector<std::pair<std::string, std::vector<Production>>> &aux_rules,
|
||||
const std::set<rules::Symbol> &ubiquitous_tokens);
|
||||
|
||||
const std::string &rule_name(const rules::Symbol &symbol) const;
|
||||
const rules::rule_ptr &rule(const rules::Symbol &symbol) const;
|
||||
|
||||
const std::vector<std::pair<std::string, rules::rule_ptr>> rules;
|
||||
const std::vector<std::pair<std::string, rules::rule_ptr>> aux_rules;
|
||||
const std::vector<Production> &productions(const rules::Symbol &) const;
|
||||
|
||||
std::vector<std::pair<std::string, std::vector<Production>>> rules;
|
||||
std::vector<std::pair<std::string, std::vector<Production>>> aux_rules;
|
||||
std::set<rules::Symbol> ubiquitous_tokens;
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue