Как использовать модуль PLY для реализации двухстрочного синтаксического анализа 1 + 1 \ n 2 + 2, выход 2 и 4 соответственно

С помощью PLY для достижения анализа результатов "1 + 1 \ n 2 + 2" я думаю, что это два несущественных утверждения, но PLY сократил их, как сделать их неактуальными def p_statement_expr (p): '' 'statement: expression print p [1]

def p_expr_num(p):
    '''expression : NUMBER'''
    p[0] = p[1]

if "__main__" == __name__:
    parser = yacc.yacc(tabmodule="parser_main")
    import time
    t = time.time()
    for i in range(1):
        result = parser.parse("1+1 \n 2+2", debug=debug)
    # print time.time() - t
    # print result
  • С помощью PLY для достижения анализа результатов "1 + 1 \ n 2 + 2", я думаю, это два несущественных утверждения, но PLY сократил их, как сделать их неактуальными.
  • PLY: PARSE DEBUG START Состояние: 0 Стек:. LexToken (NUMBER, 1,1,0) Действие: Shift и goto состояние 3 Состояние: 3 Стек: NUMBER. LexToken (ADD, '+', 1,1) Действие: Сократить правило [выражение -> ЧИСЛО] с помощью [1] и перейти в состояние 5 Результат: (1) Состояние: 5 Стек: выражение. LexToken (ADD, '+', 1,1) Действие: сдвиг и переход в состояние 9 Состояние: 9 Стек: выражение ADD. LexToken (NUMBER, 1,1,2) Действие: сдвиг и переход в состояние 3 Состояние: 3 Стек: выражение ДОБАВИТЬ НОМЕР. LexToken (ЧИСЛО; 2,2,6) ОШИБКА: Ошибка: выражение ДОБАВИТЬ НОМЕР. LexToken (НОМЕР; 2,2,6)
  • Когда сообщается 2 + 2, как я могу реализовать выполнение многострочного оператора и автоматически выполнить следующий код после выполнения?

person bianxiaokun    schedule 07.01.2019    source источник
comment
С помощью PLY для достижения анализа результатов 1 + 1 \ n 2 + 2, я думаю, это два несущественных утверждения, но PLY сократил их, как сделать их неактуальными.   -  person bianxiaokun    schedule 07.01.2019
comment
PLY: PARSE DEBUG START Состояние: 0 Стек:. LexToken (NUMBER, 1,1,0) Действие: Shift и goto состояние 3 Состояние: 3 Стек: NUMBER. LexToken (ADD, '+', 1,1) Действие: Сократите правило [выражение - ›ЧИСЛО] до [1] и перейдите в состояние 5 Результат:‹ int @ 0x1d3fd68 ›(1) Состояние: 5 Стек: выражение. LexToken (ADD, '+', 1,1) Действие: сдвиг и переход в состояние 9 Состояние: 9 Стек: выражение ADD. LexToken (NUMBER, 1,1,2) Действие: сдвиг и переход в состояние 3 Состояние: 3 Стек: выражение ДОБАВИТЬ НОМЕР. LexToken (ЧИСЛО; 2,2,6) ОШИБКА: Ошибка: выражение ДОБАВИТЬ НОМЕР. LexToken (НОМЕР; 2,2,6)   -  person bianxiaokun    schedule 07.01.2019
comment
Когда сообщается 2 + 2, как я могу реализовать выполнение многострочного оператора и автоматически выполнить следующий код после выполнения?   -  person bianxiaokun    schedule 07.01.2019
comment
Привет! Комментарии здесь предназначены для того, чтобы другие люди могли запросить разъяснения или дать совет о том, как улучшить ваш вопрос; под вопросом есть ссылка изменить, если вы хотите добавить детали или изменить формулировку.   -  person IMSoP    schedule 07.01.2019


Ответы (1)


Плай ничего не сделал со вторым выражением.

Ваша грамматика соответствует ровно одному утверждению, если вы все это показываете. Ply ожидает, что ввод завершится в этот момент, но это не так, поэтому Ply жалуется на неожиданное число.

person rici    schedule 07.01.2019