Программы на Python
Anonymous
Почему мой код вызывается внутри блока if, независимо от условия?
Сообщение
Anonymous » 12 янв 2025, 14:33
Я создал язык программирования, но не могу исправить выполнение кода yacc внутри блока if:
Код: Выделить всё
def t_error(t):
print(f"unexpected token: {t.value}")
sys.exit()
lexer = lex.lex()
variables = {}
def p_program(p):
'''
program : statements
'''
p[0] = p[1]
def p_statements(p):
'''
statements : statement
| statement statements
'''
if len(p) == 2:
p[0] = p[1]
else:
p[0] = p[1]
def p_expression_literals(p):
'''
expression : ID
| INT
| FLOAT
| BOOL
| STRING
'''
if p[1] in variables and isinstance(p[1], str):
p[0] = variables[p[1]]
else:
p[0] = p[1]
def p_expression_cmp(p):
'''
expression : expression CMP expression
'''
if p[2] == "==":
p[0] = p[1] == p[3]
def p_statement_assign(p):
'''
statement : ID EQ expression
'''
variables[p[1]] = p[3]
def p_expression_binop(p):
'''
expression : expression ADD expression
| expression SUB expression
| expression MUL expression
| expression DIV expression
'''
if p[2] == "+":
p[0] = p[1] + p[3]
elif p[2] == "-":
p[0] = p[1] - p[3]
elif p[2] == "*":
p[0] = p[1] * p[3]
elif p[2] == "/":
p[0] = p[1] / p[3]
def p_expression_group(p):
'''
expression : LP expression RP
| LP statement RP
'''
p[0] = p[2]
def p_scope_block(p):
'''
block : LCB statements RCB
'''
p[0] = p[2]
def c_print(arg):
arg = str(arg)
arg = arg.lstrip('"')
arg = arg.rstrip('"')
print(arg)
def p_print(p):
'''
statement : PRINT LP expression RP
'''
c_print(p[3])
def p_if_statement(p):
'''
statement : IF expression block
| IF expression block ELSE block
'''
if p[2]:
p[0] = p[3]
elif len(p) == 6: # for 'else' part
p[0] = p[5]
def p_error(p):
print("Syntax error at '%s'" % p.value)
parser = yacc.yacc()
parser.parse(code)
Когда я выполняю оператор if, блок вызывается независимо от условия.
Подробнее здесь:
https://stackoverflow.com/questions/791 ... -condition
1736681589
Anonymous
Я создал язык программирования, но не могу исправить выполнение кода yacc внутри блока if: [code]def t_error(t): print(f"unexpected token: {t.value}") sys.exit() lexer = lex.lex() variables = {} def p_program(p): ''' program : statements ''' p[0] = p[1] def p_statements(p): ''' statements : statement | statement statements ''' if len(p) == 2: p[0] = p[1] else: p[0] = p[1] def p_expression_literals(p): ''' expression : ID | INT | FLOAT | BOOL | STRING ''' if p[1] in variables and isinstance(p[1], str): p[0] = variables[p[1]] else: p[0] = p[1] def p_expression_cmp(p): ''' expression : expression CMP expression ''' if p[2] == "==": p[0] = p[1] == p[3] def p_statement_assign(p): ''' statement : ID EQ expression ''' variables[p[1]] = p[3] def p_expression_binop(p): ''' expression : expression ADD expression | expression SUB expression | expression MUL expression | expression DIV expression ''' if p[2] == "+": p[0] = p[1] + p[3] elif p[2] == "-": p[0] = p[1] - p[3] elif p[2] == "*": p[0] = p[1] * p[3] elif p[2] == "/": p[0] = p[1] / p[3] def p_expression_group(p): ''' expression : LP expression RP | LP statement RP ''' p[0] = p[2] def p_scope_block(p): ''' block : LCB statements RCB ''' p[0] = p[2] def c_print(arg): arg = str(arg) arg = arg.lstrip('"') arg = arg.rstrip('"') print(arg) def p_print(p): ''' statement : PRINT LP expression RP ''' c_print(p[3]) def p_if_statement(p): ''' statement : IF expression block | IF expression block ELSE block ''' if p[2]: p[0] = p[3] elif len(p) == 6: # for 'else' part p[0] = p[5] def p_error(p): print("Syntax error at '%s'" % p.value) parser = yacc.yacc() parser.parse(code) [/code] Когда я выполняю оператор if, блок вызывается независимо от условия. Подробнее здесь: [url]https://stackoverflow.com/questions/79107217/why-is-my-code-inside-an-if-block-being-called-no-matter-the-condition[/url]