Haskell Parsec类似于many1,但如果结束则会失败
我正在经历,我被困在让数字正常工作。我想用下面的代码来解析一个十六进制数Haskell Parsec类似于many1,但如果结束则会失败,haskell,parsec,Haskell,Parsec,我正在经历,我被困在让数字正常工作。我想用下面的代码来解析一个十六进制数 parseOct :: Parser LispVal parseOct = do char '#' char 'o' x <- many1 $ oneOf "01234567" return . Number . fst . head . readOct $ x parseOct::Parser LispVal parseOct=do 字符“#” ch
parseOct :: Parser LispVal
parseOct = do
char '#'
char 'o'
x <- many1 $ oneOf "01234567"
return . Number . fst . head . readOct $ x
parseOct::Parser LispVal
parseOct=do
字符“#”
char'o'
x使用notfollowerby
确保八进制数字后面没有字母数字:
import Text.Parsec
import Text.Parsec.Char
import Text.Parsec.String
import Text.Parsec.Combinator
parseOct' :: Parser String
parseOct' = do
char '#'
char 'o'
x <- many1 (oneOf "01234567")
notFollowedBy alphaNum
return x
test1 = parseTest parseOct' "#o123"
test2 = parseTest parseOct' "#o1238"
使用notfollowerby
确保八进制数字后面没有字母数字:
import Text.Parsec
import Text.Parsec.Char
import Text.Parsec.String
import Text.Parsec.Combinator
parseOct' :: Parser String
parseOct' = do
char '#'
char 'o'
x <- many1 (oneOf "01234567")
notFollowedBy alphaNum
return x
test1 = parseTest parseOct' "#o123"
test2 = parseTest parseOct' "#o1238"
如果除['0'..'7']
之外的#o
后面的任何内容导致失败,那么输入的其余部分会发生什么情况?这个问题在上下文中没有意义。我希望您希望使用中的所有数字,例如,#o17
,它应该解析为数字15
@leftaroundabout我想我确实需要考虑接下来会发生什么,而不是不会发生什么,我需要继续解析以找到下一个参数sexp或eof,如果#o
后面除了['0'..'7']
之外的任何东西导致失败?这个问题在上下文中没有意义。我希望你想使用中的所有数字,例如,#o17
,它应该解析为数字15
@leftarounda关于我想我确实需要考虑接下来会发生什么,而不是不会发生什么,我需要继续解析以找到下一个参数,sexp或eof。我想这就是我正在寻找的,我想我需要明确说明什么可以跟在后面,而不是什么不能跟在后面(我认为只是“,”)和eof),那么如果后面跟其他东西,它就不匹配了,你认为呢?这可以通过定义s-exp的结构来处理。当你为它编写规则时“sexp是一个基本术语序列,由paren包围的空格分隔。”parsec在解析任何基本术语后都需要一个空格、右paren或eof。我想这就是我要找的,我想我需要明确地说明什么可以跟在后面,而不是什么不能跟在后面(我只想“,”)'和eof),那么如果后跟其他内容,它就不匹配了,你认为呢?这可以通过定义s-exp的结构来处理。当你编写“sexp是一个基本术语序列,由paren包围的空格分隔”规则时,parsec在解析任何基本术语后都会期望一个空格,对吗。