【问题标题】:Verify Mathematical Equation c++ [closed]验证数学方程c ++ [关闭]
【发布时间】:2014-11-14 02:28:11
【问题描述】:

我目前正在尝试构建一个非常简单的编译器。我创建了一个函数,它使用分流码算法将中缀符号的数学方程转换为 RPN,但是我遇到了一个问题。我没有在我的转换函数中包含错误检查,所以我想知道是否有一种简单的方法来检查中缀表示法中的函数是否具有正确的中缀表示法语法。这将使我能够保留我当前的转换函数,而不会被错误检查所掩盖。

【问题讨论】:

  • 不幸的是,这是一个相当宽泛的问题:实现这种事情的不同方法数量不知道,所以你的问题是非常开放的。帮助我们解决一个具体问题(和一些代码!)。
  • 编译器本身是用c++还是其他语言编写的?
  • 你能给我们语法吗?你只是在接受一个字符串:“13 42 100 + *”还是什么?

标签: c++ math compiler-construction equation


【解决方案1】:

如果您的表达式仅包含括号、值(常量和/或标识符)以及前缀、后缀和中缀运算符,那么您需要检查两种错误情况:

  1. 括号必须匹配。使用调车场算法很难不注意到这一点,因为算法中有一个点,当输入中遇到右括号时,会从堆栈中弹出一个左括号。如果您溢出堆栈或在输入结束时未弹出整个堆栈,则括号不平衡。

  2. 标记必须符合以下简单的正则表达式:

    PRE* VAL POST* ( INFIX PRE* VAL POST* )*
    

    在哪里

    • PRE 是前缀运算符或 (
    • POST 是后缀运算符或 )
    • VAL 是一个值:常量或标识符

这实际上简化为两个状态机:初始状态(状态 0)可以称为“期望值”,而另一个状态(状态 1)可以称为“期望运算符”。只有状态1在接受,转换如下:

State 0:
    PRE   → State 0
    VAL   → State 1

State 1:
    POST  → State 1
    INFIX → State 0

所有其他转换都是错误的。

为了正确处理一元减号(以及其他可能是前缀或中缀的运算符),通常需要实现此状态机,并且无论如何,它都非常容易集成到您的输入处理中。

【讨论】: