2010-04-01 11 views
10

Voglio valutare un'espressione in C++. Per valutarlo, voglio che l'espressione sia convertita in formato prefisso.C++ infisso alla conversione prefisso per condizioni logiche

Ecco un esempio

wstring expression = "Feature1 And Feature2"; 

Qui ci sono i modi possibili.

expression = "Feature1 And (Feature2 Or Feature3)"; 

expression = "Not Feature1 Or Feature3"; 

Qui E, O, parole e parentesi ("(", )) Non sono riservati sono utilizzati per la portata

Non ha precedenza maggiore

E è s et prossimo la precedenza su Non

O è impostato per la prossima prevalere E

SPAZIO BIANCO utilizzato per delimitatore. Espressione ha non altri elementi come TAB, NEWLINE

ho Non hanno bisogno aritmetiche espressioni. Posso fare la valutazione ma qualcuno può aiutarmi a convertire le stringhe in notazione prefisso?

+0

Per convenzione TAB e NEWLINE sono tipi di spazi. Intendevi davvero il carattere dello SPAZIO? Per favore chiarisci la tua domanda con quella informazione. –

+0

La conversione di infisso in prefisso è un compito ben fatto, ma inutile nel mondo reale.Opzioni: (A) Parse infix e go (B) Parse infix, traduci in prefisso, produce prefisso, prefisso parse, vai. Anche se il prefisso di analisi è più semplice, il processo _conversion_ è più lento. –

risposta

-1

Utilizzare un generatore di parser come la coppia Lex/Yacc.

+0

Ho più paura del parser Lex/Yacc. Sapevo che esistono ma non so come usarli in modo efficiente. –

3

È necessario costruire la grammatica in primo piano. Quindi, perché esegui tutto il parsing a mano. Utilizzare invece una libreria del parser builder come Boost-Spirit. O lex/yacc o flex/bisonte.

Quindi utilizzare lo AST generato dal parser builder per inviare i dati nel modo che riterrà opportuno. Come ad esempio prefisso o suffisso, ecc.

1

Immagino che la tua intenzione sia di valutare la condizione. quindi non hai bisogno di un parser completo a tutti gli effetti.

Prima di tutto non è necessario lavorare con le stringhe qui. 1. Convertire "Caratteristica 1" per dire un ID (Un numero intero che rappresenta una caratteristica)

Quindi, la dichiarazione "Feature1 And (Feature2 Or Feature3)"; dire (1 & (2 | 3) Da qui in poi ... è possibile utilizzare lo standard Infix come prefisso di conversione e valutare notazione del prefisso.

Ecco l'algoritmo per convertire infissa al prefisso http://www.c4swimmers.esmartguy.com/in2pre.htm http://www.programmersheaven.com/2/Art_Expressions_p1

+1

per valutare una condizione, è necessario analizzare il testo ... quindi è necessario un parser di qualche tipo ... Inoltre la conversione da infisso a prefisso richiede l'analisi in quanto è necessario conoscere le regole di associatività e la precedenza degli operatori per eseguire correttamente ... –

+1

Suppongo di non aver bisogno di analizzare. Ho detto che non abbiamo bisogno di un parser completo come lex/yacc. fare un infisso al prefisso di conversione usando questo è uno scherzo. non abbiamo bisogno di costruire AST in questo caso. – SysAdmin