From d5a7832746f845d350ce59269dddf78f362180bd Mon Sep 17 00:00:00 2001
From: Robin Jadoul <robin.jadoul@gmail.com>
Date: Fri, 27 May 2016 16:11:11 +0200
Subject: [PATCH] Fix minimisation accepting state merging problem

---
 src/automata.cpp | 24 +++++++-----------------
 1 file changed, 7 insertions(+), 17 deletions(-)

diff --git a/src/automata.cpp b/src/automata.cpp
index 3f449d8..7a6bc74 100644
--- a/src/automata.cpp
+++ b/src/automata.cpp
@@ -140,6 +140,7 @@ namespace lxs {
 
             rev.numStates = d.numStates;
             rev.accepting = d.accepting;
+            rev.acceptingToken = d.acceptingToken;
             rev.starting = 0;
 
             for (const auto& stateTransPair : d.delta) {
@@ -195,6 +196,9 @@ namespace lxs {
                 for (State b = a + 1; b < rev.numStates; b++) {
                     if (rev.accepting.count(a) != rev.accepting.count(b)) {
                         q.push(std::make_pair(a, b));
+                    } else if (rev.accepting.count(a) && rev.acceptingToken[a] != rev.acceptingToken[b]) {
+                        //Do not merge accepting states that define different tokens, guaranteed problems...
+                        q.push(std::make_pair(a, b));
                     }
                 }
                 if (rev.accepting.count(a) != rev.accepting.count(deadState)) {
@@ -236,13 +240,6 @@ namespace lxs {
 
                 if (reachables.count(a) == 0 || done.count(a) > 0) continue;
 
-                Priority prior;
-                std::string acTok;
-                if (d.accepting.count(a) > 0) {
-                    prior = d.priority.find(a)->second;
-                    acTok = d.acceptingToken.find(a)->second;
-                }
-                
                 newStates[a] = cur;
                 if (a == deadState)
                     newStates[a] = deadState;
@@ -258,14 +255,6 @@ namespace lxs {
                             newStates[b] = cur;
                             if (b == deadState)
                                 newStates[b] = deadState;
-
-                            if (d.accepting.count(b) > 0) {
-                                Priority bprior = d.priority.find(b)->second;
-                                if (bprior < prior) {
-                                    prior = bprior;
-                                    acTok = d.acceptingToken.find(b)->second;
-                                }
-                            }
                         }
 
                         if (b == deadState)
@@ -274,9 +263,10 @@ namespace lxs {
                 }
                 
                 if (d.accepting.count(a) > 0) {
+                    //Since different accepting tokens should never be merged, there is no need to check the priorities
                     min.accepting.insert(cur);
-                    min.priority[cur] = prior;
-                    min.acceptingToken[cur] = acTok;
+                    min.priority[cur] = d.priority.find(a)->second;
+                    min.acceptingToken[cur] = d.acceptingToken.find(a)->second;
                 }
 
                 if (a != deadState) {