2014-07-24 40 views
0

我在我的parsec解析器中有一個愚蠢的情況,我希望得到您的幫助。解析parsec中單引號字符串中的單個字符char

我需要解析一系列由| |分隔的強/字符。字符。 所以,我們可以有一個| B | 'C' | 'ABCD'

應該變成

[a,b,c,abcd] 

空間是不允許的,除非 '' 字符串內。現在,在我天真的嘗試中,我現在已經得到了可以將字符串解析爲[a'a,bb]而不是aa |'b'b'的字符串[aa,b'b] 。

singleQuotedChar :: Parser Char 
singleQuotedChar = noneOf "'" <|> try (string "''" >> return '\'') 

simpleLabel = do 
    whiteSpace haskelldef 
    lab <- many1 (noneOf "|") 
    return $ lab 

quotedLabel = do 
    whiteSpace haskelldef 
    char '\'' 
    lab <- many singleQuotedChar 
    char '\'' 
    return $ lab 

現在,我該如何告訴解析器考慮'停止',如果它後面跟着|或空白? (或者,得到一些'字符計入此)。輸入是用戶生成的,所以我不能依賴他們的字符。

+2

您試圖解析''b'b'',但在'singleQuotedChar'中,您要求單引號只能成對出現。你是不是試圖把''b''b''解析爲'b'b'?如果你想讓''b'b''被解析,你需要改變singleQuotedChar的定義。 – rampion

+0

解析器應該如何知道它應該保持在'aa|'b'b'中間?我正努力去理解你想要做的事情。它是否像包圍字符一樣,但僅在| |旁邊有效。爲什麼要這樣呢? (可能的答案:這是更大的輸入的一部分,其中空間意味着別的東西。) – AndrewC

+0

下面是我認爲你的意思:字符串是一系列字母(或數字?),撇號和由撇號括起來的空格,或者一系列字母(數字)和撇號沒有用撇號括起來。字符串用垂直條插入。 – AndrewC

回答

1

請注意,允許用引號分隔的字符串中間的引號非常混亂,但我相信這應該允許您解析它。

quotedLabel = do -- reads the first quote. 
    whiteSpace 
    char '\'' 
    quotedLabel2 

quotedLabel2 = do -- reads the string and the finishing quote. 
    lab <- many singleQuotedChar 
    try (do more <- quotedLabel3 
      return $ lttrace "quotedLabel2" (lab ++ more)) 
    <|> (do char '\'' 
      return $ lttrace "quotedLabel2" lab) 


quotedLabel3 = do -- handle middle quotes 
    char '\'' 
    lookAhead $ noneOf ['|'] 
    ret <- quotedLabel2 
    return $ lttrace "quotedLabel3" $ "'" ++ ret 
+0

嗨。也許我很愚蠢,但由於未定義'lttrace',導致上面的代碼出錯。我在哪裏得到它? –

+0

糟糕,只需用y替換每個'lttrace x y' – tohava