1

我一直在研究 May09 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 回答