在#idris频道上聊天后,我了解到大多数内置的高阶解析器(例如。
dquote
)跳过末尾的空白。
就我而言,这不是我想要的。相反,我使用了
between
函数包含3个参数,一个用于何时启动,另一个用于何时停止,第三个用于中间的任何参数。
为了解析字符串文字,我现在要做以下操作:
escape : Parser String
escape = do
d <- char '\\'
c <- oneOf "\\\"0nrvtbf'"
pure $ pack $ (the $ List Char) [d,c]
nonEscape : Parser String
nonEscape = map (\x => pack $ (the $ List _) [x]) $ noneOf "\\\"\0\n\r\v\t\b\f"
character : Parser String
character = nonEscape <|>| escape
stringLiteralToken : Parser Token
stringLiteralToken = map (StringLiteral . concat) $ (between (char '"') (char '"')) (many character)