Python中的Postfix表达式解析器

时间:2015-04-22 19:37:19

标签: python parsing postfix-notation

我试图完成我的程序,但遇到了一些我需要帮助的事情。我需要帮助尝试: 确保我的用户输入正确并进行错误测试。我会做些像......

if token == "" or token == " "

我不确定如何确保用户输入正确。

分配:

  

编写一个从中提取后缀表达式的程序(postfix.py)   用户并按照课程中的描述对其进行评估。你的程序应该   通过标准输入从用户提取表达式。该   表达式应格式化为至少有一个空格   每个运算符和操作数之间的空格。例如,

     

输入后缀表达式:5 6 * 13 2 * +假设所有运算符和操作数都有效。操作数应该是整数值   有效的运算符包括+ - / * %

     

提取表达式后,在字符串上使用split()方法   将其拆分为存储在Python列表中的单个令牌。   注意,多位操作数(即13)被认为是单个操作数   令牌。

     

后缀表达式应打印到标准输出,一个标记   在评估时,一次。另外,如果表达式是   有效,结果应打印在下一行后面   表达式如下图所示

5 6 * 13 2 * +
= 56
     

如果表达式无效,请停止对表达式求值   确定有错误并打印3美元的标志。然后打印   下一行上的错误消息表示错误。例如,   如果遇到给定操作数的运算符太多,   你的程序应该产生如下所示的结果

Enter a postfix expression: 17 6 / + 8 *
17 6 / + $$$
Error: insufficient number of operands.
     

当给定操作数的运算符太少时,您的程序   应该产生如下所示的结果

Enter a postfix expression: 17 6 / 25 5 +
17 6 / 25 5 + $$$
Error: insufficient number of operators.

我的代码:

  input("Enter a postfix expression: ")
  operorList("*, /, -, +, %")

  def postfixEval(postfixExpr):
     operandStack = Stack()
     tokenList = postfixExpr.split()

     for token in tokenList:
        if token in "0123456789":
          operandStack.push(int(token))
     else:
        operand2 = operandStack.pop()
        operand1 = operandStack.pop()
        result = doMath(token,operand1,operand2)
        operandStack.push(result)
     return operandStack.pop()

 def doMath(op, op1, op2):
     if op == "*":
      return op1 * op2
     elif op == "/":
      return op1 / op2
     elif op == "+":
      return op1 + op2
     elif op == "%":
      return op1 % op2
     else:
      return op1 - op2

1 个答案:

答案 0 :(得分:0)

指派告诉

  

假设所有运算符和操作数都有效。操作数应为整数值,而有效运算符包括+ - / * %

因此可以假设没有其他输入,并且发生的唯一错误是堆栈上的操作数太多或不够,因此您只需要测试它们。

该行

if token in "0123456789":

仅检查整个令牌是0123456789的子字符串,a.k.a是一个数字,014567左右。

您要做的是检查令牌是否全是数字:

if token.isdigit():
    ...

对于太少的操作数pop中的任何一个都可能抛出异常IndexError;你会抓住它并报告错误:

try:
    operand2 = operandStack.pop()
    operand1 = operandStack.pop()        
except IndexError:
    # handle appropriately

同样,太多的操作数意味着operandStack在最后有超过1个项目,所以只需检查len(operandStack);如果大于1则报告“操作数太多”。