2013-07-18 101 views
1

我正在使用Parsec處理Haskell中的解析器。問題在於閱讀字符串"| "。當我嘗試閱讀以下內容時,Haskell Parser在「|」上失敗閱讀

parseExpr = parseAtom 
     -- | ... 
     <|> do string "{|"  
       args <- try parseList <|> parseDottedList 
       string "| " 
       body <- try parseExpr 
       string " }" 
       return $ List [Atom "lambda", args, body] 

我得到一個分析錯誤,如下所示。

Lampas >> {|a b| "a" } 
Parse error at "lisp" (line 1, column 12): 
unexpected "}" 
expecting letter, "\"", digit, "'", "(", "[", "{|" or "." 

另一個失敗的案例是^承擔以下。

Lampas >> {|a b^ "a" } 
Parse error at "lisp" (line 1, column 12): 
unexpected "}" 
expecting letter, "\"", digit, "'", "(", "[", "{|" or "."     

但是,它的工作原理當字符串"| "被替換"} "預期。

parseExpr = parseAtom 
    -- | ... 
    <|> do string "{|"  
      args <- try parseList <|> parseDottedList 
      string "} " 
      body <- try parseExpr 
      string " }" 
      return $ List [Atom "lambda", args, body] 

以下是上述修改後的REPL行爲。

Lampas >> {|a b} "a" } 
(lambda ("a" "b") ...)     

所以,問題是(一)沒有管在哈斯克爾串的特殊行爲,也許只有在<|>鏈?,和(b)這種行爲是如何避免的?

+0

什麼是'parseList'和'parseDottedList'? – Ankur

+0

@Ankur其他的「讀入」函數,如'char'或'spaces'。 – matt3141

+0

嘗試改變它與另一個'char',一個沒有用在解析中,就像你選擇的'}',看看是否Haskell或你的語法 – chamini2

回答

0

字符|可能在一組保留字符中。使用其他字符進行測試,如^,並且我認爲它也會失敗。解決此問題的唯一方法可能是更改一組保留字符或解釋器的結構。