Question

Cela a été quelque chose qui me tracasse depuis un certain temps. Comment fait-on analyse le texte suivant dans le code HTML ci-dessous en utilisant ANTLR? Je ne peux pas sembler envelopper la tête autour du tout.

Des idées?

Markdown:

> first line
> second line
> > nested quote

Sortie HTML:

<blockquote>
  <p>first line
  second line</p>
  <blockquote>
    <p>nested quote</p>
  </blockquote>
</blockquote>
Était-ce utile?

La solution

drôle que vous dites que parce que j'abordait ce problème juste la semaine dernière. Voir JMD, Markdown et un bref aperçu de Parsing et compilateurs. Je travaille sur un véritable analyseur de Markdown et je l'ai essayé avec ANTLR.

Il y a deux façons dont vous pouvez traiter cette question.

Tout d'abord vous pouvez simplement analyser:

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

et travaillez dans l'étape d'analyse syntaxique, peut-être en règle de réécriture.

La chose est ceux-ci sont importantes que lorsqu'elles apparaissent au début d'une ligne est une autre approche donc ici:

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

Ce qui précède peut être nécessaire de règle d'analyseur plutôt que d'une règle lexicale aussi. J'oublie.

Mais même cela est peu satisfaisant parce qu'il sorte de vous oblige à traiter la source de Markdown comme une séquence de lignes, ce qui est pas vraiment ce que vous voulez dans d'autres parties.

En outre normalement chaque règle lexicale ne peut donner lieu à un jeton, donc vous devez remplacer une autre classe qui me échappe pour permettre pour émettre plusieurs jetons. Il y a un exemple dans le (excellent et presque nécessaire) Le ANTLR définitif référence:. Langues de construction spécifiques au domaine

En fin de compte j'abandonnais ANTLR comme l'outil de choix pour cela. Ma propre solution à code à la main devrait, espérons une apparition dans la semaine ou deux suivant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top