基于Python和PLY的递归下降解析器

2024-10-01 15:48:54 发布

您现在位置:Python中文网/ 问答频道 /正文

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

<;list>;→(<;sequence>;)|()

<;sequence>;→<;listelement>;,<;sequence>;|<;listeElement>

<;listelement>;→<;list>;|编号

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

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'

如果有人想知道完整的解决方案是什么,我很快就会贴出来。在


Tags: ltgt解析器数据结构number列表def语法
1条回答
网友
1楼 · 发布于 2024-10-01 15:48:54

我就是这样做的:

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]

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

相关问题 更多 >

    热门问题