parsec无法为endBy函数定义规则

时间:2011-06-07 22:10:04

标签: haskell parsec

我遇到了为一种语言编写parsec规则的问题 我有下一个语言定义(有问题的部分)

COMMAND ::= ':' WS LITERAL WS {LITERAL WS}* ';'
LITERAL ::= "[CHAR]*" | [^"\ ][^\ ]*

其中WS代表空格,LITERAL是除空格或空格之外的任何字符 引用的字符可以包含空格 所以,我写了下一个函数:

literal = quotedLiteral <|> many1 (noneOf " ") 
command = do { char ':'
             ; separator
             ; name <- literal
             ; separator
             ; cmds <- endBy literal separator            -- (1)
             ; char ';'                                   -- (2)
             ; return (name, Command cmds)
             }

问题是那个符号';'是一个有效的文字,因此(1)函数解析它 有一个解析错误,因为(2)找不到';'字符。

有没有办法克服这个问题: 要么使文字功能不接受';'如文字或某种方式修复(2)?


在sclv发表评论之后,我找到了一个解决方案:

  literal :: Parser Literal
  literal = -- as desired in sclv (changing parserZero to pzero


  command :: Parser TCommand
  command = do { char ':'
            ; separator
            ; name <- literal <?> "no name"
            ; separator
            ; cmds <- sepEndBy (do { try( literal) }) separator
            ; char ';'
            ; return (name, Command cmds)
            }

1 个答案:

答案 0 :(得分:1)

一个(未经测试)采取解决方案1:

literal = quotedLiteral <|> someChars
   where someChars = do 
            res <- many1 (noneOf " \n")
            if (res == ';')
               then parserZero
               else return res