5

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

私が関与しているプロジェクトでは、C に似たプログラミング言語を解析しており、複数行のコメントをサポートしたいと考えています。のサブクラスを使用しますがStandardTokenParsers、これは既にそのようなコメントを ( 経由で) 処理していますStdLexical。ただし、このクラスはかなり短い複数行のコメントに対してのみ機能し、それ以外の場合はスタック スペースが不足します。

また、物事をより効率的にするために、独自の空白の定義を提供しようとしました。次のように ( StackOverflow に関する別の質問にRegexParser触発されて)を使用しました。

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

  // ...

}

これにより、状況はわずかに改善されましたが、コメントが数十行を超えるとスタック オーバーフローが発生します。これを改善する方法はありますか?

4

1 に答える 1

7

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

ほとんどのいじくり回しは、通常の正規表現の空白処理をオーバーライドし、新しいパーサーをリテラルと正規表現のコンビネーターに結び付けることです (通常、トークン パーサーは使用しません)。使用例の 1 つを参照してください。この場合は、ネストされたコメントを処理します。

于 2012-10-08T03:44:26.007 に答える