我遇到了为一种语言编写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)?
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)
}
答案 0 :(得分:1)
一个(未经测试)采取解决方案1:
literal = quotedLiteral <|> someChars
where someChars = do
res <- many1 (noneOf " \n")
if (res == ';')
then parserZero
else return res