Oppure

Loading
10/01/11 23:36
Diablo_91
Ciao a tutti, sono nuovo e ... chiedo scusa, ma vi chiedo gentilmente di aiutarmi con il mio problema.
Vorrei creare un programma in C che permetta di applicare la proprietà distriburiva a formule logiche. Vi do un esempio:
(!A | (B & C)
applicando la proprietà distributiva deve diventare così:
(!A | B) & (!A & C)

Naturalmente questo è solo un piccolo esempio molto limitato, ma ho bisogno di poterlo applicare a formule anche più grandi.

Avevo pensato a qualche idea sull'usare delle variabili per gli operatori, ma sinceramente non saprei se vada bene.

Spero in un vostro aiuto; grazie in anticipo.
aaa
11/01/11 16:52
Il Totem
In pratica vuoi implementare un parser di espressioni logiche in C? E' un po' laborioso per il fine, ma si può fare, anche senza regex. Tuttavia spiegare qui come scrivere un parser mi sembra un po' restrittivo. Iniziamo col vedere quali sono le tue idee in merito.
aaa
11/01/11 21:08
Diablo_91
Devo dire che sinceramente non conosco ne la regex, ne so cosa vuol dire "parser di espressioni logiche"; comunque io pensavo ad idee del tipo:
1)carico la formula in forma normale disgiuntiva in un array di carratteri
2)se nell'array c'è quel tipo di formula allora la trasformo in forma normale congiuntiva (ma sinceramente non so se è possibile una cosa di questo genere)

oppure un altra idea, avevo pensato di usare delle variabili per gli operatori &(and) e |(or), e dire: se nell'array ci sono quelle variabili allora fai la trasformazione.
Il punto e che non come fare a chiedere se nell'array sono presenti quei caratteri, infatti non so se è possibile.
aaa
12/01/11 11:12
TheKaneB
Il problema non è di quelli banali.
La tecnica standard è quella di creare un albero sintattico dell'espressione data in input (implementando un semplice parser), attraversare l'albero applicando delle trasformazioni basate sulle regole che ti interessano, e poi stampare la "produzione" del nuovo albero.

Ripeto che non è una cosa banale e quindi ti invito, se non l'hai già fatto, a studiare qualcosa di introduttivo sui parser, sugli alberi e magari consolidare un po' le tue conoscenze di C visto che dovrai gestire in scioltezza puntatori doppi e allocazione dinamica della memoria.
aaa