2010-06-08 14 views
0

Comment puis-je analyser des blocs de commentaires de ligne avec MGrammar?Analyse des blocs de commentaires de ligne à l'aide de MGrammar

Je veux analyser les blocs de commentaires de ligne. Les commentaires de ligne à côté de chacun doivent être regroupés dans la sortie MGraph.

Je n'arrive pas à regrouper les blocs de commentaires de ligne. Ma grammaire actuelle utilise "\ r \ n \ r \ n" pour terminer un bloc mais cela ne fonctionnera pas dans tous les cas comme à la fin du fichier ou quand j'introduis d'autres syntaxes.

entrée de l'échantillon pourrait ressembler à ceci:

/// This is block 
/// number one 

/// This is block 
/// number two 

Ma grammaire actuelle ressemble à ceci:

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"; 
    } 
} 

Répondre

1

Le problème est que vous entrelacer tous les espaces blancs - donc après l'analyse syntaxique des jetons et venir le lexer, ils "n'existent plus".

CommentLineBlock est syntax dans votre cas, mais vous avez besoin des commentaires-blocs pour être complètement consommés dans 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"; 
} 

Mais le problème est que les règles de subtoken-en CommentLine ne sera pas être traité - vous obtenez des cordes simples analysées.

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

Je pourrais essayer de trouver ce soir :-) façon plus agréable