3

我正在使用 Python 和 PLY 来解析类似 LISP 的 S-Expressions,并且在解析函数调用时可以有零个或多个参数。我怎样才能把它放到 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]”。我怎样才能做到这一点?

4

2 回答 2

2

这个怎么样:

EXPR : NUMBER
        | STRING
        | LPAREN funcname EXPR_REPEAT RPAREN
EXPR_REPEAT: /*nothing*/
        | EXPR EXPR_REPEAT
于 2010-05-08T16:50:39.640 回答
0

您确定要上下文无关语法而不是解析表达式语法吗?此外,根据我的经验,PLY 的设计非常糟糕地结合了语法、解析和后处理,因此我建议使用更模块化设计的实现。

于 2012-03-21T18:23:21.337 回答