这段代码片段说明了(我希望是什么)我的最后一个难题:
import Text.Parsec.Exprimport Text.Parsecdata Expr = lit Char | A1 Expr | A2 Expr | B Expr Expr deriving (Show)expr :: Parsec String () Exprexpr = buildExpressionParser table (fmap lit digit)prefix p = Prefix . chainl1 p $return (.)table = [ [prefix $char ',' >> return A1],[Infix (char '*' >> return B) AssocNone],[prefix $char '.' >> return A2]]
这成功(并且正确)解析,.0,.,.0 * 0和0 * 0;但是,它不能解析,.0或.0 * .0.我可以看到为什么这两个不解析,但我不知道如何更改解析器,以便没有任何成功改变,两个失败解析.
解决这个问题的一种方法是将(fmap lit数字)更改为(fmap lit Digit< |> expr),但解析器将循环而不是错误.
建议欢迎.
编辑:以下解析是关键:
> parseTest expr ".0*0"A2 (B (lit '0') (lit '0'))> parseTest expr ",0*0"B (A1 (lit '0')) (lit '0')解决方法 要得到 ‘.’和’,’在一个级别上你可以一起对待它们:
import Text.Parsec.Exprimport Text.Parsecdata Expr = lit Char | A1 Expr | A2 Expr | B Expr Expr deriving (Show)expr :: Parsec String () Exprexpr = buildExpressionParser table (fmap lit digit)prefix p = Prefix . chainl1 p $return (.)table = [ [prefix $(char ',' >> return A1) <|> (char '.' >> return A2)],[prefix $(char ',' >> return A1)] ]-- *Main> let f = parseTest expr-- *Main> f ".,0"-- A2 (A1 (lit '0'))-- *Main> f ".0*.0"-- B (A2 (lit '0')) (A2 (lit '0'))-- *Main> f ".0*,.0"-- B (A2 (lit '0')) (A1 (A2 (lit '0')))-- *Main> f ".,.0"-- A2 (A1 (A2 (lit '0')))-- *Main> f ",.0"-- A1 (A2 (lit '0'))
编辑,这是早先明显不足的尝试
table = [ [prefix $(char ',[Infix (char '*' >> return B) AssocNone] ]总结
以上是内存溢出为你收集整理的haskell – 如何使用Text.Parsec.Expr中的buildExpressionParser来解析这种语言?全部内容,希望文章能够帮你解决haskell – 如何使用Text.Parsec.Expr中的buildExpressionParser来解析这种语言?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)