1

私は 2009 年 5 月の Oslo ビットをハックして、いくつかのソース コードをトークン化して実験しました。ただし、複数行の C スタイルのコメントを正しく処理する方法がわかりません。例えば:/*comment*/

私を逃れるいくつかのケース:

/***/

また

/**//**/

どちらか一方を機能させることはできますが、両方を機能させることはできません。文法は次のとおりです。

    module Test {
    language Comments {

        token Comment =
            MultiLineComment;

        token MultiLineComment =
            "/*" MultiLineCommentChar* "*/";

        token MultiLineCommentChar =
            ^ "*" |
            "*" PostAsteriskChar;

        token PostAsteriskChar =
            ^ "*" |
            "*" ^("*" | "/"); 

        /*    
        token PostAsteriskChar =
            ^ "*" |
            "*" PostAsteriskChar; 
        */

        syntax Main = Comment*;
    }
}

コメントアウトされたトークンは私がやりたいと思っていることですが、再帰的なトークンは許可されていません。MGrammar 自体が「壊れた」複数行のコメントを持っている (それは処理できない/***/) という事実から、これは不可能だと思います。

他に誰か知っていますか?

4

1 に答える 1

0

私が行った方法は次のとおりです(すべて自分のコードではありませんが、元の作成者への参照が見つかりません)。

interleave Skippable = Whitespace | Comment;
interleave Comment = CommentToken;
@{Classification["Comment"]}
token CommentToken = CommentDelimited
| CommentLine;
token CommentDelimited = "/*" CommentDelimitedContent* "*/";
token CommentDelimitedContent
= ^('*')
| '*'  ^('/');
token CommentLine = "//" CommentLineContent*;
token CommentLineContent
= ^(
'\u000A' // New Line
|  '\u000D' // Carriage Return
|  '\u0085' // Next Line
|  '\u2028' // Line Separator
|  '\u2029' // Paragraph Separator
);

これにより、単一行 ( //) コメントと複数行 ( ) コメントの両方が可能になり/* */ます。

于 2009-11-10T01:40:14.707 に答える