2012-10-06 16 views
5

Cスタイルの複数行のコメント(つまり、/* ... */)をScalaパーサーのコンビネータで(効率的に)解析する最良の方法は何ですか?Scala Parser Combinators:効率的にCスタイルのコメントを解析する

私が関与しているプロジェクトでは、Cのようなプログラミング言語を解析し、複数行のコメントをサポートしたいと考えています。我々はStdLexicalを経由して(すでに、このようなコメントを取り扱うStandardTokenParsersのサブクラスを使用しています。しかし、クラスは唯一のかなり短い複数行のコメントのために働く、とそうでない場合は、スタック領域が不足。

我々はまた、私たち自身の定義を提供しようとしています

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]] 
    } 

    // ... 

} 

これは少し状況が改善したが、コメントは数十行以上であれば、まだスタックオーバーフローが発生します。空白の次のように我々は(another question on StackOverflowに触発さ)RegexParserを使用し、物事をより効率的にします。どのようにこれを改善するためのアイデア?

答えて

7

正規表現を使用する代わりに、パーサーを使用して空白をスキップすることを定義することによって、この種の問題で成功しました。サポートコードについては、Kiama ParserUtilities.scalaのWhitespaceParserの特性を参照してください。

通常の正規表現の空白処理をオーバーライドし、新しいパーサーをリテラルと正規表現のコンビネータに結びつけることです(通常、トークンパーサーは使用しません)。ネストされたコメントを処理するには、使用方法についてはone of our examplesを参照してください。

関連する問題