我正在使用 Megaparsec 开发一个小型解析器并尝试解析算术。
-- Arithmetic expressions
data Aexp = N Num
| V Var
| Mult Aexp Aexp
| Add Aexp Aexp
| Sub Aexp Aexp
deriving (Show, Eq, Read)
arithParser :: Parser Aexp
arithParser = V <$> strParser
<|> N <$> numParser
<|> Mult <$> arithParser <* tok "*" <*> arithParser
--boolParser :: Parser Bexp
strParser :: Parser Var
strParser = tok "\"" *> some (noneOf ("\n\r\"=[]{},:")) <* tok "\""
numParser :: Parser Num
numParser = (some (oneOf ['0' .. '9']) >>= return . read) <* whitespace
如果我运行Parse arithParser "5*5" "5*5"
它只是返回的命令Right (N 5)
,它应该返回的位置Mult(N 5) (N 5)
。因为 arithParser 中的优先级。但是,如果我更改顺序,那么它似乎会进入无限循环并崩溃。
不知道我在这里做错了什么,任何帮助将不胜感激。