2012-10-06 147 views
5

用Scala解析器組合器(有效)解析C樣式多行註釋(即/* ... */)的最佳方式是什麼?Scala解析器組合器:有效地解析C-Style註釋

在我參與的一個項目中,我們解析了一個C語言的編程語言,並且想要支持多行註釋。我們使用的StandardTokenParsers一個子類,其中已經處理了這些意見(通過StdLexical,但該類只適用於相當短的多行註釋,並運行了,否則堆棧空間。

我們也試圖提供我們自己的定義空白,使事情變得更加高效,我們使用了RegexParser(由another question on StackOverflow啓發)如下:

class Parser extends StandardTokenParsers { 

    override val lexical = new StdLexical { 
    def rp: RegexParsers = new RegexParsers {} 
    override val whitespace: Parser[Any] = rp.regex("""(\s|//.*|(?m)/\*(\*(?!/)|[^*])*\*/)*""".r).asInstanceOf[Parser[Any]] 
    } 

    // ... 

} 

這略有好轉,但仍導致堆棧溢出如果註釋是比幾十行了。任何想法如何改善?

回答

7

通過使用分析器而不是使用正則表達式來定義跳過空白的跳躍,我們已經取得了一些成功。請參閱我們的Kiama ParserUtilities.scala中的WhitespaceParser特徵以獲取一些支持代碼。

大部分的混亂是重寫正常的正則表達式空白處理,並將新的解析器綁定到文字和正則表達式組合器(我們通常不使用令牌解析器)。在這種情況下,請參閱one of our examples以瞭解使用情況,以處理嵌套註釋。