首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Trifecta的布局解析器

使用Trifecta的布局解析器
EN

Stack Overflow用户
提问于 2012-09-11 22:34:21
回答 1查看 1K关注 0票数 6

我正在尝试使用Trifecta来解析一种使用类似Haskell的布局语法的非常简单的函数式语言。我正在整理Haddock文档和我使用Parsec的经验,因为我找不到任何关于Trifecta本身的介绍性材料。

我遇到的问题是使用布局的东西,因为即使是Haddock文档也没有太多帮助。

给定以下代码:

代码语言:javascript
复制
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解析下面的文本

代码语言:javascript
复制
f x = x y a b c -- 1
  where         -- 2
    y = d       -- 3
g x = z         -- 4

但它失败了,出现以下解析错误:

代码语言:javascript
复制
(interactive):4:2: error: expected: "=",
    identifier, letter or digit
g x = z         -- 4 
 ^      

但是如果我注释掉第2行和第3行,它就可以工作了。

那么,即使包含第2行和第3行,我也如何让它进行解析呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-12 05:56:57

在对Trifecta的Layout支持中有几个bug。我需要从Scala实现中移植一些修复程序。

值得注意的是,有几件事需要禁用行首检查,但没有禁用,因此它尝试在出现错误的地方执行自动分号插入。

我从我的另一个代码库移植了它,该代码库做出了稍微不同的假设,并提供了与trifecta略有不同的不变量。

这实际上是它目前不在github的主分支中的很大一部分原因。

修复它以使用新的parsers-based应用程序接口,并移植这些更改是我在发布0.90之前需要做的最后一件主要事情。

在此期间,我不会依赖它。我很抱歉。

一旦这个响应稳定下来,我就会更新它。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12372150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档