0

MGramar で行コメントのブロックを解析するにはどうすればよいですか?

行コメントのブロックを解析したい。それぞれの横にある行コメントは、MGraph 出力でグループ化する必要があります。

行コメントのブロックをグループ化するのに問題があります。私の現在の文法では "\r\n\r\n" を使用してブロックを終了していますが、ファイルの終わりや他の構文を導入した場合など、すべての場合に機能するとは限りません。

サンプル入力は次のようになります。

/// This is block
/// number one

/// This is block
/// number two

私の現在の文法は次のようになります。

module MyModule
{
    language MyLanguage
    {       
        syntax Main = CommentLineBlock*;

        token CommentContent = !(
                                 '\u000A' // New Line
                                 |'\u000D' // Carriage Return
                                 |'\u0085' // Next Line
                                 |'\u2028' // Line Separator
                                 |'\u2029' // Paragraph Separator
                                );   

        token CommentLine = "///" c:CommentContent* => c;
        syntax CommentLineBlock = (CommentLine)+ "\r\n\r\n";

        interleave Whitespace = " " | "\r" | "\n";   
    }
}
4

1 に答える 1

1

問題は、すべての空白をインターリーブすることです。そのため、トークンを解析してレクサーに到達した後、それらはもはや「存在しません」。

CommentLineBlock はsyntaxあなたの場合ですが、コメントブロックを完全に消費するにはtokens...

language MyLanguage
{       
    syntax Main = CommentLineBlock*;

    token LineBreak = '\u000D\u000A'
                         | '\u000A' // New Line
                         |'\u000D' // Carriage Return
                         |'\u0085' // Next Line
                         |'\u2028' // Line Separator
                         |'\u2029' // Paragraph Separator
                        ;  

    token CommentContent = !(
                             '\u000A' // New Line
                             |'\u000D' // Carriage Return
                             |'\u0085' // Next Line
                             |'\u2028' // Line Separator
                             |'\u2029' // Paragraph Separator
                            );   

    token CommentLine = "//" c:CommentContent*;
    token CommentLineBlock = c:(CommentLine LineBreak?)+ => Block {c};

    interleave Whitespace = " " | "\r" | "\n";   
}

しかし、問題は、CommentLine のサブトークン ルールが処理されないことです。プレーンな文字列が解析されます。

Main[
  [
    Block{
      "/// This is block\r\n/// number one\r\n"
    },
    Block{
      "/// This is block\r\n/// number two"
    }
  ]
]

今夜はもっといい方法を見つけようとするかもしれません:-)

于 2010-07-20T06:06:14.270 に答える