From b86c1dc78ea8b4413fc37f241f06f44b393d72a2 Mon Sep 17 00:00:00 2001
From: Kia <kia@special-circumstanc.es>
Date: Fri, 21 Aug 2020 20:34:14 -0600
Subject: [PATCH] continue derivation tree work; it's not quite yet working

---
 CFGBoltzmann.py    | 25 +++++++++++++++++++++++--
 python_arborist.py | 38 +++++++++++++++++++++-----------------
 2 files changed, 44 insertions(+), 19 deletions(-)

diff --git a/CFGBoltzmann.py b/CFGBoltzmann.py
index d8589a2..fefd670 100644
--- a/CFGBoltzmann.py
+++ b/CFGBoltzmann.py
@@ -360,7 +360,7 @@ class CFGBoltzmann:
 
     def Gzero_shimmed(self, nonterminal, requested_length):
         nonterminal_index = self.nonterminals_ordered.index(nonterminal)
-        root_of_tree = TreeNode("START",[])
+        root_of_tree = TreeNode(nonterminal,[])
         operation_site_index = []
 
         return (self.Gzero(nonterminal_index, requested_length, 0, root_of_tree, operation_site_index), root_of_tree)
@@ -372,8 +372,14 @@ class CFGBoltzmann:
         # We already know we will have this nonterminal show up in our derivation tree; so we add it now
         # First, dereference the location to get the operation site:
 
-        #opsite = self.indexes_to_item(root_of_tree, operation_site_index)
+        opsite = self.indexes_to_item(root_of_tree, operation_site_index)
 
+        newnode = TreeNode(self.nonterminals_ordered[nonterminal_index], [])
+
+        opsite.subnodes.append(newnode)
+        operation_site_index.append(len(opsite.subnodes) - 1)
+
+        print("OSID", operation_site_index)
 
         generated_string = self.Gprim(nonterminal_index, chosen_production, 0, requested_length, depth,  root_of_tree, operation_site_index)
 
@@ -451,12 +457,27 @@ class CFGBoltzmann:
                 # CASE A
                 print("    "* depth +"GPRIM CASE A RETURNING", [xijk])
                 print("    "* depth +"Gprim ending the production of a nonterminal, with terminal", xijk)
+                opsite = self.indexes_to_item(root_of_tree, operation_site_index)
+
+                newnode = TreeNode(xijk, [])
+
+                opsite.subnodes.append(newnode)
+
+                print("OSID", operation_site_index)
+
                 return [xijk]
             else:
                 # CASE B
                 print("    "* depth +"GPRIM CASE B pointing @", [xijk])
                 reduct = self.Gprim(nonterminal_index, chosen_production, how_far_into_the_RHS + 1, exact_length_total - 1, depth+1,  root_of_tree, operation_site_index)
                 retstring = [xijk] + reduct
+                opsite = self.indexes_to_item(root_of_tree, operation_site_index)
+
+                newnode = TreeNode(xijk, [])
+
+                opsite.subnodes.append(newnode)
+                print("OSID", operation_site_index)
+
                 print("    "* depth +"Gprim inside the production of a nonterminal, adding terminal", xijk)
 
          #       print("    "* depth +"GPRIM CASE B RETURNING", retstring)
diff --git a/python_arborist.py b/python_arborist.py
index cdf3c1e..b1e755a 100644
--- a/python_arborist.py
+++ b/python_arborist.py
@@ -14,6 +14,24 @@ from combinatorial_LR_parser import MasterStateMachine
 
 import CFGBoltzmann
 
+class TreeNode:
+    def __init__(self, language_element, subnodes):
+        self.language_element = language_element
+        self.subnodes = subnodes
+
+    def __str__(self):
+        return str(hex_to_name(self.language_element)) + str(self.subnodes)
+
+
+def walk_the_tree(tree, level = 1):
+    if tree == None:
+        return
+
+    print("    " * (level -1) + "|---" + hex_to_name(tree.language_element) + " with " + str(len(tree.subnodes)) + " subnodes")
+    for subnode in tree.subnodes:
+        walk_the_tree(subnode, level + 1)
+
+
 class Cirno(Elaboratable):
     def __init__(self):
         self.input_memory_addr = Signal(8)
@@ -301,27 +319,13 @@ cooked_rules = z.preprocessor()
 bgen = z.Gzero_shimmed(EXPRESSION, 3)
 parse_me =  bgen[0]
 
+print("derivation tree was")
+walk_the_tree(bgen[1])
 parse_me.append(ENDOFPARSE)
 
 
 
 
-class TreeNode:
-    def __init__(self, language_element, subnodes):
-        self.language_element = language_element
-        self.subnodes = subnodes
-
-    def __str__(self):
-        return str(hex_to_name(self.language_element)) + str(self.subnodes)
-
-
-def walk_the_tree(tree, level = 1):
-    if tree == None:
-        return
-
-    print("    " * (level -1) + "|---" + hex_to_name(tree.language_element) + " with " + str(len(tree.subnodes)) + " subnodes")
-    for subnode in tree.subnodes:
-        walk_the_tree(subnode, level + 1)
 
 if __name__ == '__main__':
     m = Module()
@@ -433,6 +437,6 @@ def deserializer(serialized_array):
 the_tree = deserializer(serialized_tree_final)
 print(the_tree)
 
-walk_the_tree(the_tree)
+walk_the_tree(the_tree,0)
 
 print("THE ORIGINAL WAS", [hex_to_name(x) for x in parse_me])
-- 
GitLab