Domanda

Questo è stato qualcosa che mi tormenta da un po '. Come si fa a l'analisi del testo riportato di seguito nel codice HTML di seguito utilizzando ANTLR? Non riesco ad avvolgere la mia testa intorno a questo a tutti.

Tutte le idee?

Markdown:

> first line
> second line
> > nested quote

output HTML:

<blockquote>
  <p>first line
  second line</p>
  <blockquote>
    <p>nested quote</p>
  </blockquote>
</blockquote>
È stato utile?

Soluzione

divertente che si parla che perché stavo affrontare proprio questo problema la settimana scorsa. Vedere JMD, Markdown e una breve panoramica di analisi e I compilatori . Sto lavorando a un vero e proprio parser Markdown e ho provato con ANTLR.

Ci sono un paio di modi per affrontare questo.

In primo luogo si può solo analizzare:

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

e lavorare fuori nella fase di analisi, forse come una regola di riscrittura.

Il fatto è che questi sono importanti solo quando appaiono all'inizio di una riga: ecco un altro approccio:

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

È possibile che questo può avere bisogno di essere una regola parser piuttosto che una regola lessicale troppo. Ho dimenticato.

Ma anche questo è insoddisfacente perché sorta di ti costringe a trattare la fonte Markdown come una sequenza di linee, che non è davvero quello che si vuole in altre parti.

Anche normalmente ogni regola lessicale può risultare solo in un gettone in modo da avere sovrascrivere un'altra classe che mi sfugge per consentire per l'emissione di più token. V'è un esempio di questo nella (eccellente e quasi necessario) The Definitive ANTLR Riferimento:. Lingue costruzione domain-specific

In definitiva ho abbandonato ANTLR come lo strumento di scelta per questo. La mia soluzione di codifica manuale spera, dovrebbe essere visualizzato nella prossima settimana o due.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top