Parsing 使用Haskell在引号之间解析

Parsing 使用Haskell在引号之间解析,parsing,haskell,parsec,megaparsec,Parsing,Haskell,Parsec,Megaparsec,需求取自,更准确地说,我试图解析[ID]属性,该属性可以是 可能包含转义引号(\)1的任何双引号字符串(“…”) 下面应该是一个简单的例子 {-# LANGUAGE OverloadedStrings #-} module Main where import Text.Megaparsec import Text.Megaparsec.Char import Data.Void import Data.Char i

需求取自,更准确地说,我试图解析
[ID]
属性,该属性可以是

可能包含转义引号(\)1的任何双引号字符串(“…”)

下面应该是一个简单的例子

{-# LANGUAGE OverloadedStrings #-}
module Main where

import           Text.Megaparsec
import           Text.Megaparsec.Char
import           Data.Void
import           Data.Char
import           Data.Text               hiding ( map
                                        , all
                                        , concat
                                        )

type Parser = Parsec Void Text

escape :: Parser String
escape = do
    d <- char '\\'
    c <- oneOf ['\\', '\"', '0', 'n', 'r', 'v', 't', 'b', 'f']
    return [d, c]

nonEscape :: Parser Char
nonEscape = noneOf ['\\', '\"', '\0', '\n', '\r', '\v', '\t', '\b', '\f']

identPQuoted :: Parser String
identPQuoted =
    let inner = fmap return (try nonEscape) <|> escape
    in  do
      char '"'
      strings <- many inner
      char '"'
      return $ concat strings

identP :: Parser Text
identP = identPQuoted >>= return . pack

main = parseTest identP "\"foo \"bar\""
{-#语言重载字符串}
模块主要在哪里
导入文本.Megaparsec
导入Text.Megaparsec.Char
导入数据。无效
导入数据.Char
导入数据。文本隐藏(地图)
全部的
,concat
)
类型Parser=Parsec Void Text
escape::解析器字符串
逃逸
d您的输入文本是
“foo”bar“
,它不包含任何转义引号。它被解析为
“foo”
的完整ID(后跟
条“
,被忽略)

如果要确保解析器使用所有可用输入,可以使用

parseTest (identP <* eof) "..."
…然后您需要转义所有特殊字符以将其嵌入Haskell源代码中:

main = parseTest identP "\"foo \\\"bar\""

\“
表示文字
\
表示文字
\

>>=返回。
可以替换为
identP=pack identPQuoted
中的
do
块可以写为
char'*>(concat许多内部)您可以发布一个吗?我想自己试一试。要求的措辞相当糟糕。你能展示你输入语言的真正语法吗?另外,请尝试阅读
。我添加了一个@melpomene示例,并更新了requirementsThanks!事后看来有点尴尬。
main = parseTest identP "\"foo \\\"bar\""