2009-10-15 36 views
1

我一直在竊取May09奧斯陸位,試用一些源代碼標記。我似乎無法弄清楚如何正確處理多行C風格的評論。 例如:/*comment*/是否可以解析MGrammar中的多行c風格評論?

避開了我的一些情況:

/***/ 

/**//**/ 

我可以做一個或其他工作,但不能同時使用。 語法是:

module Test { 
    language Comments { 

     token Comment = 
      MultiLineComment; 

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

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

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

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

     syntax Main = Comment*; 
    } 
} 

註釋掉令牌是什麼,我認爲我想做的事情,但是遞歸令牌是不允許的。 事實上,MGrammar本身有「破」多行註釋(它不能處理/***/)使我相信這是不可能的。

有誰知道嗎?

回答

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

這允許單線(//)評論,以及多行(/* */)的意見。

+0

這是我提供的兩種情況中的第一種失敗。 – MarkPflug 2009-11-12 21:33:19