我正在尝试使用Trifecta来解析一种使用类似Haskell的布局语法的非常简单的函数式语言。我正在整理Haddock文档和我使用Parsec的经验,因为我找不到任何关于Trifecta本身的介绍性材料。
我遇到的问题是使用布局的东西,因为即使是Haddock文档也没有太多帮助。
给定以下代码:
import Text.Trifecta
import Text.Trifecta.Parser.Token.Style
import Text.Trifecta.Parser.Identifier.Style
import Text.Trifecta.Layout.Combinators
import Text.Trifecta.Language.Prim
import Control.Applicative
import Control.Monad.Trans
import Data.Maybe (fromMaybe)
import Data.HashSet as HashSet
import Data.ByteString.UTF8 as UTF8
-- Copypasta from Text.Trifecta.Parser.Identifier.Style
set :: [String] -> HashSet ByteString
set = HashSet.fromList . fmap UTF8.fromString
lang :: MonadParser m => LanguageDef m
lang = LanguageDef{ languageCommentStyle = haskellCommentStyle
, languageIdentifierStyle = emptyIdents{ styleReserved = set keywords }
, languageOperatorStyle = emptyOps{ styleReserved = set ops }
}
where
keywords = ["where"]
ops = ["="]
data Def = Def ByteString [ByteString] [ByteString] [Def]
deriving Show
instance MonadLanguage m => MonadLanguage (Layout m) where
askLanguage = fmap liftLanguageDef $ lift askLanguage
def :: (MonadParser m) => Layout (Language m) Def
def = Def <$> identifier <*> vars <* reservedOp "=" <*> vars <*> laidout locals
where
vars = many identifier
locals = fromMaybe [] <$> optional (reserved "where" *> defs)
defs :: (MonadParser m) => Layout (Language m) [Def]
defs = laidout (many def)
test :: String -> IO ()
test = parseTest $ run $ defs <* eof
where
run p = runLanguage (fst <$> runLayout p defaultLayoutState) lang我正在尝试用test解析下面的文本
f x = x y a b c -- 1
where -- 2
y = d -- 3
g x = z -- 4但它失败了,出现以下解析错误:
(interactive):4:2: error: expected: "=",
identifier, letter or digit
g x = z -- 4
^ 但是如果我注释掉第2行和第3行,它就可以工作了。
那么,即使包含第2行和第3行,我也如何让它进行解析呢?
发布于 2012-09-12 05:56:57
在对Trifecta的Layout支持中有几个bug。我需要从Scala实现中移植一些修复程序。
值得注意的是,有几件事需要禁用行首检查,但没有禁用,因此它尝试在出现错误的地方执行自动分号插入。
我从我的另一个代码库移植了它,该代码库做出了稍微不同的假设,并提供了与trifecta略有不同的不变量。
这实际上是它目前不在github的主分支中的很大一部分原因。
修复它以使用新的parsers-based应用程序接口,并移植这些更改是我在发布0.90之前需要做的最后一件主要事情。
在此期间,我不会依赖它。我很抱歉。
一旦这个响应稳定下来,我就会更新它。
https://stackoverflow.com/questions/12372150
复制相似问题