2012-10-06 35 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以了解使用情况,以处理嵌套注释。