Python PLY 解析项的零个或多个出现次数

3 投票
2 回答
1293 浏览
提问于 2025-04-15 22:29

我正在使用Python和PLY来解析类似LISP的S表达式。在解析函数调用时,可能会有零个或多个参数。我该如何在yacc代码中实现这一点?这是我目前的函数:

def p_EXPR(p):
    '''EXPR : NUMBER
            | STRING
            | LPAREN funcname [EXPR] RPAREN'''
    if len(p) == 2:
        p[0] = p[1]
    else:
        p[0] = ("Call", p[2], p[3:-1])

我需要把"[EXPR]"替换成可以表示零个或多个EXPR的东西。我该怎么做呢?

2 个回答

0

你确定你想要的是上下文无关文法,而不是解析表达式文法吗?另外,根据我的经验,PLY的设计把文法、解析和后处理紧紧地绑在了一起,这样设计得很糟糕。所以我建议你选择一个设计更模块化的实现方式。

2

这样怎么样:

EXPR : NUMBER
        | STRING
        | LPAREN funcname EXPR_REPEAT RPAREN
EXPR_REPEAT: /*nothing*/
        | EXPR EXPR_REPEAT

撰写回答