Questo suona come un grande progetto personale. Imparerai molto su come funzionano le parti di base di un compilatore. Vorrei saltare cercando di usare un generatore di parser; se questo è per la tua edificazione, imparerai di più facendo tutto da zero.
Il modo in cui tali sistemi funzionano è una formalizzazione di come intendiamo i linguaggi naturali. Se ti do una frase: "Il cane, Rover, mangiò il suo cibo". La prima cosa che fai è scomporla in parole e punteggiatura. "Il", "SPAZIO", "cane", "COMMA", "SPAZIO", "Rover", ... Questo è "tokenizing" o "lexing".
La prossima cosa da fare è analizzare il flusso di token per vedere se la frase è grammaticale. La grammatica dell'inglese è estremamente complicata, ma questa frase è piuttosto semplice. OGGETTO appositiva-VERB-OGGETTO. Questo è "parsing".
Una volta che la frase è grammaticale, è possibile analizzare la frase per ricavarne effettivamente il significato. Ad esempio, puoi vedere che ci sono tre parti di questa frase - il soggetto, l'appositivo e il "suo" nell'oggetto - che si riferiscono tutte alla stessa entità, cioè il cane. Puoi capire che il cane è la cosa che fa mangiare e il cibo è la cosa che viene mangiata. Questa è la fase di analisi semantica.
I compilatori hanno quindi una quarta fase che gli umani non fanno, ovvero generano codice che rappresenta le azioni descritte nella lingua.
Quindi, fare tutto questo. Inizia definendo quali sono i token della tua lingua, definisci un token di classe base e un gruppo di classi derivate per ognuno. (IdentifierToken, OrToken, AndToken, ImpliesToken, RightParenToken ...). Quindi scrivi un metodo che accetta una stringa e restituisce un oggetto IEnumerable '. Questo è il tuo lexer.
In secondo luogo, capire qual è la grammatica della propria lingua e scrivere un parser di discesa ricorsivo che suddivida un oggetto IEnumerable in un albero di sintassi astratto che rappresenta le entità grammaticali nella propria lingua.
Quindi scrivere un analizzatore che guarda quell'albero e le figure fuori, come "quante variabili libere distinte ho?"
Quindi scrivere un generatore di codice che sputa il codice necessario per valutare le tabelle di verità. Sputare IL sembra eccessivo, ma se volessi essere davvero appassionato, potresti farlo. Potrebbe essere più semplice lasciare che la libreria dell'albero delle espressioni lo faccia per te; è possibile trasformare il proprio albero di analisi in un albero di espressioni, quindi trasformare l'albero delle espressioni in delegato e valutare il delegato.
Buona fortuna!
Le espressioni regolari non funzionano a causa di numeri arbitrari di parentesi. Avrai bisogno di usare una sorta di generatore di parser. –
Penso che questi codici sorgente (http://mrieppel.net/prog/truthtable.html) siano utili. – yv4