我一直在讨论May09的奥斯陆比特,尝试使用一些源代码进行标记。我似乎无法弄清楚如何正确处理多行C风格的评论。
例如:/*comment*/
有些案例让我望而却步:
/***/
或
/**//**/
我可以做一个或另一个工作,但不是两个。 语法是:
module Test {
language Comments {
token Comment =
MultiLineComment;
token MultiLineComment =
"/*" MultiLineCommentChar* "*/";
token MultiLineCommentChar =
^ "*" |
"*" PostAsteriskChar;
token PostAsteriskChar =
^ "*" |
"*" ^("*" | "/");
/*
token PostAsteriskChar =
^ "*" |
"*" PostAsteriskChar;
*/
syntax Main = Comment*;
}
}
注释掉的令牌是我想要做的,但是不允许使用递归令牌。
MGrammar本身已“破坏”多行评论(无法处理/***/
)这一事实让我相信这是不可能的。
有人知道吗?
答案 0 :(得分: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
);
这允许单行(//
)注释以及多行(/* */
)注释。