0

这是一些导致一些非常奇怪的错误的代码,具体取决于在目标文件中的令牌 emptyList 之后解析的内容。

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

该文件将在“[]”之后没有任何内容进行解析,但是解析只会返回到第一次出现“[]”,之后什么都没有

提前致谢。

4

1 回答 1

0

问题来自于表达式的分隔方式,在处理多个表达式时没有正确考虑空格。最初:

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 类型的词位解析器。

于 2013-03-08T22:18:19.047 回答