验证数学公式 C++

Verify Mathematical Equation c++

本文关键字:C++ 数学公式 验证      更新时间:2023-10-16

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

如果您的表达式仅由括号、值(常量和/或标识符)以及前缀、后缀和中缀运算符组成,则需要检查两个错误条件:

  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

所有其他转换都是错误。

为了正确处理一元减号(以及其他可能是前缀或中缀的运算符),通常需要实现此状态机,并且在任何情况下,集成到输入处理中都非常简单。