2

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

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

<序列> → <列表元素> , <序列> | <列表元素>

<列表元素> → <列表> | 数字

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

定义 p_list(p)
    '列表:“(”序列“)” | "("")"'

定义 p_sequence(p)
    'sequence : list_el","sequence | list_el'

定义 p_list_el(p)
    'list_el:列表 | 数字'

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

4

1 回答 1

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]

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

于 2013-04-18T10:06:59.290 回答