解析器中的Parsec <|>选择,抛出错误,但不会转到下一个解析器

阿什什尼吉

我正在学习haskell Write yourself a scheme

我目前正在尝试char在计划中实施认可。字符是#\<character>or或#\<character-name>like#\a#\or #\space

所以我写了下面的代码:

-- .. some code ..
data LispVal = Atom String
             | List [LispVal]
             | DottedList [LispVal] LispVal
             | String String
             | Number Integer
             | Bool Bool
             | Char Char deriving Show
-- .... More code ...
parseChar :: Parser LispVal
parseChar = liftM Char (parseSingleChar <|> parseSpecialCharNotation)

parseSingleChar :: Parser Char
parseSingleChar = do string "#\\"
                     x <- letter
                     return x

parseSpecialCharNotation :: Parser Char
parseSpecialCharNotation = do string "#\\"
                              x <- (parseSpace <|> parseNewline)
                              return x

parseSpace :: Parser Char
parseSpace = do char 's'
                char 'p'
                char 'a'
                char 'c'
                char 'e'
                return ' '

parseNewline :: Parser Char
parseNewline = do char 'n'
                  char 'e'
                  char 'w'
                  char 'l'
                  char 'i'
                  char 'n'
                  char 'e'
                  return '\n'

-- .. some more code...

readExpr :: String -> String
readExpr input = case parse parseExpr "lisp" input of
                 Left err -> "Parse Error: " ++ show err
                 Right val -> "Found value: " ++ show val

目前,我不了解中的string解析器Parsec

问题是我可以识别,#\a但是#\space被视为s

*Main> readExpr "#\\space"
"Found value: Char 's'"

为了解决此问题,我将其更改parseChar

parseChar :: Parser LispVal
parseChar = liftM Char (parseSpecialCharNotation <|> parseSingleChar)

但较早的问题已解决,但现在却出现了正常字符的错误-

*Main> readExpr "#\\s"
"Parse Error: \"lisp\" (line 1, column 4):\nunexpected end of input\nexpecting \"p\""

为什么会这样呢?它不应该parseSingleChar变成parseSpecialCharNotation失败吗?

完整代码位于:Gist

尤拉斯

文档<|>

该解析器称为预测性解析器,因为仅在解析器p不使用任何输入(即,前瞻为1)时才尝试q。

在您的情况下,两个解析都会"#\\"在失败之前消耗掉,因此无法评估其他选择。您可以try用来确保回溯按预期进行:

解析器的try p行为类似于解析器p,只是它在发生错误时假装它没有消耗任何输入。

类似于下一个:

try parseSpecialCharNotation <|> parseSingleChar

旁注:最好"#\\"从解析器中提取出来,因为否则您将做两次相同的工作。类似于下一个:

do
  string "#\\"
  try parseSpecialCharNotation <|> parseSingleChar

另外,您可以使用stringcombinator而不是一系列char解析器。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

解析器中的Parsec <|>选择,会引发错误,但不会转到下一个解析器

来自分类Dev

在Haskell(Parsec)中链接两个解析器

来自分类Dev

lxml(xml python解析器)转到下一个元素

来自分类Dev

lxml(xml python解析器)转到下一个元素

来自分类Dev

使用Parsec的Haskell HTML解析器

来自分类Dev

Parsec 简单解析器导致错误“约束中的非类型变量参数:Stream sm Char”

来自分类Dev

另一个解析器中的C字符串解析器

来自分类Dev

如何为散置元素列表编写一个parsec解析器?

来自分类Dev

如何在EOF停止Haskell Parsec解析器

来自分类Dev

Parsec:扩展工作的解析器会产生奇怪的结果

来自分类Dev

Parsec:扩展工作的解析器会产生奇怪的结果

来自分类Dev

parsec:具有有用错误消息的字符串选择解析器

来自分类Dev

JSON解析器中的错误(NullPointerException)

来自分类Dev

BNF fparsec解析器中的错误

来自分类Dev

JSON解析器中的错误(NullPointerException)

来自分类Dev

如果解析器失败,请尝试从下一个特殊符号出现处进行解析

来自分类Dev

Parsec:如何使有关空格的解析器错误静音

来自分类Dev

单击按钮时出错,无法转到从微调器中选择的下一个活动

来自分类Dev

自定义文件解析器会随着每个下一个文件而变慢

来自分类Dev

Haskell Parsec组合器“很多”应用于接受空字符串的解析器

来自分类Dev

Haskell Parsec组合器“很多”应用于接受空字符串的解析器

来自分类Dev

了解Scala中的Packrat解析器

来自分类Dev

在C中实现xml解析器

来自分类Dev

C#中的Sip解析器

来自分类Dev

angularjs中的通用路由解析器?

来自分类Dev

QT中的json解析器

来自分类Dev

Go中的通用XML解析器

来自分类Dev

解析器中的Java异常处理

来自分类Dev

ANTLR:忽略解析器中的语句

Related 相关文章

  1. 1

    解析器中的Parsec <|>选择,会引发错误,但不会转到下一个解析器

  2. 2

    在Haskell(Parsec)中链接两个解析器

  3. 3

    lxml(xml python解析器)转到下一个元素

  4. 4

    lxml(xml python解析器)转到下一个元素

  5. 5

    使用Parsec的Haskell HTML解析器

  6. 6

    Parsec 简单解析器导致错误“约束中的非类型变量参数:Stream sm Char”

  7. 7

    另一个解析器中的C字符串解析器

  8. 8

    如何为散置元素列表编写一个parsec解析器?

  9. 9

    如何在EOF停止Haskell Parsec解析器

  10. 10

    Parsec:扩展工作的解析器会产生奇怪的结果

  11. 11

    Parsec:扩展工作的解析器会产生奇怪的结果

  12. 12

    parsec:具有有用错误消息的字符串选择解析器

  13. 13

    JSON解析器中的错误(NullPointerException)

  14. 14

    BNF fparsec解析器中的错误

  15. 15

    JSON解析器中的错误(NullPointerException)

  16. 16

    如果解析器失败,请尝试从下一个特殊符号出现处进行解析

  17. 17

    Parsec:如何使有关空格的解析器错误静音

  18. 18

    单击按钮时出错,无法转到从微调器中选择的下一个活动

  19. 19

    自定义文件解析器会随着每个下一个文件而变慢

  20. 20

    Haskell Parsec组合器“很多”应用于接受空字符串的解析器

  21. 21

    Haskell Parsec组合器“很多”应用于接受空字符串的解析器

  22. 22

    了解Scala中的Packrat解析器

  23. 23

    在C中实现xml解析器

  24. 24

    C#中的Sip解析器

  25. 25

    angularjs中的通用路由解析器?

  26. 26

    QT中的json解析器

  27. 27

    Go中的通用XML解析器

  28. 28

    解析器中的Java异常处理

  29. 29

    ANTLR:忽略解析器中的语句

热门标签

归档