2013-07-29 24 views
6

Non ho uno sfondo di compilatori quindi non sono sicuro se questa è una cosa comune in quell'area. Esistono tecniche standard per analizzare espressioni come questa? (Say, scheda indica la profondità)Come analizzare questo tipo di espressioni?

And 
    A + B = 1 
    C + D = 1 
    Or 
     P + Q = 1 
     K = 1 
    And 
     Q = 1 
     R = 2 

Dovrebbe essere analizzato come:

((A+B=1) AND (C+D=1) AND ((P+Q=1) OR (K=1)) AND ((Q=1) AND (R=2))) 

Non sono sicuro se devo ricorrere ad una valutazione basata pila? Attualmente sto provando uno e posterò un codice funzionante se riesco a farlo funzionare.

Qualche suggerimento su un modo semplice per raggiungere questo obiettivo?

+0

Qual è il contesto? Deve essere "sicuro"? O potresti cambiare leggermente la sintassi e usare Python con 'eval()' o simili? Ad esempio, '((A + B == 1) e (C + D == 1))' è la sintassi di Python. –

+0

Sfortunatamente, non posso modificare l'input. Sto analizzando alcuni file XML e sono riuscito a analizzare le espressioni stesse in una stringa. Il modo in cui formatto la stringa è fino a me, ma l'ordine di valutazione e tutto ha ancora bisogno di cure.Inoltre, non voglio valutare nulla ma voglio dire, ottenere una stringa per la stampa. – Legend

+0

stai analizzando l'espressione negli alberi? Quindi valutarli sommando i numeri per quelle variabili? – Adrian

risposta

3

si Supponendo che chiedono su come analizzare le espressioni costruite di operatori con diversi precedenze e associativities - assolutamente.

Un approccio efficace è chiamato "top-down precedenza degli operatori", e forse anche "precedenza degli operatori", e l'analisi "precedenza arrampicata". Qui ci sono alcune fonti belle che spiegano l'approccio in dettaglio:

La cosa veramente interessante è il modo in po 'di codice in realtà prende.

I concetti chiave sono:

  • prefisso vs infisso vs mixfix

  • precedenza: è 3 + 4 * 5 analizzato come (3 + 4) * 5 o 3 + (4 * 5)?

  • associatività: è x - y - z analizzato come x - (y - z) o (x - y) - z?

Casualmente, ho appena imparato questa roba da poco e finito per scrivere un un articolo sul mio blog su un approccio simile per operatore analisi, che potete trovare here. Nel mio approccio, mi occupo di operatori infissi, prefissi, postfix e mixfix (ad esempio ? :); le precedenze e le associatività sono tutte specificate nelle tabelle; Io uso uno stack per tenere traccia degli operatori i cui operandi non sono ancora stati trovati. Il parser quindi crea un albero di analisi, in cui ogni nodo è una sottoespressione.

+0

+1 Grazie per i link. – Legend