Esto suena como un gran proyecto personal. Aprenderá mucho sobre cómo funcionan las partes básicas de un compilador. Me saltaría el intentar usar un generador de analizador sintáctico; si esto es para su propia edificación, aprenderá más haciendo todo desde cero.
La forma en que funcionan estos sistemas es una formalización de cómo entendemos los lenguajes naturales. Si le doy una oración: "El perro, Rover, se comió su comida", lo primero que debe hacer es dividirlo en palabras y signos de puntuación. "The", "SPACE", "dog", "COMMA", "SPACE", "Rover", ... Eso es "tokenizing" o "lexing".
Lo siguiente que debes hacer es analizar la secuencia del token para ver si la oración es gramatical. La gramática del inglés es extremadamente complicada, pero esta frase es bastante sencilla. SUJETO-APLICATIVO-VERBO-OBJETO. Esto es "analizar".
Una vez que sepa que la oración es gramatical, puede analizar la oración para extraerle significado. Por ejemplo, puede ver que hay tres partes de esta oración, el sujeto, el apositivo y el "su" en el objeto, que todos se refieren a la misma entidad, es decir, el perro. Puedes darte cuenta de que el perro es el que hace la comida, y la comida es lo que se come. Esta es la fase de análisis semántico.
Los compiladores tienen una cuarta fase que los humanos no tienen, es decir, generan un código que representa las acciones descritas en el lenguaje.
Entonces, haz todo eso. Comience definiendo cuáles son los tokens de su idioma, defina un Token de clase base y un grupo de clases derivadas para cada uno. (IdentifierToken, OrToken, AndToken, ImpliesToken, RightParenToken ...). Luego escribe un método que toma una cadena y devuelve un IEnumerable '. Esa es tu Lexer.
En segundo lugar, descubra cuál es la gramática de su idioma y escriba un analizador de descenso recursivo que descompone un IEnumerable en un árbol de sintaxis abstracta que representa entidades gramaticales en su idioma.
Luego escribe un analizador que mira ese árbol y calcula cosas, como "¿cuántas variables libres distintas tengo?"
Luego escriba un generador de código que escuche el código necesario para evaluar las tablas de verdad. Escupir IL parece exagerado, pero si querías ser realmente aficionado, podrías. Puede ser más fácil dejar que la biblioteca del árbol de expresiones lo haga por usted; puede transformar su árbol de análisis sintáctico en un árbol de expresiones, y luego convertir el árbol de expresiones en un delegado y evaluar al delegado.
¡Buena suerte!
Las expresiones regulares no funcionarán debido a números arbitrarios de paréntesis. Tendrá que usar algún tipo de analizador sintáctico. –
Creo que estos códigos fuente (http://mrieppel.net/prog/truthtable.html) son útiles. – yv4