使用parsec时出现空列表问题

时间:2013-03-08 12:33:16

标签: parsing haskell parsec

以下是一些代码导致一些非常奇怪的错误,具体取决于是什么 在目标文件中的令牌空列表之后解析。

data Express = Seq [Express]
              | ID String
              | Num Integer
              | BoolConst Bool
              | EmptyList String

emptyList :: Parser Express
emptyList = fmap EmptyList (string "[]") 

问题是:

如果字符串“[]”后跟除了数字或文件末尾之外的任何内容(包括空格),则会导致以下错误

(line 1, column 6):
unexpected end of input   OR    unexpected "d"
expecting digit
*** Exception: user error (parse error) 

然而,当使用[]后面的数字解析时,它不会报错。

e.g. "[] "  error 
     "[] a" error
     "[] 1" successful

还应该从数据定义和文件中的其他地方删除Num Integer

number :: Parser Express
number = fmap Num integer

在“[]”之后,文件将在没有任何内容的情况下解析,但解析只会在第一次出现“[]”之前返回,并且之后没有任何内容

提前致谢。

1 个答案:

答案 0 :(得分:0)

问题来自于表达式被分隔的方式,在处理多个表达式时,whiteSpace没有被正确计算。 最初:

seqOfExpr8 =        
    do list <- (sepBy1 expr8 (string "" ) ) 
       return $ if length list == 1 then head list else Seq list     

固定:

seqOfExpr8 =        
    do list <- (sepBy1 expr8 whiteSpace ) 
       return $ if length list == 1 then head list else Seq list     

其中whiteSpace是genTokenParser Type的词法解析器。