用PLY Yacc解析一组树

时间:2013-10-16 06:14:34

标签: python yacc ply

我试图解析的结构看起来像这样:

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 个答案:

答案 0 :(得分:1)

问题在于子组的定义:在子组状态中,令牌GROUP可以导致移位或缩小(将此作为一个新组进行解析,减少识别子组 - 处理到目前为止并离开GROUP重新扫描以创建一个新的组),令牌']'也可以导致转移或减少(类似的推理)。

我认为您的意图是可以将其重写为:

subgroups : "[" sublist_opt "]"

使用:

sublist_opt : group sublist_opt
            | empty

(我让你填写这个语法片段的python代码)。