]> granicus.if.org Git - re2c/commitdiff
Stabilized the list of shadowing rules reported by [-Wunreachable-rules].
authorUlya Trofimovich <skvadrik@gmail.com>
Sat, 16 Jan 2016 23:07:17 +0000 (23:07 +0000)
committerUlya Trofimovich <skvadrik@gmail.com>
Sat, 16 Jan 2016 23:14:29 +0000 (23:14 +0000)
Before this commit, the list of rules depended on the order of NFA states
in each DFA state under construction (which is simply a matter of ordering
pointers to heap: the order can be different).

Now all rules for each DFA state are collected and the final choice of
rule is delayed until DFA is constructed, so the order of NFA states
no longer matters.

re2c/src/ir/dfa/determinization.cc
re2c/test/php20150211_json_scanner.igc.c
re2c/test/php20150211_zend_ini_scanner.c--emit-dot--flex-syntax--case-inverted.c
re2c/test/php20150211_zend_ini_scanner.igcd--flex-syntax--case-inverted.c
re2c/test/php20150211_zend_ini_scanner.igcd--skeleton--flex-syntax--case-inverted.c
re2c/test/php20150211_zend_ini_scanner_trimmed.ic--flex-syntax.c
re2c/test/php20150211_zend_ini_scanner_trimmed.icwb--flex-syntax.c

index 8886d36313a537e016881def7a376b426f03cdd9..813d5219943e2a48f31241ae8f27bd2e769e87fe 100644 (file)
@@ -93,6 +93,7 @@ dfa_t::dfa_t(const nfa_t &nfa, const charset_t &charset, rules_t &rules)
        : states()
        , nchars(charset.size() - 1) // (n + 1) bounds for n ranges
 {
+       std::map<size_t, std::set<RuleOp*> > s2rules;
        ord_hash_set_t kernels;
        nfa_state_t **const buffer = new nfa_state_t*[nfa.size];
        std::vector<std::vector<nfa_state_t*> > arcs(nchars);
@@ -128,28 +129,8 @@ dfa_t::dfa_t(const nfa_t &nfa, const charset_t &charset, rules_t &rules)
                                        s->ctx = true;
                                        break;
                                case nfa_state_t::FIN:
-                               {
-                                       RuleOp *rule = n->value.fin.rule;
-                                       if (!s->rule)
-                                       {
-                                               s->rule = rule;
-                                       }
-                                       else
-                                       {
-                                               const rule_rank_t r1 = s->rule->rank;
-                                               const rule_rank_t r2 = rule->rank;
-                                               if (r2 < r1)
-                                               {
-                                                       rules[r1].shadow.insert (r2);
-                                                       s->rule = rule;
-                                               }
-                                               else if (r1 < r2)
-                                               {
-                                                       rules[r2].shadow.insert (r1);
-                                               }
-                                       }
+                                       s2rules[i].insert(n->value.fin.rule);
                                        break;
-                               }
                                default:
                                        break;
                        }
@@ -172,6 +153,31 @@ dfa_t::dfa_t(const nfa_t &nfa, const charset_t &charset, rules_t &rules)
                }
        }
        delete[] buffer;
+
+       const size_t count = states.size();
+       for (size_t i = 0; i < count; ++i)
+       {
+               dfa_state_t *s = states[i];
+               std::set<RuleOp*> &rs = s2rules[i];
+               // for each final state: choose the rule with the smallest rank
+               for (std::set<RuleOp*>::const_iterator j = rs.begin(); j != rs.end(); ++j)
+               {
+                       RuleOp *rule = *j;
+                       if (!s->rule || rule->rank < s->rule->rank)
+                       {
+                               s->rule = rule;
+                       }
+               }
+               // other rules are shadowed by the chosen rule
+               for (std::set<RuleOp*>::const_iterator j = rs.begin(); j != rs.end(); ++j)
+               {
+                       RuleOp *rule = *j;
+                       if (s->rule != rule)
+                       {
+                               rules[rule->rank].shadow.insert(s->rule->rank);
+                       }
+               }
+       }
 }
 
 dfa_t::~dfa_t()
index 8f90726c31970063b13506c780578ee1a31b8f8f..278a7925eb8e8737323d2f2d66cb0261039762cf 100644 (file)
@@ -1260,6 +1260,6 @@ yy139:
 
 }
 
-re2c: warning: line 336: unreachable rule in condition 'STR_P1' (shadowed by rule at line 255) [-Wunreachable-rules]
-re2c: warning: line 336: unreachable rule in condition 'STR_P2' (shadowed by rule at line 334) [-Wunreachable-rules]
+re2c: warning: line 336: unreachable rule in condition 'STR_P1' (shadowed by rules at lines 204, 228, 232, 254, 255) [-Wunreachable-rules]
+re2c: warning: line 336: unreachable rule in condition 'STR_P2' (shadowed by rules at lines 297, 330, 334) [-Wunreachable-rules]
 re2c: warning: line 340: looks like you use hardcoded numbers instead of autogenerated condition names: better add '/*!types:re2c*/' directive or '-t, --type-header' option and don't rely on fixed condition order. [-Wcondition-order]
