Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell Parsec类似于many1,但如果结束则会失败_Haskell_Parsec - Fatal编程技术网

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在解析任何基本术语后都会期望一个空格,对吗。