Domanda

Sto contemplando l'idea di implementare un traduttore XML usando un generatore di compilatore, basato su W3C XML 1.1 Spec, che include una grammatica EBNF completa.

Più precisamente, ho intenzione di usare Qi-yacc Perché voglio imparare questo strumento. Sarà la mia prima incursione nell'uso di qualsiasi compilatore.

Il primo tipo di traduzione che ho intenzione di implementare è molto semplice: XML a S-exprs. Successivamente, ho intenzione di generalizzare il mio traduttore, ma questo non è il punto della mia domanda.

Prevedi una grave insidia per questo tipo di progetto? Ho letto che tradurre XML usando il suo EBNF è una cattiva idea. Mi chiedo perché. E non è come se la lingua Qi avesse già un parser XML, quindi sicuramente non sto cercando di reinventare la ruota qui.

È stato utile?

Soluzione

Ora non sono il motivo per cui il contesto è necessario per analizzare XML.

Ma QiyACC può utilizzare il contesto usando variabili globali. Sarebbe più pulito se potessi passare uno stato, s, nel parser, ad esempio o qualcosa del genere. Questo non è nel Qi ma ho intenzione di implementare una tale funzionalità per Shen.

Quindi potrebbe essere fatto.

/Stefan

Altri suggerimenti

Non so nulla di QiyACC, tuttavia tradurre un EBNF di XML in un parser ricorsivo (RD) è più o meno semplice. Bisogna solo tenere presente il fatto che ci sono luoghi in cui alcune piccole modifiche alla grammatica possono avere un grande impatto sulle prestazioni sul parser. Questo perché le grammatiche sono scritte con succintità e chiarezza in mente, piuttosto che cercare di evitare di inseguire le regole.

Ho fatto qualcosa di simile una volta in C ++ scrivendo la grammatica di XML come un insieme di tipi. Puoi vedere un articolo che ho scritto su Progetto di codice. Gli stessi principi di base possono essere applicati a qualsiasi lingua.

Ti suggerirei anche di guardarti intorno. Si estendono su EBNF permettendoti di introdurre asserzioni a larghezza zero e sono un ottimo modo per aumentare una grammatica EBNF per un parser.

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