Python - Ply Parser:我怎样才能在任何地方停止解析?

Python - Ply Parser : How can I stop the parsing wherever I want?

我正在使用 PLY 创建一个计算器,我希望能够在遇到被 0 除时停止解析。 如果我提出错误,它会停止我的程序,这不是我想要的。 我希望能够打印一条错误消息,然后忽略其余已解析的字符串。

由于我在循环中,它将结束解析并再次请求新的输入。

while True:
    question = input('>>> ')
    try:
        answer = parser.parse(question)
        if answer is not None:
            print(answer)
    except EOFError:
        break

我有一个 class(不是解析规则)来处理数字和它们之间的操作。如果发生被零除,它将调用错误方法,该方法现在只会打印一条错误消息。

    def error(self, op, other):
        print('Illegal operation "{} {} {}" for {}'.format(self, op, other, type(self).__name__))

如果在除法之后没有其他东西的话这很好,但是这会是一个问题:10/0 - 3 + 2 因为解析仍在继续并且会抛出多个错误。我希望能够在第一个错误后停止解析。

我在想类似 lexer.skip(1) 的东西,但对于所有字符串,而不仅仅是 1 个标记。有没有类似的方法? 非常感谢!

如果您只想中断解析并丢弃正在解析的行的其余部分,请引发异常(或让 Python 除以零异常通过)。在这里,我为计算器错误创建了一个异常 class,因此解析器代码中的错误仍然会导致回溯。未显示的代码基于 examples/calc/calc.py.

class CalcError(Exception):
    def __init__(self, message):
        self.message = message
# ...

def p_expression_div(p):
    '''expression : expression '/' expression'''
    if p[3] == 0:
        raise CalcError("Divide by zero")
    p[0] = p[1] / p[3]

那么你只需要稍微修改一下你的主循环:

import readline
try:
    while True:
        question = input('>>> ')
        try:
            answer = parser.parse(question)
            if answer is not None:
                print(answer)
        except CalcError as e:
            print(e.message)
except EOFError:
    print()
    break