我目前正在尝试构建一个非常简单的编译器。我创建了一个函数,使用分流码算法将中缀符号中的数学方程式转换为RPN,但是我遇到了一个问题。我没有在转换函数中包含错误检查,因此我想知道是否有一种简单的方法来检查中缀表示法中的函数是否采用正确的中缀表示法语法。这将使我能够保持当前的转换功能,而不会通过错误检查来掩盖它。
答案 0 :(得分: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
所有其他转换都是错误的。
为了正确处理一元减号(以及可能是前缀或中缀的其他运算符),通常需要实现此状态机,并且无论如何,它很容易集成到您的输入中处理