From 4cdf03ed03fc2a105eb15411318b818aeb07b7d9 Mon Sep 17 00:00:00 2001
From: dgelessus <dgelessus@users.noreply.github.com>
Date: Fri, 21 Jul 2023 16:30:42 +0200
Subject: [PATCH] Try to optimize parser table lookups further

---
 .../org/sablecc/sablecc/parser/Parser.java    | 26 ++++++++++---------
 .../resources/org/sablecc/sablecc/parser.txt  | 26 ++++++++++---------
 2 files changed, 28 insertions(+), 24 deletions(-)

diff --git a/src/main/java/org/sablecc/sablecc/parser/Parser.java b/src/main/java/org/sablecc/sablecc/parser/Parser.java
index b44a61b..57fa0e1 100644
--- a/src/main/java/org/sablecc/sablecc/parser/Parser.java
+++ b/src/main/java/org/sablecc/sablecc/parser/Parser.java
@@ -123,25 +123,26 @@ public class Parser implements IParser
     private int goTo(int index)
     {
         int state = state();
+        int[][] table = gotoTable[index];
         int low = 1;
-        int high = gotoTable[index].length - 1;
-        int value = gotoTable[index][0][1];
+        int high = table.length - 1;
+        int value = table[0][1];
 
         while(low <= high)
         {
             int middle = (low + high) >>> 1;
 
-            if(state < gotoTable[index][middle][0])
+            if(state < table[middle][0])
             {
                 high = middle - 1;
             }
-            else if(state > gotoTable[index][middle][0])
+            else if(state > table[middle][0])
             {
                 low = middle + 1;
             }
             else
             {
-                value = gotoTable[index][middle][1];
+                value = table[middle][1];
                 break;
             }
         }
@@ -185,28 +186,29 @@ public class Parser implements IParser
             }
 
             int state = state();
-            int action = Parser.actionTable[state][0][1];
-            int destination = Parser.actionTable[state][0][2];
+            int[][] table = actionTable[state];
+            int action = table[0][1];
+            int destination = table[0][2];
 
             int low = 1;
-            int high = Parser.actionTable[state].length - 1;
+            int high = table.length - 1;
 
             while(low <= high)
             {
                 int middle = (low + high) >>> 1;
 
-                if(index < Parser.actionTable[state][middle][0])
+                if(index < table[middle][0])
                 {
                     high = middle - 1;
                 }
-                else if(index > Parser.actionTable[state][middle][0])
+                else if(index > table[middle][0])
                 {
                     low = middle + 1;
                 }
                 else
                 {
-                    action = Parser.actionTable[state][middle][1];
-                    destination = Parser.actionTable[state][middle][2];
+                    action = table[middle][1];
+                    destination = table[middle][2];
                     break;
                 }
             }
diff --git a/src/main/resources/org/sablecc/sablecc/parser.txt b/src/main/resources/org/sablecc/sablecc/parser.txt
index 3d1db58..f87cb07 100644
--- a/src/main/resources/org/sablecc/sablecc/parser.txt
+++ b/src/main/resources/org/sablecc/sablecc/parser.txt
@@ -155,25 +155,26 @@ Macro:ParserCommon
     private int goTo(int index)
     {
         int state = state();
+        int[][] table = gotoTable[index];
         int low = 1;
-        int high = gotoTable[index].length - 1;
-        int value = gotoTable[index][0][1];
+        int high = table.length - 1;
+        int value = table[0][1];
 
         while(low <= high)
         {
             int middle = (low + high) >>> 1;
 
-            if(state < gotoTable[index][middle][0])
+            if(state < table[middle][0])
             {
                 high = middle - 1;
             }
-            else if(state > gotoTable[index][middle][0])
+            else if(state > table[middle][0])
             {
                 low = middle + 1;
             }
             else
             {
-                value = gotoTable[index][middle][1];
+                value = table[middle][1];
                 break;
             }
         }
@@ -217,28 +218,29 @@ Macro:ParserCommon
             }
 
             int state = state();
-            int action = Parser.actionTable[state][0][1];
-            int destination = Parser.actionTable[state][0][2];
+            int[][] table = actionTable[state];
+            int action = table[0][1];
+            int destination = table[0][2];
 
             int low = 1;
-            int high = Parser.actionTable[state].length - 1;
+            int high = table.length - 1;
 
             while(low <= high)
             {
                 int middle = (low + high) >>> 1;
 
-                if(index < Parser.actionTable[state][middle][0])
+                if(index < table[middle][0])
                 {
                     high = middle - 1;
                 }
-                else if(index > Parser.actionTable[state][middle][0])
+                else if(index > table[middle][0])
                 {
                     low = middle + 1;
                 }
                 else
                 {
-                    action = Parser.actionTable[state][middle][1];
-                    destination = Parser.actionTable[state][middle][2];
+                    action = table[middle][1];
+                    destination = table[middle][2];
                     break;
                 }
             }
-- 
GitLab