【发布时间】:2012-11-02 18:11:12
【问题描述】:
def parse(expression):
operators= set("*/+-")
numbers= set("0123456789")#not used anywhere as of now
opExtrapolate= []
numExtrapolate= []
buff=[]
for i in expression:
if i in operators:
if len(buff) >0: #prevents buff if multiple operators
numExtrapolate.append(''.join(buff))
buff= []
opExtrapolate.append(i)
opExtrapolation=opExtrapolate
else:
buff.append(i)
numExtrapolate.append(''.join(buff))
numExtrapolation=numExtrapolate
print(numExtrapolation)
print("z:", len(opExtrapolation))
return numExtrapolation, opExtrapolation
def errors():
numExtrapolation,opExtrapolation=parse(expression)
#Error for muliple operators
if (len(numExtrapolation) ==3) and (len(opExtrapolation) !=2):
print("Bad1")
if (len(numExtrapolation) ==2) and (len(opExtrapolation) !=1):
print("Bad2")
#
我在一个较旧的问题中发布了类似的代码,但是这篇文章中问题的前提不同。
上面的代码接受用户在变量表达式中输入的数学输入,并将其拆分为操作数和运算符。如果输入不正确,errors 函数稍后会打印错误。
输入看起来像这样,其中运算符只能在 set("*/+-") 中,并且操作数是实数。所以示例输入是 45/23+233
在 SO 用户的帮助下,我能够解决其中一个错误(多个操作员的错误),但我在执行更多错误消息时遇到了麻烦。
1)如果输入包含不是数字或不是允许的运算符的项目,则会显示错误消息
2)如果用户输入一个数字,例如 .23 或类似 554 的数字。如果小数位之前或小数位之后没有数字,则会显示不同的错误。(请注意,像 0.23 这样的数字很好)。
3)如果用户尝试除以零,则会显示错误。
::我尝试过的:
在 parse() 的 else 语句中,我尝试在 buff.append(i) 上设置条件,以便它仅在 buff.isdigit()==true 时运行该代码,但我收到错误消息说没有buff中的数字。我还尝试创建一个名为“numbers”的集合(在下面的代码中),并通过类似于初始 for 语句的 for 语句将 buff.append(i) 限制为该集合。但不幸的是,没有任何效果。任何和所有的帮助将不胜感激。
请不要引入大量比下面代码更高级的代码。我正在尝试解决问题,而不是完全更改我的代码。感谢您的所有帮助。
【问题讨论】:
-
但是错误实现是额外的,不确定我是否会得到奖励。小数部分是强制性的。
-
如果你建立一个Context Free Grammar而不是这个基于规则的系统,这将容易得多
-
通过这篇文章的答案的含义,我希望学习如何操作我创建的列表(例如上面的 parse() )并将它们限制在某些条件下,即限制可以存储在我创建的列表中的输入类型。
-
我支持@Austin 的评论...这非常适合 CFG ...
-
@Austin 你能提供一些关于 OP 的例子吗?我从未听说过 CFG,我点击了链接,但仍然不明白我将如何实现它。
标签: python implementation