是否可以在MGrammar中解析多行c样式注释?

时间:2009-10-15 06:22:16

标签: mgrammar

我一直在讨论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本身已“破坏”多行评论(无法处理/***/)这一事实让我相信这是不可能的。

有人知道吗?

1 个答案:

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

这允许单行(//)注释以及多行(/* */)注释。