Parsec是一个用于Haskell的工业级monadic解析器组合库。
我有一个如下所示的解析器: 模块 Parser2 其中 导入文本.Parsec 导入 Text.Parsec.String (解析器) 导入 Text.Parsec.Language (emptyDef) 将合格的 Text.Parsec.Expr 导入为 Ex 小鬼...
如何使用 parsec 解析字符串中所有匹配的输入并丢弃其余内容? 示例:我有一个简单的数字解析器,如果我知道分隔它们的原因,我可以找到所有数字: num::Pa...
我有来自 PARSEC 开源基准的以下文件,我希望能够使用 gcc 对其进行分析。但正如你所知,我需要提高 -pg 标志。但我这样做有困难。我...
我正在尝试从定期提供 XML 文件和股票市场报价(示例数据)的网页获取数据。 XML 的结构非常简单,如下所示: 我正在尝试从定期提供带有股票市场报价的 XML 文件的网页获取数据(示例数据)。 XML 的结构非常简单,如下所示: <?xml version="1.0"?> <Contents> <StockQuote Symbol="PETR3" Date="21-12-2010" Time="13:20" Price="23.02" /> </Contents> (不仅如此,但这足以作为一个例子)。 我想将其解析为数据结构: data Quote = Quote { symbol :: String, date :: Data.Time.Calendar.Day, time :: Data.Time.LocalTime.TimeOfDay, price :: Float} 我或多或少了解 Parsec 的工作原理(在 Real World Haskell 书的水平上),并且我尝试了一些 Text.XML 库,但我所能开发的只是一个可以工作的代码,但对于这样一个简单的任务来说太大了看起来像是一个半生不熟的黑客,而不是最好的黑客。 我对解析器和XML了解不多(我基本上知道我在RWH书中读到的内容,我以前从未使用过解析器)(我只是做统计和数值编程,我不是计算机科学家)。是否有一个 XML 解析库,我可以在其中知道模型是什么并立即提取信息,而无需手动解析每个元素,也无需解析纯字符串? 我在想这样的事情: myParser = do cont <- openXMLElem "Contents" quote <- openXMLElem "StockQuote" symb <- getXMLElemField "Symbol" date <- getXMLElemField "Date" (...) closequote <- closeXMLElem "StockQuote" closecont <- closeXMLElem "Contents" return (symb, date) results = parse myParser "" myXMLString 我不必处理纯字符串并自己创建组合器(我很讨厌它)。 编辑:我可能需要阅读一些有关一般解析器(不仅仅是 Parsec)的内容(足以以正确的方式完成此操作)以及有关 XML 的最少内容。你们有推荐什么吗? 我必须解析的真正字符串是这样的: stringTest = "<?xml version=\"1.0\"?>\r\n<ComportamentoPapeis><Papel Codigo=\"PETR3\" Nome=\"PETROBRAS ON\" Ibovespa=\"#\" Data=\"05/01/201100:00:00\" Abertura=\"29,80\" Minimo=\"30,31\" Maximo=\"30,67\" Medio=\"30,36\" Ultimo=\"30,45\" Oscilacao=\"1,89\" Minino=\"29,71\"/></ComportamentoPapeis>\r\n" 编辑2: 我尝试了以下方法(readFloat、readQuoteTime 等只是从字符串中读取内容的函数)。 bvspaParser :: (ArrowXml a) => a XmlTree Quote bvspaParser = hasName "ComportamentoPapeis" /> hasName "Papel" >>> proc x -> do (hour,date) <- readQuoteTime ^<< getAttrValue "Data" -< x quoteCode <- getAttrValue "Codigo" -< x openPrice <- readFloat ^<< getAttrValue "Abertura" -< x minim <- readFloat ^<< getAttrValue "Minimo" -< x maxim <- readFloat ^<< getAttrValue "Maximo" -< x ultimo <- readFloat ^<< getAttrValue "Ultimo" -< x returnA -< Quote quoteCode (LocalTime date hour) openPrice minim maxim ultimo docParser :: String -> IO [Quote] docParser str = runX $ readString [] str >>> (parseXmlDocument False) >>> bvspaParser 当我在 ghci 中调用它时: *Main> docParser stringTest >>= print [] 有什么问题吗? 有很多为 Haskell 编写的 XML 库可以为您进行解析。我推荐名为 xml 的库(请参阅 http://hackage.haskell.org/package/xml)。有了它,您可以简单地写例如: let contents = parseXML source quotes = concatMap (findElements $ unqual "StockQuote") (onlyElems contents) symbols = map (findAttr $ unqual "Symbol") quotes print symbols 此代码片段打印 [Just "PETR3"] 作为示例 XML 的结果,并且可以轻松扩展以收集您需要的所有数据。要以您描述的风格编写程序,您应该使用 Maybe monad,因为 xml 查找函数通常返回 Maybe 字符串,表明是否可以找到标签、元素或属性。另请参阅相关问题:使用哪个 Haskell XML 库? 对于简单的xml解析,使用tagoup不会出错。 http://hackage.haskell.org/package/tagsoup 以下代码片段使用 xml-enumerator。它将日期和时间保留为文本(解析这些内容作为读者的练习): {-# LANGUAGE OverloadedStrings #-} import Text.XML.Enumerator.Parse import Data.Text.Lazy (Text, unpack) data Quote = Quote { symbol :: Text , date :: Text , time :: Text , price :: Float} deriving Show main = parseFile_ "test.xml" (const Nothing) $ parseContents parseContents = force "Missing Contents" $ tag'' "Contents" parseStockQuote parseStockQuote = force "Missing StockQuote" $ flip (tag' "StockQuote") return $ do s <- requireAttr "Symbol" d <- requireAttr "Date" t <- requireAttr "Time" p <- requireAttr "Price" return $ Quote s d t (read $ unpack p) 我过去使用过 Haskell XML Toolbox。 类似于的东西 {-# LANGUAGE Arrows #-} quoteParser :: (ArrowXml a) => a XmlTree Quote quoteParser = hasName "Contents" /> hasName "StockQuote" >>> proc x -> do symbol <- getAttrValue "Symbol" -< x date <- readTime defaultTimeLocale "%d-%m-%Y" ^<< getAttrValue "Date" -< x time <- readTime defaultTimeLocale "%H:%M" ^<< getAttrValue "Time" -< x price <- read ^<< getAttrValue "Price" -< x returnA -< Quote symbol date time price parseQuoteDocument :: String -> IO (Maybe Quote) parseQuoteDocument xml = liftM listToMaybe . runX . single $ readString [] xml >>> getChildren >>> quoteParser 还有其他方法可以使用这个库,但是对于像这样简单的事情,我组合了一个 sax 解析器。 import Prelude as P import Text.XML.Expat.SAX import Data.ByteString.Lazy as L parsexml txt = parse defaultParseOptions txt :: [SAXEvent String String] main = do xml <- L.readFile "stockinfo.xml" return $ P.filter stockquoteelement (parsexml xml) where stockquoteelement (StartElement "StockQuote" attrs) = True stockquoteelement _ = False 从那里你可以弄清楚要去哪里。 您还可以使用 Text.XML.Expat.Annotated 将其解析为更像您在上面寻找的结构: parsexml txt = parse defaultParseOptions txt :: (LNode String String, Maybe XMLParseError) 然后使用Text.XML.Expat.Proc浏览结构。
如何使用 parsec 在 Haskell 中解析 Python 风格的链接运算符?
在我目前正在进行的项目中,我以秒差距构建表达式解析器。代码是这样的: opTable :: [[运算符解析器表达式]] 操作表 = [ ——…… [ 中缀 L $
我正在尝试使用 Parsec 在 Haskell 中编写一个简单的解析器,但我的输入“Hello World”从未被正确解析。 我的代码如下所示: 解析器 = p1 <|> p2 p1 = 字符串“地狱...
我有生以来第一次尝试秒差距,我发现一项任务异常困难。 我想解析两个由 | 分隔的数字列表特点。 这是一个
我有以下代码: 导入 Text.ParserCombinators.Parsec 导入 Control.Applicative 隐藏 ((<|>)) 导入Control.Monad data Test = Test Integer 整数求导 显示 积分...
我正在尝试解析(使用 parsec)表示我定义的某种数据类型的字符串。因此需要将字符串解析为我的数据类型。字符串的一个例子是, [(1,[(<,0),(%,4...
我正在使用 Parsec 库来解析字符串。我遇到的问题是无法区分某些标记,因为它们是具有相同前缀的单词。简化整个语法(在我的例子中是 ...
我是 gem5 模拟器的用户,我在尝试验证 parsec.json 文件时遇到问题。错误如下所示: 图像问题 你有什么想法? 先感谢您! 我有
我正在运行PARSEC x264基准,它运行得很好,直到关闭时它崩溃。不幸的是,该套件似乎没有得到维护或处于低维护状态--这个问题(崩溃,而非...
我正在尝试从级联解析器创建一个解析器,以在parsec中回溯。这是代码:ab =(尝试$ char'a')(尝试$ char'b')cd =(尝试$ char'b')(尝试$ char'c')...
为什么此解析器失败以及如何解决? λ> str1 =字符串“ elif”λ> str2 =字符串“ else”λ> strs =(,)许多str1选项也许str2λ>解析strs“”“ elif elif elif ...
给出由Parsec,Attoparsec之类的库或各种其他功能实现定义的解析器组合器,是否可以解析诸如C或Haskell之类的语言?这是一个...
我正在尝试将用于中缀运算符的解析器添加到简单表达式解析器中。我已经看过文档和这个问题,但似乎我缺少了一些东西。导入...
这里是要解析的语言ID的语法:expr :: = val | const | (expr)| unop expr | expr binop expr var :: =字母const :: = {digit} + unop :: =-binop :: = / * +-我正在使用示例...
我正在使用import Text.Parsec.Text和import Text.Parsec.Char来解析一些包含整数的数据。我正在使用以下代码来解析整数。 p_int ::解析器Int p_int =读取(...
如何在Haskell代码中实现浮点解析器功能以进行整数处理?
参考我的作业说明(我是只有Haskell的基础经验的学生),我必须使用Text.Parsec制作一个简单的计算器解析器。到目前为止,该程序可以读取某些字符串...