Scrivere un parser su un AST basato su XML: lo sto facendo bene?

2

Ho una sorta di AST definito in XML che sto cercando di analizzare e valutare. L'albero XML contiene i token e tutte le informazioni di cui ho bisogno. Tuttavia, trovo difficile farlo "correttamente". Ecco cosa ho:

    <node type="operation">
        <value name="OP">AND</value>
        <value name="A">
            <node type="comparison">
                <value name="OP">EQ</value>
                <value name="A">1</value>
                <value name="B">1</value>
            </node>
        </value>
        <value name="B">
            <node type="comparison">
                <value name="OP">EQ</value>
                <value name="A">2</value>
                <value name="B">2</value>
            </node>
        </value>
    </node>

    def getNode() {
        switch (xmlNode[type]) {
            case 'operation':
                new OperationNode(xmlNode[value.OP], getNode(xmlNode[value.A]), getNode(xmlNode[value.B]))

            case 'comparison':
                new ComparisonNode(xmlNode[value.OP], xmlNode[value.A], xmlNode[value.B])
        } 
    }

    nodes = getNode(xmlTree)
    nodes.evaluate()

Questo è uno pseudo-codice, ma puoi farti un'idea di quello che sto facendo. Fondamentalmente, passo in modo ricorsivo in ogni elemento del nodo dell'XML, scopri cosa è basato sul mio switch-case e poi creo l'oggetto corretto nel mio dominio, così posso valutare tutti i nodi in un secondo momento.

Ma ho alcune domande:

  1. Come posso liberarmi dell'interruttore? Sembra molto sporco per me, ma non riesco a pensare ad una soluzione migliore
  2. Come posso valutare tutti i nodi con eleganza? In questo momento, tutti i nodi ereditano da una classe base Node , che ha un metodo eval() , che per polimorfismo, ho terminato con tutti i diversi comportamenti tra condizioni e operazioni.
  3. Esiste un modo più efficiente di attraversare questo XML?
posta vinnylinux 23.04.2015 - 17:14
fonte

1 risposta

2

A seconda del linguaggio di implementazione, potrebbero esserci mapping dinamici o generatori di codice per mappare XML al grafico degli oggetti.

Se non vuoi seguire questa strada, ti suggerirei di utilizzare un parser basato su eventi piuttosto che creare il documento XML, quindi creare il tuo AST dagli eventi usando invece la discesa ricorsiva. Quindi, quando vedi l'inizio dell'elemento value chiami una funzione che restituisce un ValueNode e lascia che lo stack delle chiamate gestisca lo stack. (questo presuppone che lo stack di chiamate sia sufficientemente grande per la tua espressione nidificata più profonda, il che è probabilmente vero nella pratica, ma apre una modalità di errore se qualcuno vuole creare un documento XML sgradevole).

Se si va giù per il percorso di analisi codificato a mano, non si eviterà di attivare il nome del tag dell'elemento. Potresti nasconderla usando una mappa del nome del tag per funzionare, ma se il tuo linguaggio di implementazione supporta l'attivazione delle stringhe, è improbabile che questo migliori la leggibilità.

    
risposta data 24.04.2015 - 11:47
fonte

Leggi altre domande sui tag