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>
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top