haskell – 如何使用Text.Parsec.Expr中的buildExpressionParser来解析这种语言?

haskell – 如何使用Text.Parsec.Expr中的buildExpressionParser来解析这种语言?,第1张

概述我一直在尝试使用buildExpressionParser来解析一种语言,而我几乎拥有它.感谢 Parsec.Expr repeated Prefix/Postfix operator not supported解决我的一个大问题. 这段代码片段说明了(我希望是什么)我的最后一个难题: import Text.Parsec.Exprimport Text.Parsecdata Expr = 我一直在尝试使用buildExpressionParser来解析一种语言,而我几乎拥有它.感谢 Parsec.Expr repeated Prefix/Postfix operator not supported解决我的一个大问题.

这段代码片段说明了(我希望是什么)我的最后一个难题:

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来解析这种语言?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1064059.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存