Frage

Das hat mich schon eine Weile gestört. Wie kann man den folgenden Text unter Verwendung von Antlr in die HTML analysieren? Ich kann den Kopf überhaupt nicht umwickeln.

Irgendwelche Ideen?

Markdown:

> first line
> second line
> > nested quote

Ausgabe HTML:

<blockquote>
  <p>first line
  second line</p>
  <blockquote>
    <p>nested quote</p>
  </blockquote>
</blockquote>
War es hilfreich?

Lösung

Komisch, dass Sie das erwähnen, weil ich letzte Woche nur dieses Problem angegriffen habe. Sehen JMD, Markdown und ein kurzer Überblick über Parsen und Compiler. Ich arbeite an einem echten Markdown -Parser und habe es mit Antlr ausprobiert.

Es gibt ein paar Möglichkeiten, wie Sie damit umgehen können.

Zunächst konnte man einfach analysieren:

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

und arbeiten Sie es im Parsing -Schritt aus, möglicherweise als Umschreiben.

Dies ist nur wichtig, wenn sie am Anfang einer Zeile erscheinen. Hier ist ein weiterer Ansatz:

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

Die oben genannten müssen möglicherweise eher eine Parser -Regel als eine lexikalische Regel sein. Ich vergesse.

Aber selbst das ist unbefriedigend, weil es Sie so gut zwingt, die Markdown -Quelle als eine Abfolge von Linien zu behandeln, was nicht wirklich das ist, was Sie in anderen Teilen wollen.

Normalerweise kann jede lexikalische Regel nur zu einem Token führen, sodass Sie eine andere Klasse überschreiben müssen, die mir entkommt, um mehrere Token auszugeben. Es gibt ein Beispiel dafür in der (ausgezeichnet und fast erforderlich) Die endgültige ANTLR-Referenz: Aufbau domänenspezifischer Sprachen.

Letztendlich habe ich Antlr als das Werkzeug der Wahl dafür aufgegeben. Meine eigene handcodierte Lösung sollte hoffentlich in den nächsten ein oder zwei Wochen erscheinen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top