index 36a431889733fb3132f8a13f4eb59c6aaaaebbb0..3897c8548a5411490504e39e43ec4faf04284a7d 100644 (file)
@@ -590,8 +590,8 @@ re2c: warning: line 384: column 13: escape has no effect: '\.' [-Wuseless-escape
 re2c: warning: line 384: column 32: escape has no effect: '\.' [-Wuseless-escape]
 re2c: warning: line 391: column 27: escape has no effect: '\[' [-Wuseless-escape]
 re2c: warning: line 392: column 11: escape has no effect: '\[' [-Wuseless-escape]
-re2c: warning: line 648: unreachable rule in condition 'ST_DOUBLE_QUOTES' (shadowed by rule at line 587) [-Wunreachable-rules]
+re2c: warning: line 648: unreachable rule in condition 'ST_DOUBLE_QUOTES' (shadowed by rules at lines 582, 587) [-Wunreachable-rules]
 re2c: warning: line 623: unreachable rule in condition 'ST_OFFSET' (shadowed by rule at line 573) [-Wunreachable-rules]
-re2c: warning: line 648: unreachable rule in condition 'ST_RAW' (shadowed by rule at line 643) [-Wunreachable-rules]
+re2c: warning: line 648: unreachable rule in condition 'ST_RAW' (shadowed by rules at lines 500, 541, 643) [-Wunreachable-rules]
 re2c: warning: line 623: unreachable rule in condition 'ST_SECTION_VALUE' (shadowed by rule at line 573) [-Wunreachable-rules]
-re2c: warning: line 648: unreachable rule in condition 'ST_VALUE' (shadowed by rule at line 643) [-Wunreachable-rules]
+re2c: warning: line 648: unreachable rule in condition 'ST_VALUE' (shadowed by rules at lines 541, 547, 551, 559, 563, 569, 577, 623, 643) [-Wunreachable-rules]
index 5913933c05bf837d22f744dd84a1b4e31a10db9c..51aa1a8dd3316d977bbaa50629b597b33893bb34 100644 (file)
@@ -3853,9 +3853,9 @@ re2c: warning: line 384: column 13: escape has no effect: '\.' [-Wuseless-escape
 re2c: warning: line 384: column 32: escape has no effect: '\.' [-Wuseless-escape]
 re2c: warning: line 391: column 27: escape has no effect: '\[' [-Wuseless-escape]
 re2c: warning: line 392: column 11: escape has no effect: '\[' [-Wuseless-escape]
-re2c: warning: line 648: unreachable rule in condition 'ST_DOUBLE_QUOTES' (shadowed by rule at line 587) [-Wunreachable-rules]
+re2c: warning: line 648: unreachable rule in condition 'ST_DOUBLE_QUOTES' (shadowed by rules at lines 582, 587) [-Wunreachable-rules]
 re2c: warning: line 623: unreachable rule in condition 'ST_OFFSET' (shadowed by rule at line 573) [-Wunreachable-rules]
-re2c: warning: line 648: unreachable rule in condition 'ST_RAW' (shadowed by rule at line 643) [-Wunreachable-rules]
+re2c: warning: line 648: unreachable rule in condition 'ST_RAW' (shadowed by rules at lines 500, 541, 643) [-Wunreachable-rules]
 re2c: warning: line 623: unreachable rule in condition 'ST_SECTION_VALUE' (shadowed by rule at line 573) [-Wunreachable-rules]
-re2c: warning: line 648: unreachable rule in condition 'ST_VALUE' (shadowed by rule at line 643) [-Wunreachable-rules]
+re2c: warning: line 648: unreachable rule in condition 'ST_VALUE' (shadowed by rules at lines 541, 547, 551, 559, 563, 569, 577, 623, 643) [-Wunreachable-rules]
 re2c: warning: line 652: looks like you use hardcoded numbers instead of autogenerated condition names: better add '/*!types:re2c*/' directive or '-t, --type-header' option and don't rely on fixed condition order. [-Wcondition-order]
index d7b2236df9f64032f5bc359f2b65fab10ab2df6c..c0abe029c5ac417fb117875305207d7e52fd6654 100644 (file)
@@ -8045,8 +8045,8 @@ u\rv!w"x$y&z(\7f)
 re2c: warning: line 384: column 32: escape has no effect: '\.' [-Wuseless-escape]
 re2c: warning: line 391: column 27: escape has no effect: '\[' [-Wuseless-escape]
 re2c: warning: line 392: column 11: escape has no effect: '\[' [-Wuseless-escape]
-re2c: warning: line 648: unreachable rule in condition 'ST_DOUBLE_QUOTES' (shadowed by rule at line 587) [-Wunreachable-rules]
+re2c: warning: line 648: unreachable rule in condition 'ST_DOUBLE_QUOTES' (shadowed by rules at lines 582, 587) [-Wunreachable-rules]
 re2c: warning: line 623: unreachable rule in condition 'ST_OFFSET' (shadowed by rule at line 573) [-Wunreachable-rules]
-re2c: warning: line 648: unreachable rule in condition 'ST_RAW' (shadowed by rule at line 643) [-Wunreachable-rules]
+re2c: warning: line 648: unreachable rule in condition 'ST_RAW' (shadowed by rules at lines 500, 541, 643) [-Wunreachable-rules]
 re2c: warning: line 623: unreachable rule in condition 'ST_SECTION_VALUE' (shadowed by rule at line 573) [-Wunreachable-rules]
-re2c: warning: line 648: unreachable rule in condition 'ST_VALUE' (shadowed by rule at line 643) [-Wunreachable-rules]
+re2c: warning: line 648: unreachable rule in condition 'ST_VALUE' (shadowed by rules at lines 541, 547, 551, 559, 563, 569, 577, 623, 643) [-Wunreachable-rules]
index 05609848c9182b4af1db2d0d1695f82ff85decc2..7d2eabb7504a7763f38a71e46a3e5c2f60e13f5f 100644 (file)
@@ -3318,8 +3318,8 @@ re2c: warning: line 4: column 13: escape has no effect: '\.' [-Wuseless-escape]
 re2c: warning: line 4: column 32: escape has no effect: '\.' [-Wuseless-escape]
 re2c: warning: line 11: column 27: escape has no effect: '\[' [-Wuseless-escape]
 re2c: warning: line 12: column 11: escape has no effect: '\[' [-Wuseless-escape]
-re2c: warning: line 55: unreachable rule in condition 'ST_DOUBLE_QUOTES' (shadowed by rule at line 49) [-Wunreachable-rules]
+re2c: warning: line 55: unreachable rule in condition 'ST_DOUBLE_QUOTES' (shadowed by rules at lines 48, 49) [-Wunreachable-rules]
 re2c: warning: line 50: unreachable rule in condition 'ST_OFFSET' (shadowed by rule at line 46) [-Wunreachable-rules]
-re2c: warning: line 55: unreachable rule in condition 'ST_RAW' (shadowed by rule at line 54) [-Wunreachable-rules]
+re2c: warning: line 55: unreachable rule in condition 'ST_RAW' (shadowed by rules at lines 37, 39, 54) [-Wunreachable-rules]
 re2c: warning: line 50: unreachable rule in condition 'ST_SECTION_VALUE' (shadowed by rule at line 46) [-Wunreachable-rules]
-re2c: warning: line 55: unreachable rule in condition 'ST_VALUE' (shadowed by rule at line 54) [-Wunreachable-rules]
+re2c: warning: line 55: unreachable rule in condition 'ST_VALUE' (shadowed by rules at lines 39, 40, 41, 43, 44, 45, 47, 50, 54) [-Wunreachable-rules]
index ab43f7046cea68af2a3df6542c620c9f2b8b3f5f..3933db66327c6a7eddeb363772d07141794de633 100644 (file)
@@ -2880,9 +2880,9 @@ re2c: warning: line 4: column 13: escape has no effect: '\.' [-Wuseless-escape]
 re2c: warning: line 4: column 32: escape has no effect: '\.' [-Wuseless-escape]
 re2c: warning: line 11: column 27: escape has no effect: '\[' [-Wuseless-escape]
 re2c: warning: line 12: column 11: escape has no effect: '\[' [-Wuseless-escape]
-re2c: warning: line 55: unreachable rule in condition 'ST_DOUBLE_QUOTES' (shadowed by rule at line 49) [-Wunreachable-rules]
+re2c: warning: line 55: unreachable rule in condition 'ST_DOUBLE_QUOTES' (shadowed by rules at lines 48, 49) [-Wunreachable-rules]
 re2c: warning: line 50: unreachable rule in condition 'ST_OFFSET' (shadowed by rule at line 46) [-Wunreachable-rules]
-re2c: warning: line 55: unreachable rule in condition 'ST_RAW' (shadowed by rule at line 54) [-Wunreachable-rules]
+re2c: warning: line 55: unreachable rule in condition 'ST_RAW' (shadowed by rules at lines 37, 39, 54) [-Wunreachable-rules]
 re2c: warning: line 50: unreachable rule in condition 'ST_SECTION_VALUE' (shadowed by rule at line 46) [-Wunreachable-rules]
-re2c: warning: line 55: unreachable rule in condition 'ST_VALUE' (shadowed by rule at line 54) [-Wunreachable-rules]
+re2c: warning: line 55: unreachable rule in condition 'ST_VALUE' (shadowed by rules at lines 39, 40, 41, 43, 44, 45, 47, 50, 54) [-Wunreachable-rules]
 re2c: warning: line 56: looks like you use hardcoded numbers instead of autogenerated condition names: better add '/*!types:re2c*/' directive or '-t, --type-header' option and don't rely on fixed condition order. [-Wcondition-order]