Python PLY несколько правил - PullRequest
4 голосов
/ 24 марта 2012

В конце концов, как мы можем различить, какое правило использовалось -

пример: - '' 'p: ab |с |d '' 'так что предположим, что нам нужно написать другой код для разных правил.Тогда есть ли какой-нибудь элегантный способ сделать это.Один из способов, описанных в руководстве, состоит в том, чтобы использовать комбинацию правил и токенов, но, как мне кажется, не всегда щелкает.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2013

Чтобы иметь несколько парсеров, это не проблема, пожалуйста, проверьте документацию PLY (здесь http://www.dabeaz.com/ply/ply.html#ply_nn37)

lexer  = lex.lex()       # Return lexer object
parser = yacc.yacc()     # Return parser object

Далее, при разборе убедитесь, что вы предоставляете функции parse () ссылку на лексер, который она должна использовать. Например:

parser.parse(text,lexer=lexer)

Если вы забудете это сделать, парсер будет использовать последний созданный лексер - что не всегда то, что вы хотите.

Итак, вы можете включить некоторые атрибуты

В синтаксическом анализаторе атрибуты "lexer" и "parser" относятся к объектам lexer и parser соответственно.

def p_expr_plus(p):
   'expr : expr PLUS expr'
   ...
   print p.parser          # Show parser object
   print p.lexer           # Show lexer object

Более подробную информацию можно найти здесь

http://www.dabeaz.com/ply/ply.html#ply_nn37

0 голосов
/ 24 марта 2012

Просто разбейте выражение на несколько правил, с одним правилом для каждого кода.

например. (от http://www.dabeaz.com/ply/ply.html#ply_nn25)

def p_expression(p):
    '''expression : expression PLUS term
              | expression MINUS term'''
    if p[2] == '+':
        p[0] = p[1] + p[3]
    elif p[2] == '-':
        p[0] = p[1] - p[3]

также можно записать как

def p_expression_plus(p):
    'expression : expression PLUS term'
    p[0] = p[1] + p[3]

def p_expression_minus(t):
    'expression : expression MINUS term'
    p[0] = p[1] - p[3]
...