Это звучит как отличный личный проект. Вы многое узнаете о том, как работают основные части компилятора. Я бы не пытался использовать генератор синтаксических анализаторов; если это для вашего собственного назидания, вы узнаете больше, делая все это с нуля.
То, как работают такие системы, — это формализация того, как мы понимаем естественные языки. Если я даю вам предложение: «Собака, Ровер, съел свою еду», первое, что вы делаете, это разбиваете его на слова и ставите знаки препинания. «The», «SPACE», «собака», «COMMA», «SPACE», «Rover», ... Это «токенизация» или «лексинг».
Следующее, что вы делаете, это анализируете поток токенов, чтобы увидеть, является ли предложение грамматическим. Грамматика английского языка чрезвычайно сложна, но это предложение довольно простое. ПОДЛЕЖАЩЕЕ-ПРИЛОЖИТЕЛЬНОЕ-ГЛАГОЛ-ОБЪЕКТ. Это "разбор".
Как только вы узнаете, что предложение является грамматическим, вы можете проанализировать предложение, чтобы на самом деле извлечь из него смысл. Например, вы можете видеть, что в этом предложении есть три части — подлежащее, прилагательное и «его» в дополнении — и все они относятся к одному и тому же объекту, а именно к собаке. Вы можете понять, что собака — это то, что ест, а еда — это то, что едят. Это этап семантического анализа.
Затем у компиляторов есть четвертая фаза, которой нет у людей: они генерируют код, представляющий действия, описанные в языке.
Итак, сделайте все это. Начните с определения токенов вашего языка, определите токен базового класса и набор производных классов для каждого. (IdentifierToken, OrToken, AndToken, ImpliesToken, RightParenToken...). Затем напишите метод, который принимает строку и возвращает IEnumerable. Это твой лексер.
Во-вторых, выясните, что такое грамматика вашего языка, и напишите синтаксический анализатор рекурсивного спуска, который разбивает IEnumerable на абстрактное синтаксическое дерево, представляющее грамматические сущности вашего языка.
Затем напишите анализатор, который просматривает это дерево и вычисляет такие вещи, как «сколько различных свободных переменных у меня есть?»
Затем напишите генератор кода, который выдает код, необходимый для оценки таблиц истинности. Плюнуть IL кажется излишним, но если вы хотите быть действительно крутым, вы можете это сделать. Может быть проще позволить библиотеке дерева выражений сделать это за вас; вы можете преобразовать дерево синтаксического анализа в дерево выражений, а затем превратить дерево выражений в делегат и оценить делегат.
Удачи!
person
Eric Lippert
schedule
05.07.2009