Identify fragile reductions at compile time

This commit is contained in:
Max Brunsfeld 2015-02-21 10:41:23 -08:00
parent a92067702d
commit 2d436cf141
13 changed files with 4843 additions and 4790 deletions

View file

@ -290,8 +290,12 @@ class CCodeGenerator {
add("SHIFT_EXTRA()");
break;
case ParseActionTypeReduce:
add("REDUCE(" + symbol_id(action.symbol) + ", " +
to_string(action.consumed_symbol_count) + ")");
if (reduce_action_is_fragile(action))
add("REDUCE_FRAGILE(" + symbol_id(action.symbol) + ", " +
to_string(action.consumed_symbol_count) + ")");
else
add("REDUCE(" + symbol_id(action.symbol) + ", " +
to_string(action.consumed_symbol_count) + ")");
break;
case ParseActionTypeReduceExtra:
add("REDUCE_EXTRA(" + symbol_id(action.symbol) + ")");
@ -339,6 +343,11 @@ class CCodeGenerator {
: syntax_grammar.rule_name(symbol);
}
bool reduce_action_is_fragile(const ParseAction &action) const {
return parse_table.fragile_production_ids.find(action.production_id) !=
parse_table.fragile_production_ids.end();
}
// C-code generation functions
void _switch(string condition, function<void()> body) {