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\""