2013-10-16 3 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]] 

각 부모가 아이들 그룹의 목록이를, 각 어린이는 부모에 대한 참조를 가지고 있습니다. shift/reduce 충돌없이 갈 문법을 얻지 못하고 제대로 파싱하지 못합니다.

답변

1

문제는 하위 그룹의 정의에 있습니다. 하위 그룹 상태에서 토큰 GROUP을 사용하면 이동 또는 축소가 발생할 수 있습니다 (이를 분석하여 새 그룹으로 바꾸고 하위 그룹 인식을 줄이거 나 멀리 처리하고 새 그룹을 만들기 위해 다시 스캔해야하는 그룹), 토큰 ']'이 이동하거나 줄이기 (유사한 추론) 될 수 있습니다.

내가 당신의 의도를 다시 쓸 수 있도록 생각이 같은 :

subgroups : "[" sublist_opt "]" 

과 :

sublist_opt : group sublist_opt 
      | empty 

(I이 문법 조각의 파이썬 코드에 기입을두고).

+0

기호 그룹, 하위 그룹 및 subgroup_opt에 대한 무한 재귀 오류가 발생했습니다 (sublist_opt는 방금 이름을 변경했습니다) – Avery3R

+0

빈 규칙이 누락되어 재귀 오류가 발생했습니다. 이것은 부모가 둘 이상의 자식을 가질 때를 제외하고는 작동합니다. – Avery3R

+0

나는 subgroup_opt보다는 sublist_opt라고 불렀다. 왜냐하면 0 개 이상의'group' (왼쪽 재귀를 사용), 아마도'subgroup_list_opt' 또는 단지'subgroup_list'가 더 좋을 것이기 때문입니다 :-) ... 여러 어린이들, 무엇이 잘못되었는지 모르겠습니다.'p_group'의 코드가 합리적으로 보입니다. – torek

관련 문제