Забавно, что вы упомянули это, потому что я занимался этой проблемой только на прошлой неделе. См. JMD, Уценка и краткий обзор синтаксического анализа и компиляторов . Я работаю над настоящим анализатором Markdown и попробовал его с ANTLR.
Есть несколько способов справиться с этим.
Во-первых, вы можете просто разобрать:
BLOCK_QUOTE : '>' (' ' | '\t')? ;
и обработайте его на этапе синтаксического анализа, возможно, в качестве правила перезаписи.
Дело в том, что они важны только тогда, когда они появляются в начале строки, поэтому здесь есть другой подход:
@members {
int quoteDepth = 0;
}
BLOCK_QUOTE : '\n' (q+='>' (' ' | '\t')?)+
{ if ($q.size() > quoteDepth) /* emit one or more START_QUOTE tokens */
else if ($q.size() < quoteDepth /* emit one or more END_QUOTE tokens */
quoteDepth = $q.size(); }
Возможно, вышеприведенное может быть правилом синтаксического анализа, а не лексическим правилом. Я забыл.
Но даже это неудовлетворительно, потому что оно как бы заставляет вас обращаться с источником Markdown как с последовательностью строк, которая на самом деле не то, что вам нужно в других частях.
Также обычно каждое лексическое правило может приводить только к одному токену, поэтому вам нужно перезаписать другой класс, который избегает меня, чтобы разрешить испускать несколько токенов. Пример этого есть в (превосходном и почти обязательном) полномасштабном справочнике ANTLR: построение доменных языков .
В конечном итоге я отказался от ANTLR как инструмента выбора для этого. Надеемся, что мое собственное решение с кодировкой вручную появится на следующей неделе или через две.