From b7327c5ffa570a81416a53158de8c218a2c25b2d Mon Sep 17 00:00:00 2001
From: dgelessus <dgelessus@users.noreply.github.com>
Date: Fri, 10 May 2024 17:22:26 +0200
Subject: [PATCH] Skip generating Lexer state transitions that go to the same
 state

This saves a switch case for every non-transitioning state in a token's
state list. If a token has no state transitions at all (only a list of
allowed states), this eliminates the entire state transition switch.
---
 src/main/java/org/sablecc/sablecc/Transitions.java | 8 ++++++--
 src/main/java/org/sablecc/sablecc/lexer/Lexer.java | 5 -----
 2 files changed, 6 insertions(+), 7 deletions(-)

diff --git a/src/main/java/org/sablecc/sablecc/Transitions.java b/src/main/java/org/sablecc/sablecc/Transitions.java
index e612a83..56fd8c0 100644
--- a/src/main/java/org/sablecc/sablecc/Transitions.java
+++ b/src/main/java/org/sablecc/sablecc/Transitions.java
@@ -73,13 +73,17 @@ public class Transitions extends DepthFirstAdapter
   @Override
   public void outAStateList(AStateList node)
   {
-    map.put(state, transition);
+    if (!state.equals(transition)) {
+      map.put(state, transition);
+    }
   }
 
   @Override
   public void outAStateListTail(AStateListTail node)
   {
-    map.put(state, transition);
+    if (!state.equals(transition)) {
+      map.put(state, transition);
+    }
   }
 
   @Override
diff --git a/src/main/java/org/sablecc/sablecc/lexer/Lexer.java b/src/main/java/org/sablecc/sablecc/lexer/Lexer.java
index 32c197b..f8787a2 100644
--- a/src/main/java/org/sablecc/sablecc/lexer/Lexer.java
+++ b/src/main/java/org/sablecc/sablecc/lexer/Lexer.java
@@ -183,10 +183,6 @@ public class Lexer
 
                     case 0:
                         tok = new TPkgId(getText(acceptLength), startLine + 1, startPos + 1);
-                        switch(state.ordinal())
-                        {
-                            case 1: state = State.PACKAGE; break;
-                        }
                         break;
 
                     case 1:
@@ -257,7 +253,6 @@ public class Lexer
                         tok = new TSemicolon(startLine + 1, startPos + 1);
                         switch(state.ordinal())
                         {
-                            case 0: state = State.NORMAL; break;
                             case 1: state = State.NORMAL; break;
                         }
                         break;
-- 
GitLab