python - PLY 中的 IF 语句

标签 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中的if语句?

最佳答案

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

if仅当整个语句被解析后,语句才会减少,并且整个语句包括 then条款。所以内部语句必须在if之前解析。语句已解析。

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

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

关于python - PLY 中的 IF 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54134671/

相关文章:

python - PLY 的词法分析器支持 "maximal munch"吗?

python - PLY LEX 和 YACC 的问题

python - 将直方图集成到引导模拟图中

Python - 在 For 循环中列出超出范围的索引

python - 层 lex yacc : Errors handling

python - 一个解析项多次出现导致的无限递归 YACC-PLY

Python PLY 中 if-else 和 while 语句的问题

java - 可以在 Google App Engine 下运行的 WordPress 类似\克隆有哪些?

python - 删除列表中 2 个重复的交换子列表

python - 如何使用 pandas 将 concat 函数按数据框应用于组?