gpt4 book ai didi

python-3.x - 使用解析器重新同步的 PLY.yacc 错误处理

转载 作者:行者123 更新时间:2023-12-03 08:22:01 27 4
gpt4 key购买 nike

我正在尝试在解析期间实现用户友好的语法错误处理。根据我在官方 PLY documentation 中观察到的情况.一种方法是在第一个 SyntaxError 时引发异常。发生并终止解析。但是,正如文档所建议的那样,我想做类似的事情来使用解析器重新同步技术。

文档说:

The most well-behaved approach for handling syntax errors is to write grammar rules that include the error token. For example, suppose your language had a grammar rule for a print statement like this:

def p_statement_print(p):
'statement : PRINT expr SEMI'
...

To account for the possibility of a bad expression, you might write an additional grammar rule like this:

def p_statement_print_error(p):
'statement : PRINT error SEMI'
print("Syntax error in print statement. Bad expression")


我有一个这样的语法摘录:
def p_operation(self, p) -> None:
'''
operation : unaryOperation
| binaryOperation
'''

def p_unaryOperation(self, p) -> None:
'''
unaryOperation : unaryOperation L_SQUARE_BRACKET projection R_SQUARE_BRACKET
| RELATION_NAME
'''

def p_projection(self, p) -> None:
'''
projection : multipleAttributes
| attribute
'''

def p_multipleAttributes(self, p) -> None:
'''
multipleAttributes : projection COMMA attribute
'''

def p_attribute(self, p) -> None:
'''
attribute : ATTRIBUTE
'''

我很不确定我应该如何定义这样的新规则,包括 error token 。我应该用 error 替换每个非终端吗? token ?

期待看到您的回复!非常感谢你的帮助

最佳答案

您绝对不应该为每个非终端添加错误产生。

当存在一些通常会将解析上下文重置为已知状态的 token 时,重新同步就会起作用。在具有明确语句结束标记的语言中(您引用的示例中的分号),该标记可以很好地用作重新同步点。将文本丢弃到下一个分号,然后从那里解析不会 100% 有效,但在许多情况下它确实有效。

括号和括号也可以用作重新同步点,但启发式方法并不可靠,因为许多语法错误是括号或括号不匹配的结果。例如,扫描丢失的右括号可能会丢弃整个输入。

在没有明确语句分隔符的语言的情况下,重新同步更加复杂,包括像 Python 这样的语言,如果语句没有嵌套在括号中,换行符只会终止语句。丢弃到换行符可能会起作用,但您可能必须处理扫描仪和解析器之间的反馈,该反馈确定何时将换行符作为 token 传输以及何时将其作为空格跳过。

不一致的缩进可能是一个有用的重新同步触发器,但有一些警告。首先,您不能拒绝带有“误导性”缩进的有效输入,因此触发器在重新同步期间需要比正常解析期间更敏感。其次,跟踪不一致的缩进肯定需要解析器->扫描器反向 channel 。因此,它比简单的 panic recover 工作更多,但它可能是有效的。

最重要的是,很少有通用算法用于良好的错误报告和恢复。您需要根据语言的句法性质制定策略。

理想情况下,您将希望通过检查解析器对常见错误的响应来优化代码,但是在您进行实际部署并了解常见错误是什么之前,这实际上是无法完成的。所以我能给出的最好建议是从一个简单的恢复策略开始,看看它如何处理不同的语法错误,特别是你意外创建的语法错误(或者你的 friend 和合作者的错误)。保留遇到的不同语法错误的存档,您可以使用它来测试对诊断和恢复代码的改进。不要指望它是完美的,因为这是一个难题,但要尽可能地让它更准确。

关于python-3.x - 使用解析器重新同步的 PLY.yacc 错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53990322/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com