- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了以下解析问题:
解析一些可能包含来自有限字符集的零个或多个元素的文本字符串,最多但不包括一组终止字符中的一个。应通过Maybe
指示内容/无内容。终止字符可能以转义形式出现在字符串中。任何不允许的字符解析都应该失败。
这是我想出的(简化):
import qualified Text.Megaparsec as MP
-- Predicate for admissible characters, not including the control characters.
isAdmissibleChar :: Char -> Bool
...
-- Predicate for control characters that need to be escaped.
isControlChar :: Char -> Bool
...
-- The escape character.
escChar :: Char
...
pComponent :: Parser (Maybe Text)
pComponent = do
t <- MP.many (escaped <|> regular)
if null t then return Nothing else return $ Just (T.pack t)
where
regular = MP.satisfy isAdmissibleChar <|> fail "Inadmissible character"
escaped = do
_ <- MC.char escChar
MP.satisfy isControlChar -- only control characters may be escaped
例如,允许的字符是大写 ASCII,转义字符是“\”,控制字符是“:”。然后,以下正确解析:ABC\:D:EF
生成 ABC:D
。但是,解析 ABC&D
,其中 &
是不允许的,确实会产生 ABC
而我希望得到一条错误消息。
两个问题:
fail
结束解析而不是使解析器失败?最佳答案
many
必须允许其子解析器在没有整个解析的情况下失败一次失败 - 例如 many (char 'A') *> char 'B'
,在解析时“AAAB”,必须无法解析 B 才能知道它到达了结尾作为。
您可能需要 manyTill
来识别终止符明确地。像这样:
MP.manyTill (escaped <|> regular) (MP.satisfy isControlChar)
如果 isControlChar 不接受“&”,“ABC&D”会在此处给出错误。
或者如果你想解析多个组件,你可以保留你的pComponent 的现有定义并将其与 sepBy
或类似的方法一起使用,例如:
MP.sepBy pComponent (MP.satisfy isControlChar)
如果您在此之后还检查文件结尾,例如:
MP.sepBy pComponent (MP.satisfy isControlChar) <* MP.eof
那么 "ABC&D"应该会再次报错,因为 '&' 将结束第一个组件但不会被接受为分隔符。
关于parsing - 如何使嵌套的 megaparsec 解析器失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67809465/
我正在使用 Megaparsec 开发一个小型解析器并尝试解析算术。 -- Arithmetic expressions data Aexp = N Num | V Var
我正在尝试使用 lamdba 表达式解析一种简单的语言。但是runParser expr "lamdbda(x) (return x)返回Right (Var "lamdba")而不是Right (L
我在使用 Megaparsec 6 的 makeExprParser 时遇到问题 helper 。我似乎无法弄清楚如何绑定(bind)两个二进制 ^和一元 -在我期望的优先级。 使用这个makeExp
我想使用 Megaparsec 解析一种基本的缩进语言。最初我使用的是 Parsec,我设法通过缩进正常工作,但现在我遇到了一些麻烦。 我一直在关注一个教程here这是我必须解析一种忽略缩进的语言的代
我遇到了以下解析问题: 解析一些可能包含来自有限字符集的零个或多个元素的文本字符串,最多但不包括一组终止字符中的一个。应通过Maybe 指示内容/无内容。终止字符可能以转义形式出现在字符串中。任何不允
考虑这个正则表达式: ^foo/[^=]+/baz=(.*),[^,]*$ 如果我在 foo/bar/baz=one,two 上运行它,它会匹配并且子组捕获 one。如果我在 foo/bar/baz/
我有一个解析器定义为以下稍微复杂的版本: data X = X { getX :: State ([Int], [X]) Bool } type Parser = ParsecT Void Strin
我正在尝试为正在解析的某些源文件生成源映射,并且我想获取每个节点的范围。 getSourcePos只给出 start position一个节点(src:line:column)。如何获得它的结束位置?
我想使用 Megaparsec 在 Haskell 中解析与此类似的文本。 # START SKIP def foo(a,b): c = 2*a # Foo return a + b
使用 Megaparsec 5。 关注 this guide ,我可以通过结合 StateT 来实现回溯用户状态和 ParsecT (未定义的类型应该是明显的/不相关的): type MyParser
我在关注 Megaparsec documentation解析多维数组。 opSubscript = Postfix $ foldr1 (.) some singleIndex singleInde
所以我正在尝试做标准的“为类似方案的语言编写一个解析器”练习来找出 MegaParsec 和 monad 转换器。根据许多教程和博客文章的建议,我使用 ReaderT 和 local 来实现词法作用域
如果我有一个像这样的解析器: notZeroOrOne :: Parser Char notZeroOrOne = noneOf ['0' , '1'] 有没有一种方法可以组合另一个解析器(例如dig
我已经完成了this Megaparsec tutorial现在我正在尝试基于此编写我自己的解析器。我想为编写的汇编语言编写一个简单的解析器: Label: lda $0ffe sta
我是一名优秀的程序员,十分优秀!