我正在使用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