diff --git a/CFGBoltzmann.py b/CFGBoltzmann.py index d8589a21c454e0808b0df1ffeeab727370e5287a..fefd67097483002afdeaf89be21813243e38baf6 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 cdf3c1ec6689ee839145bc4eb2f7ccc9443721e5..b1e755a347dbe24a7c071ba0682da8f936ebe14d 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])