Python PLY ноль или более вхождений элемента разбора

Я использую Python с PLY для анализа L-подобных 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 ответа

Решение

Как насчет этого:

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

Вы уверены, что хотите грамматику без контекста, а не грамматику выражения синтаксического анализа? Кроме того, по моему опыту, проект PLY очень плохо сочетает грамматику, анализ и постобработку, поэтому я бы порекомендовал реализацию с более модульным дизайном.

Другие вопросы по тегам