Если заявление в PLY - PullRequest
       6

Если заявление в PLY

0 голосов
/ 10 января 2019

Я пытаюсь написать парсер для простого языка программирования. Я застрял на заявлениях. Когда я отлаживаю, я вижу эту инструкцию после того, как оператор if обрабатывается перед моим производством if. Ниже приведен пример программы, в которой описана проблема, например, ввод:

if 2>3 then print(3)

.

reserved = {
    'if': 'IF',
    'print': 'PRINT',
    'then':'THEN'
}

tokens = ['NUM', 'SEMICOLON', 'LPAR', 'RPAR', 'GT'] + list(reserved.values())

t_SEMICOLON = r';'
t_LPAR = r'\('
t_RPAR = r'\)'
t_GT = r'>'

t_ignore = r' '


def t_words(t):
    r'[a-zA-Z_][a-zA-Z0-9_]*'
    t.type = reserved.get(t.value, 'IDENT')
    return t


def t_NUM(t):
    r'\d+'
    t.value = int(t.value)
    return t


def t_error(t):
    print('Error at \'{}\''.format(t.value[0]))
    t.lexer.skip(1)


import ply.lex as lex
lex.lex()


def p_instruction(p):
    '''
    instr : instr SEMICOLON simple_instr
          | simple_instr
    '''


def p_simple_instruction(p):
    '''
    simple_instr : if_statement
                 | print_function
    '''


def p_if_statement(p):
    'if_statement : IF NUM GT NUM THEN simple_instr'


def p_print_function(p):
    '''print_function : PRINT LPAR NUM RPAR'''
    print(p[3])


def p_error(p):
    raise SyntaxError("Error at \'{}\'".format(p.value))


import ply.yacc as yacc
yacc.yacc()

while True:
    try:
        s = input('> ')
    except EOFError:
        break
    yacc.parse(s)

Как правильно обрабатывать операторы в PLY?

1 Ответ

0 голосов
/ 10 января 2019

Если вы имеете в виду, что print(3) выполняется до оценки 2<3, то это, безусловно, будет иметь место. Вы не можете написать интерпретатор, который немедленно оценивает каждое утверждение, потому что (если у вас есть условные выражения, циклы и т. Д.), Каждое утверждение не обязательно оценивается только один раз или даже один раз.

Оператор if уменьшается только тогда, когда весь оператор был проанализирован, и весь оператор включает в себя предложение then. Поэтому внутренний оператор должен быть проанализирован до синтаксического анализа оператора if.

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

Распространенным представлением анализируемой программы является абстрактное синтаксическое дерево (AST), которое будет выводом синтаксического анализатора.

...