Markdown BlockQuote Parsing com ANTLR
-
20-09-2019 - |
Pergunta
Isso tem sido algo que está me incomodando há um tempo. Como alguém analisa o seguinte texto no HTML abaixo usando o ANTLR? Não consigo entender isso.
Alguma ideia?
Markdown:
> first line > second line > > nested quote
saída html:
<blockquote>
<p>first line
second line</p>
<blockquote>
<p>nested quote</p>
</blockquote>
</blockquote>
Solução
Engraçado que você mencione isso porque eu estava enfrentando apenas esse problema na semana passada. Ver JMD, Markdown e uma breve visão geral da análise e compiladores. Estou trabalhando em um verdadeiro analisador de Markdown e tentei com Antlr.
Existem algumas maneiras de lidar com isso.
Em primeiro lugar, você pode simplesmente analisar:
BLOCK_QUOTE : '>' (' ' | '\t')? ;
E resolva isso na etapa de análise, possivelmente como uma regra de reescrita.
A coisa é que eles são importantes quando aparecem no início de uma linha, então aqui está outra abordagem:
@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(); }
O exposto acima pode precisar ser uma regra do analisador, e não uma regra lexical também. Eu esqueço.
Mas mesmo isso é insatisfatório, porque meio que obriga você a tratar a fonte de marcação como uma sequência de linhas, o que não é realmente o que você deseja em outras partes.
Normalmente, cada regra lexical também só pode resultar em um token, para que você precise substituir outra classe que me escape para permitir a emissão de vários tokens. Há um exemplo disso no (excelente e quase necessário) A referência definitiva de ANTLR: Construindo idiomas específicos de domínio.
Por fim, abandonei a Antlr como a ferramenta de escolha para isso. Esperamos que minha própria solução codificada à mão apareça na próxima semana ou duas.