Разбор блоков комментариев строки с использованием MGrammar - PullRequest
0 голосов
/ 08 июня 2010

Как я могу проанализировать блоки комментариев строки с 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 Ответ

1 голос
/ 20 июля 2010

Проблема в том, что вы чередуете все пробелы - поэтому после разбора токенов и перехода к лексеру они просто «больше не существуют».

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 не будут обработаны - вы получите простые строки, проанализированные.

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

Я мог бы попытаться найти лучший способ сегодня вечером: -)

...