Можно ли анализировать многострочные комментарии в стиле 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
);
Это позволяет для обеих строк (//
) комментарии, а также многострочные (/* */
) Комментарии.