PLY中的IF语句

时间:2019-01-10 18:15:25

标签: python ply

我正在尝试为一种简单的编程语言编写解析器。我被if语句卡住了。当我调试时,可以在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 :(得分:3)

如果您的意思是在评估print(3)之前执行2<3,那么肯定是这种情况。您不能编写立即评估每个语句的解释器,因为(如果您有条件和循环等),每个语句不一定只评估一次,甚至一次。

仅在分析了整个语句并且整个语句包含if子句后,才会减少then语句。因此,内部语句必须在解析if语句之前进行解析。

因此,只有简单的计算器才能进行即时评估。任何更复杂的需求都需要将程序转换为某种数据结构,以便在解析完成后执行或处理该数据结构。

解析程序的常见表示形式是抽象语法树(AST),它是解析器的输出。