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
我正在使用 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