我正在使用Megaparsec处理一个小的解析器,并尝试解析算术。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中的优先级。但如果我改变顺序,那么它似乎进入了一个无限循环和崩溃。
不知道我在做什么错在这里,任何帮助将不胜感激。
我不是Parsec和朋友的专家,但是当语法是递归的时候,很多解析技巧会遇到问题(无限循环),这是您的问题。本文似乎表明它可能是Parser组合器的一个问题:http://stuckinaninfiniteloop.blogspot.com/2011/10/left-recursion-in-parsec.html?m=1 – chrisleague