2013-10-16 78 views
0

結構我試圖解析看起來像這樣:解析與PLY組的樹Yacc的

group "a" [ 
    group "b" [ 
     group "c" [ 
     ] 
    ] 
    group "d" [ 
    ] 
] 

和語法:

def p_group(p): 
    '''group : GROUP string subgroups''' 
    p[0] = DNAGroup(p[2]) 
    for sgroup in p[3]: 
     print p[0].getName(), "subgroup ", sgroup.getName() 
     p[0].add(sgroup) 
     sgroup.setParent(p[0]) 

def p_subgroups(p): 
    '''subgroups : "[" group 
        | subgroups group 
        | subgroups "]" 
        | "[" "]"''' 
    if p[0] is None: 
     p[0] = [] 
    if p[2] != ']': 
     p[0] += [p[2]] 

每個家長有子女組的列表,並且每個孩子都有一個對其父母的引用。我似乎無法讓語法沒有移位/減少衝突,也沒有正確解析。

回答

1

問題在於子組的定義:在子組狀態中,標記GROUP可能導致移位或縮小(移位將這作爲一個新組進行解析,減少識別子組處理並離開GROUP被重新掃描以創建一個新組),並且令牌']'也可以導致轉移或減少(類似的推理)。

我覺得你的目的就是這樣,你也可以重寫此爲:

subgroups : "[" sublist_opt "]" 

有:

sublist_opt : group sublist_opt 
      | empty 

(我離開你填寫此語法片段的Python代碼)。

+0

這就爲符號組,子組和subgroup_opt帶來了無限的遞歸錯誤(你稱之爲sublist_opt,我剛剛重命名了它) – Avery3R

+0

遞歸錯誤是因爲我缺少一個空的規則。這是有效的,除了父母不只有一個孩子以外的事實。 – Avery3R

+0

我把它稱爲sublist_opt而不是subgroup_opt,因爲它允許零個或多個'group's(使用左遞歸),也許'subgroup_list_opt'或者只是'subgroup_list'會更好:-) ...至於父對象多個孩子,我不確定有什麼不對,'p_group'中的代碼看起來很合理。 – torek