解析错误导致的自动完成建议

时间:2017-10-19 12:05:07

标签: parsing haskell megaparsec

我正在使用megaparsec为自定义jupter内核编写解析器。我能够重新使用解析器来提供完成:从megaparsec库生成的自定义错误消息被转换为预期符号列表。就这样,每当我更改解析器时,完成都会自动调整自身。哪个好。

我唯一困难的是如何从可选解析器中获取信息。说明我想要实现的目标的最小例子如下:

{-# LANGUAGE OverloadedStrings #-}
module Main where

import Control.Applicative
import Text.Megaparsec
import Text.Megaparsec.Char
import qualified Text.Megaparsec.Char.Lexer as L
import Data.Monoid
import Data.Text (Text)
import Data.Set (singleton)

type Parser = Parsec MyError Text

data MyError = ExpectKeyword Text deriving (Eq, Ord, Show)

lexeme = L.lexeme sc
sc = L.space (skipSome (oneOf [' ', '\t'])) empty empty

-- | Reserved words
rword :: Text -> Parser Text
rword w = region (fancyExpect (ExpectKeyword w)) $
          lexeme (string w *> return w)

fancyExpect f e = FancyError (errorPos e) (singleton . ErrorCustom $ f)

p1 = rword "foo" <|> rword "bar"

p2 = (<>) <$> option "def" (rword "opt") <*> p1

main = do
  putStrLn . show $ parse p1 "" ("xyz" :: Text) -- shows "foo" and "bar" in errors
  putStrLn . show $ parse p2 "" ("xyz" :: Text) -- like above, no optional "opt"

在第一种情况下,解析器失败,我从所有备选方案中获取所有错误的列表。理想情况下,在第二种情况下,我也希望看到失败的可选解析器的错误。

通过删除option并使用<|>创建两个分支,可以简单地解决此示例:一个带有选项,另一个带有选项。但是在实际情况下,可选部分是一个由几个可选部分组成的置换解析器,因此这种技巧是不可行的。

0 个答案:

没有答案