Pregunta

Esto ha sido algo que me ha estado molestando por un tiempo. ¿Cómo hace uno para analizar el texto siguiente en el HTML usando antlr? Parece que no puedo envolver mi cabeza alrededor de esto en absoluto.

¿Ideas?

Markdown:

> first line
> second line
> > nested quote

HTML de salida:

<blockquote>
  <p>first line
  second line</p>
  <blockquote>
    <p>nested quote</p>
  </blockquote>
</blockquote>
¿Fue útil?

Solución

Es curioso que se menciona que debido a que está abordando este problema solo la semana pasada. Ver JMD, de rebajas y una breve descripción de análisis y Los compiladores . Estoy trabajando en un verdadero analizador de rebajas y he probado con antlr.

Hay un par de maneras en que puede lidiar con esto.

En primer lugar usted podría analizar:

BLOCK_QUOTE : '>' (' ' | '\t')? ;

y el trabajo a cabo en la etapa de análisis, posiblemente como una regla de reescritura.

La cosa es que éstos sólo son importantes cuando aparecen al principio de una línea así que aquí está otro enfoque:

@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(); }

Lo anterior puede ser necesario hacer una regla de analizador en lugar de una regla léxica también. Me olvido.

Pero incluso esto es poco satisfactoria, ya que tipo de te obliga a tratar a la fuente de rebajas como una secuencia de líneas, que no es realmente lo que quiere en otras partes.

Además, normalmente cada regla léxica sólo puede resultar en una ficha de lo que tiene que sobrescribir otra clase que se me escapa para permitir la emisión de varias fichas. Hay un ejemplo de esto en la (excelente y casi required) El antlr Definitive referencia:. Idiomas Edificio de dominio-específicas

En última instancia abandoné antlr como la herramienta de elección para este. Mi propia solución codificado a mano con suerte debería aparecer en la próxima semana o dos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top