Это звучит как отличный личный проект. Вы узнаете многое о том, как работают основные части компилятора. Я пропустил бы попытку использования генератора парсера; если это для вашего собственного назидания, вы узнаете больше, делая все это с нуля.
Способ работы таких систем - это формализация того, как мы понимаем естественные языки. Если я дам вам предложение: «Собака, Ровер, съел свою еду». Первое, что вы делаете, это разбить ее на слова и знаки препинания. «The», «SPACE», «dog», «COMMA», «SPACE», «Rover», ... Это «токенизация» или «лексирование».
Следующее, что вы делаете, - это анализ потока токенов, чтобы узнать, является ли предложение грамматическим. Грамматика английского языка чрезвычайно сложна, но это предложение довольно просто. ПРЕДМЕТ-аппозитивный-VERB-ОБЪЕКТ. Это «разбор».
Как только вы знаете, что предложение является грамматическим, вы можете проанализировать предложение, чтобы получить из него смысл. Например, вы можете видеть, что есть три части этого предложения - субъект, аспект и «его» в объекте - все они относятся к одной и той же сущности, а именно к собаке. Вы можете понять, что собака - это то, что едят, а еда - это то, что есть. Это этап семантического анализа.
У компиляторов тогда есть четвертый этап, который люди не делают, то есть они генерируют код, который представляет действия, описанные на этом языке.
Итак, сделайте все это. Начните с определения того, что означает токены вашего языка, определите базовый класс Token и кучу производных классов для каждого. (IdentifierToken, OrToken, AndToken, ImpliesToken, RightParenToken ...). Затем напишите метод, который берет строку и возвращает IEnumerable '. Это ваш лексер.
Во-вторых, выясните, что такое грамматика вашего языка, и напишите рекурсивный парсер спуска, который разбивает IEnumerable на абстрактное синтаксическое дерево, которое представляет собой грамматические объекты на вашем языке.
Затем напишите анализатор, который смотрит на это дерево и цифры, например «сколько у меня свободных переменных?»
Затем напишите генератор кода, который выплескивает код, необходимый для оценки таблиц истинности. Spitting IL кажется излишним, но если вы хотите быть действительно баффом, вы могли бы. Возможно, было бы проще позволить библиотеке дерева выражений сделать это для вас; вы можете преобразовать дерево разбора в дерево выражений, а затем превратить дерево выражений в делегат и оценить делегат.
Удачи вам!
Регулярные выражения не будут работать из-за произвольного числа круглых скобок. Вам нужно будет использовать какой-то генератор парсера. –
Я думаю, что эти исходные коды (http://mrieppel.net/prog/truthtable.html) полезны. – yv4