PLY 中的 IF 语句
IF statement in 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),它是解析器的输出。
我正在尝试为一种简单的编程语言编写解析器。我被困在 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),它是解析器的输出。