2012-10-17 30 views
3

我有這麼多:我如何從Parsec文件中刪除註釋?

comment :: GenParser Char st() 
comment = 
    (string "--" >> manyTill anyChar newline >> spaces >> return()) <|> 
    (string "/*" >> manyTill anyChar (string "*/") >> spaces >> return()) 

eatComments :: GenParser Char st String 
eatComments = do 
    xs <- many (do 
      optional comment 
      x <- manyTill anyChar (try comment) 
      return x) 
    return $ intercalate " " xs 

這工作如果輸入一個註釋結束,但如果它與別的結束失敗。在這種情況下,該錯誤信息是一樣

No match (line 13, column 1): 
unexpected end of input 
expecting "--" or "/*" 

所以解析器的時候eof到達找一個評論。我需要一些幫助找到正確的組合器,我需要在所有可能的情況下吃掉所有的評論。

+1

如果您不想保留註釋,請使用令牌模塊。請參閱原始Parsec 2.0發行版中的示例以使用令牌模塊和LanguageDef's:http://legacy.cs.uu.nl/daan/parsec.html –

+0

這是否需要MySQL的SQL和DDL版本的語言def? – dan

+0

是的。有效地,LangaugeDef是Parsec的詞法分析規範。他們的寫作要比Alex詞法分析器簡單得多 - 儘管他們不那麼強大。 –

回答

3

也許使用類似eof

comment :: GenParser Char st() 
comment = 
    (string "--" >> manyTill anyChar newline >> spaces >> return()) <|> 
    (string "/*" >> manyTill anyChar ((try (string "*/") >> return()) <|> eof) >> spaces >> return()) 
+0

對於產生錯誤「無法匹配預期類型'字符串',實際類型爲'()'」 – dan

+0

...在'(<|>)'的第二個參數中,即'eof' 在第二個參數'manyTill',即 '(字符串「* /」<|> eof)' – dan

+0

對不起,我現在修好了。另外,請注意,你需要'try(string「* /」)'來關閉註釋,否則以下輸入將失敗:/ * Hello World ** / –

0

我打這似乎工作。但請隨時批評:

comment :: GenParser Char st() 
comment = 
    (string "--" >> manyTill anyChar newline >> spaces >> return()) <|> 
    (string "/*" >> manyTill anyChar (string "*/") >> spaces >> return()) 

notComment = manyTill anyChar (lookAhead (comment <|> eof)) 

eatComments :: GenParser Char st String 
eatComments = do 
    optional comment 
    xs <- sepBy notComment comment 
    optional comment 
    return $ intercalate "" xs