2011-12-05 35 views
12

我在學習如何使用Parsec來編寫一個Delphi解析器,但是我一直在定義LanguageDef。如何在Parsec中定義多種類型的註釋塊

在Delphi中,有兩種類型的註釋塊,(* comments *){ comments }。 但是評論的類型CommentDeartEnd的LanguageDef是String,而不是[String],所以我只能放在其中一個。

所以,我試圖製作我自己的whiteSpace解析器,但我不確定我是否可以將它傳遞到makeTokenParser

任何幫助,將不勝感激。

感謝


約翰和克里斯都幫助我瞭解和解決問題搞定了,但解決的辦法包括更換該makeTokenParser提供解析器的一個龐大的數字,所以它不是完全不可取的。

如果我能找到更好的解決方案,我會再次發佈。

+0

我知道這並不能回答你的問題,但麥克蚶做一個開源的德爾福分析器和詞法分析器,稱爲[DCC] (http://www.soft-gems.net/index.php?option=com_content&task=view&id=25&Itemid=33)。 –

回答

5

我對Text.ParserCombinators.Parsec.Language文件的閱讀是,這不能直接使用LanguageDef來完成。

我相信你是在正確的軌道上編寫你自己的whiteSpace解析器。爲了成功使用它,您需要覆蓋由makeTokenParser生成的whiteSpace解析器。由makeTokenParser創建的TokenParser是包含解析器的每個字段的記錄。我們可以替換爲這些領域的一個創造紀錄的新副本如下:

-- ask GCHi for the type actual type signature constraints 
-- Type sig is approx. fixWhiteSpace :: TokenParser -> Parser -> TokenParser 
fixWhiteSpace originalTokenParser myWhiteSpaceParser = 
    originalTokenParser {whiteSpace = myWhiteSpaceParser} 
+0

我有一個快速嘗試,它似乎沒有工作,但我可以做一些其他的錯誤。我會花更多時間在上面。 只需要確認,如果在原始'whiteSpace'中定義的'originalTokenParser'中有另一個解析器,那麼一旦我應用了'fixWhiteSpace',這個解析器會自動使用'myWhiteSpaceParser'嗎? – ePak

+1

@epak:不可以。所有的值都是不可變的,所以定義「newParser = fixWhiteSpace blach」不會影響originalTokenParser。 –

+0

@ChrisKuklewicz:感謝您爲我清理這個問題,事實上這是潛在的問題。 'lexeme'解析器是用'whiteSpace'來定義的,而且更多的解析器,包括'identifier',都是用'lexeme'來定義的。一旦我用像@John建議的'lexeme'和'whiteSpace'的定義替換了'identifier'解析器,它將處理多種類型的註釋塊。 – ePak

相關問題