使用Python和PLY的递归下降解析器

时间:2013-04-18 05:06:48

标签: python parsing recursive-descent

我为我的基本问题道歉但是,我真的在这里苦苦挣扎。我需要做一个递归下降解析器。我正在使用Python并使用PLY。我的语法如下:

<列表> →(< sequence>)| ()

&LT; <序列> →&lt;听众&gt; ,&lt; <序列> | &LT;听众&gt;

&LT;听众&gt; →&lt;列表&gt; | NUMBER

这看起来像这样吗?我离开了吗?最终目标是将列表读入数据结构,然后将其打印出来。

def p_list(p)
    'list : "("sequence")" | "("")"'

def p_sequence(p)
    'sequence : list_el","sequence | list_el'

def p_list_el(p)
    'list_el : list | NUMBER'

如果有人想知道完整的解决方案是什么,我会很快发布。

1 个答案:

答案 0 :(得分:4)

我就是这样做的:

tokens = ("LBRACKET", "RBRACKET",
          "INTEGER", "FLOAT", "COMMA") # So we can add other tokens
t_LBRACKET = r'\('
t_RBRACKET = r'\)'
t_INTEGER = r'\d+'
t_FLOAT = r'\d+\.\d+'
t_COMMA = r','

def p_list(p):
    """list : LBRACKET sequence RBRACKET
            | LBRACKET RBRACKET"""
    if len(p) == 4:
        p[0] = p[2]
    else:
        p[0] = None

def p_number(p):
    """number : INTEGER
              | FLOAT"""
    p[0] = p[1]

def p_sequence(p):
    """sequence : list_el COMMA sequence
                | list_el"""
    if len(p) == 4:
        p[0] = p[1] + p[3]
    else:
        p[0] = p[1]        

def p_list_el(p):
    """list_el : number
               | list"""
    p[0] = p[1]

编辑:
关于额外令牌的快速解释:脚本中的所有内容最终应归结为您定义的令牌或角色(因此添加是合法的)。通过将它们全部指定为标记,它更易于阅读和使用。