From 8157b81b68b7f267542e65c140147df8f5434c8a Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 22 Jun 2017 15:33:01 -0700 Subject: [PATCH] Improve logic for short-circuiting trivial lexing conflict detection --- .../build_tables/lex_table_builder.cc | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/compiler/build_tables/lex_table_builder.cc b/src/compiler/build_tables/lex_table_builder.cc index 6eb4f3cc..71553abb 100644 --- a/src/compiler/build_tables/lex_table_builder.cc +++ b/src/compiler/build_tables/lex_table_builder.cc @@ -114,24 +114,21 @@ class LexTableBuilderImpl : public LexTableBuilder { } bool detect_conflict(Symbol::Index left, Symbol::Index right) { - clear(); + StartingCharacterAggregator left_starting_characters; + StartingCharacterAggregator right_starting_characters; + left_starting_characters.apply(grammar.variables[left].rule); + right_starting_characters.apply(grammar.variables[right].rule); + if (!left_starting_characters.result.intersects(right_starting_characters.result) && + !left_starting_characters.result.intersects(separator_start_characters) && + !right_starting_characters.result.intersects(separator_start_characters)) { + return false; + } + clear(); map terminals; terminals[Symbol::terminal(left)]; terminals[Symbol::terminal(right)]; - - if (grammar.variables[left].is_string && grammar.variables[right].is_string) { - StartingCharacterAggregator left_starting_characters; - left_starting_characters.apply(grammar.variables[left].rule); - StartingCharacterAggregator right_starting_characters; - right_starting_characters.apply(grammar.variables[right].rule); - if (!(left_starting_characters.result == right_starting_characters.result)) { - return false; - } - } - add_lex_state(item_set_for_terminals(terminals)); - return shadowed_token_indices[right]; }