2010-06-08 86 views
0

如何解析使用MGrammar的行註釋塊?使用MGrammar解析行註釋塊

我想解析行註釋的塊。每行旁邊的行註釋應分組在MGraph輸出中。

我無法將行註釋塊分組在一起。我當前的語法使用「\ r \ n \ r \ n」來終止一個塊,但是在所有情況下都不起作用,例如在文件末尾或者當我引入其他語法時。

樣品輸入看起來是這樣的:

/// This is block 
/// number one 

/// This is block 
/// number two 

我現在的語法如下:

module MyModule 
{ 
    language MyLanguage 
    {  
     syntax Main = CommentLineBlock*; 

     token CommentContent = !(
           '\u000A' // New Line 
           |'\u000D' // Carriage Return 
           |'\u0085' // Next Line 
           |'\u2028' // Line Separator 
           |'\u2029' // Paragraph Separator 
           ); 

     token CommentLine = "///" c:CommentContent* => c; 
     syntax CommentLineBlock = (CommentLine)+ "\r\n\r\n"; 

     interleave Whitespace = " " | "\r" | "\n"; 
    } 
} 

回答

1

的問題是,你交錯所有空格 - 這樣解析令牌和來之後詞法分析器,他們只是「不存在」了。

CommentLineBlock你的情況syntax,但你需要的註釋塊在tokens被完全消耗......

language MyLanguage 
{  
    syntax Main = CommentLineBlock*; 

    token LineBreak = '\u000D\u000A' 
         | '\u000A' // New Line 
         |'\u000D' // Carriage Return 
         |'\u0085' // Next Line 
         |'\u2028' // Line Separator 
         |'\u2029' // Paragraph Separator 
         ; 

    token CommentContent = !(
          '\u000A' // New Line 
          |'\u000D' // Carriage Return 
          |'\u0085' // Next Line 
          |'\u2028' // Line Separator 
          |'\u2029' // Paragraph Separator 
          ); 

    token CommentLine = "//" c:CommentContent*; 
    token CommentLineBlock = c:(CommentLine LineBreak?)+ => Block {c}; 

    interleave Whitespace = " " | "\r" | "\n"; 
} 

但問題是,在CommentLine的subtoken規則不會被處理 - 你得到純淨的字符串解析。

Main[ 
    [ 
    Block{ 
     "/// This is block\r\n/// number one\r\n" 
    }, 
    Block{ 
     "/// This is block\r\n/// number two" 
    } 
    ] 
] 

我可能會嘗試找到一種更好的方式,今晚:-)