Можно ли анализировать многострочные комментарии в стиле c в MGrammar?

Я взломал биты Oslo за май 2009 года, экспериментировал с токенизацией некоторого исходного кода. Я не могу понять, как правильно обрабатывать многострочные комментарии в стиле C, хотя. Например: /*comment*/

Некоторые случаи, которые ускользают от меня:

/***/

или же

/**//**/

Я могу заставить одну или другую работу, но не оба. Грамматика была:

    module Test {
    language Comments {

        token Comment =
            MultiLineComment;

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

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

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

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

        syntax Main = Comment*;
    }
}

Я думаю, что хочу сделать закомментированный токен, однако рекурсивные токены не допускаются. Тот факт, что MGrammar сам "сломал" многострочные комментарии (он не может обработать /***/) заставляет меня поверить, что это невозможно.

Кто-нибудь знает иначе?

1 ответ

Я сделал это следующим образом (не весь мой собственный код, но я не могу найти ссылку на оригинального автора).

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
);

Это позволяет для обеих строк (//) комментарии, а также многострочные (/* */) Комментарии.

Другие вопросы по тегам