gpt4 book ai didi

parsing - 使用 Trifecta 的布局解析器

转载 作者:行者123 更新时间:2023-12-02 17:01:04 25 4
gpt4 key购买 nike

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

我遇到的问题是使用布局内容,因为即使是 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 行,我如何使其解析?

最佳答案

对 Trifecta 的布局支持存在一些错误。我需要从 Scala 实现中移植一些修复。

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

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

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

修复它以使用新的基于 parsers 的 API,并移植这些更改是我发布 0.90 之前需要做的最后一件主要事情。

与此同时,我不会依赖它。抱歉。

一旦稳定,我会立即更新此响应。

关于parsing - 使用 Trifecta 的布局解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12372150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com