Разбор блоков комментариев строки с использованием 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 не будут обработаны - вы получите простые строки.
Main[
[
Block{
"/// This is block\r\n/// number one\r\n"
},
Block{
"/// This is block\r\n/// number two"
}
]
]
Я мог бы попытаться найти лучший способ сегодня вечером:-)