变量未更改值 - PLY yacc



我正在为Typescript代码分析器的UI工作,我想从代码输入中获得错误语法。我在我的sintac。py:

sintactico.py
error = ""
def p_error(p):
global error
error = ""
if p:
error = p
print("sintactico.py IF -> Error en token ", p)
else:
error = "EOF"
print("sintactico.py IF -> Error: se encontró EOF")
print("sintactico.py -> ", error)
syntax = yacc.yacc()
这里我将error赋值为代码中检测到的错误,但error保留它检测到的第一个错误,然后我在main。py中调用它UI的代码是:
main.py
import sintactico
#codigo is a list of strings
for code in codigo:
# ANÁLISIS SINTÁCTICO
parser = sintactico.syntax.parse(code)
r_error = sintactico.error     #keeps the first error parser returns
print("main.py -> ", r_error)
item_syn = QListWidgetItem(code)
if r_error == "EOF":
texto = code +"nError en linea "+str(linea)+"nPosible error: EOF inesperado"
item_syn = QListWidgetItem(texto)
item_syn.setForeground(QColor(255,0,0))
elif r_error != "":
token_p = sintactico.error
texto = code +"nError en linea "+str(token_p.lineno)+"nPosible error: "+str(token_p.value)
item_syn = QListWidgetItem(texto)
item_syn.setForeground(QColor(255,0,0))
self.list_syn.addItem(item_syn)
print(parser)
linea += 1
r_error = ""

self.inp_codigo.clear()

即使代码没有语法错误,它也会一直显示第一个语法错误。我不知道为什么它不改变值,虽然代码在每次迭代中都是不同的,它确实解析不同的代码。

您的逻辑问题是您仅在函数p_error中重置全局error(即sintactico.error)。由于p_error仅在遇到语法错误时由Ply调用,这意味着只有在下一个错误时才清除前一个错误。结果是,如果您解析一个有错误的输入,然后解析另一个没有错误的输入,sintactico.error仍然引用原始错误,这正是您报告的问题("即使代码没有语法错误,它仍然显示第一个语法错误")。

没关系,我通过在最后一行之前添加sintactico.error = ""来解决它,我猜它会刷新并允许sintactico.py中的error更新其值

最新更新