Make completion_status() a method on ParseItem
This commit is contained in:
parent
4850384b78
commit
e9be0ff24e
4 changed files with 99 additions and 59 deletions
|
|
@ -8,7 +8,6 @@
|
|||
#include "compiler/parse_table.h"
|
||||
#include "compiler/build_tables/parse_conflict_manager.h"
|
||||
#include "compiler/build_tables/parse_item.h"
|
||||
#include "compiler/build_tables/get_completion_status.h"
|
||||
#include "compiler/build_tables/get_metadata.h"
|
||||
#include "compiler/build_tables/item_set_closure.h"
|
||||
#include "compiler/lexical_grammar.h"
|
||||
|
|
@ -111,39 +110,19 @@ class ParseTableBuilder {
|
|||
}
|
||||
}
|
||||
|
||||
struct CompletionStatus {
|
||||
bool is_done;
|
||||
int precedence;
|
||||
rules::Associativity associativity;
|
||||
};
|
||||
|
||||
CompletionStatus get_completion_status(const ParseItem &item) {
|
||||
CompletionStatus result = { false, 0, rules::AssociativityNone };
|
||||
if (item.step_index == item.production->size()) {
|
||||
result.is_done = true;
|
||||
if (item.step_index > 0) {
|
||||
const ProductionStep &last_step =
|
||||
item.production->at(item.step_index - 1);
|
||||
result.precedence = last_step.precedence;
|
||||
result.associativity = last_step.associativity;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void add_reduce_actions(const ParseItemSet &item_set, ParseStateId state_id) {
|
||||
for (const auto &pair : item_set.entries) {
|
||||
const ParseItem &item = pair.first;
|
||||
const auto &lookahead_symbols = pair.second;
|
||||
|
||||
CompletionStatus completion_status = get_completion_status(item);
|
||||
if (completion_status.is_done) {
|
||||
ParseItem::CompletionStatus status = item.completion_status();
|
||||
if (status.is_done) {
|
||||
ParseAction action =
|
||||
(item.lhs() == rules::START())
|
||||
? ParseAction::Accept()
|
||||
: ParseAction::Reduce(Symbol(item.variable_index), item.step_index,
|
||||
completion_status.precedence,
|
||||
completion_status.associativity,
|
||||
status.precedence,
|
||||
status.associativity,
|
||||
*item.production);
|
||||
|
||||
for (const auto &lookahead_sym : *lookahead_symbols.entries)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue