您应该递归地访问表的单元格,并以与 S 节点相同的方式展开它们,直到所有内容都是终端(这样您就没有其他任何内容可以展开)。在您的示例中,您首先转到单元格 [0][2];这是一个终端,您无需执行任何操作。接下来转到[2][5],这是由[2][3]和[3][5]组成的非终结符。你访问[2][3],它是一个终端。 [3][5]是一个非终结符,由两个终结符组成。你完成了。这是一个 Python 演示:
class Node:
'''Think this as a cell in your table'''
def __init__(self, left, right, type, word):
self.left = left
self.right = right
self.type = type
self.word = word
# Declare terminals
t1 = Node(None,None,'MOD','can')
t2 = Node(None,None,'PRON','you')
t3 = Node(None,None,'VERB', 'eat')
t4 = Node(None,None,'DET', 'a')
t5 = Node(None,None,'NOUN','flower')
# Declare non-terminals
nt1 = Node(t1,t2, 'NP', None)
nt2 = Node(t4,t5, 'NP', None)
nt3 = Node(t3,nt2,'VP', None)
nt4 = Node(nt1,nt3,'S', None)
def unfold(node):
# Check for a terminal
if node.left == None and node.right == None:
return node.word+"_"+node.type
return "["+unfold(node.left)+" "+unfold(node.right)+"]_"+node.type
print unfold(nt4)
和输出:
[[can_MOD you_PRON]_NP [eat_VERB [a_DET flower_NOUN]_NP]_VP]_S