Как построить, если условие с использованием ply? - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь построить простой компилятор, используя ply. Я правильно построил выражения arithmeti c и logi c, но у меня возникают ошибки при выполнении условия if. Например, при вводе if (5> 2) в качестве ввода для программы я получил AttributeError: 'str' object has no attribute 'type' Образцы моего кода:

def t_IF(t):
    r'if'
    return t.value
def p_statement_expr(t):
    '''statement : expression
                | comparison
                | if_statement'''
    print(t[1])
def p_IF(t):
    '''if_statement : IF LPARENTHESES comparison RPARENTHESES'''
    t[0] = t[3]
def p_expression_comparison(t):
    '''comparison : expression GTH expression
                | expression LTH expression
                | expression GTHOREQUAL expression
                | expression LTHOREQUAL expression
                | expression EQUALEQUAL expression
                | expression NOTEQUAL expression'''

    if t[2] == '>':
        if t[1] > t[3]:
            t[0] = True
        else:
            t[0] = False

    elif t[2] == '<':
        if t[1] < t[3]:
            t[0] = True
        else:
            t[0] = False

    elif t[2] == '>=':
        if t[1] >= t[3]:
            t[0] = True
        else:
            t[0] = False

    elif t[2] == '<=':
        if t[1] <= t[3]:
            t[0] = True
        else:
            t[0] = False

    elif t[2] == '==':
        if t[1] == t[3]:
            t[0] = True
        else:
            t[0] = False

    elif t[2] == '!=':
        if t[1] != t[3]:
            t[0] = True
        else:
            t[0] = False

Любая помощь будет полезна. Спасибо.

1 Ответ

1 голос
/ 04 апреля 2020

В Ply функция лексера всегда должна возвращать маркерный объект.

Но здесь вы возвращаете строку:

def t_IF(t):
    r'if'
    return t.value

Это должно было быть:

def t_IF(t):
    r'if'
    return t

Хотя вам действительно лучше обрабатывать ключевые слова, как указано в руководстве Ply в конце раздела 4.3.

...