Closed. This question needs to be more focused。它当前不接受答案。
想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
2年前关闭。
我目前正在尝试构建一个非常简单的编译器。我创建了一个函数,可以使用调车码算法将中缀表示法的数学方程式转换为RPN,但是遇到了问题。我没有在转换函数中包括错误检查,因此我想知道是否有一种简单的方法来检查中缀表示法中的函数是否使用正确的中缀表示法语法。这将使我能够保留当前的转换功能,而不会因错误检查而使功能难以理解。
哪里
这实际上简化为两种状态的机器:初始状态(状态0)可以称为“期望值”,而另一种状态(状态1)可以称为“期望运算符”。仅状态1正在接受,并且转换如下:
所有其他过渡都是错误的。
通常必须实现此状态机才能正确处理一元减号(以及其他可能为前缀或中缀的运算符),无论如何,将其集成到您的输入处理中非常简单。
想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
2年前关闭。
我目前正在尝试构建一个非常简单的编译器。我创建了一个函数,可以使用调车码算法将中缀表示法的数学方程式转换为RPN,但是遇到了问题。我没有在转换函数中包括错误检查,因此我想知道是否有一种简单的方法来检查中缀表示法中的函数是否使用正确的中缀表示法语法。这将使我能够保留当前的转换功能,而不会因错误检查而使功能难以理解。
最佳答案
如果您的表达式仅由括号,值(常数和/或标识符)以及前缀,后缀和中缀运算符组成,则需要检查两个错误条件:
括号必须匹配。很难用分流码算法注意到这一点,因为在算法中有一个点,当输入中遇到一个封闭的括号时,一个开放的括号会从堆栈中弹出。如果您过度叠加堆栈,或者在输入结束时没有弹出整个堆栈,则括号之间将不平衡。
令牌必须符合以下简单的正则表达式:
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
所有其他过渡都是错误的。
通常必须实现此状态机才能正确处理一元减号(以及其他可能为前缀或中缀的运算符),无论如何,将其集成到您的输入处理中非常简单。
关于c++ - 验证数学方程c++ ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49482093/
10-09 08:16