Я изучаю язык и компилятор для него как летний проект, и мне трудно найти информацию о том, как использовать дерево синтаксического анализа или BNF/EBNF для программа компилятора. Общая цель заключалась бы в написании компилятора, который будет анализировать упрощенный синтаксис функционального языка в c. В настоящее время я планирую написать этот компилятор на языке c, но я бы не прочь сделать это во что-то еще, если кто-то считает, что это будет лучшая идея. (Я хочу сделать это вручную, но без использования таких инструментов, как LEX)
Например, если бы я хотел создать язык ADD
и определил его синтаксис как (+ 3 4)
, для него легко создать EBNF:Как создать компилятор функционального языка
Program -> {Function}
Function -> Operator Integer Integer
Operator -> +
Integer -> Digit {Digit}
Digit -> 0|1|2|3|4|5|6|7|8|9
и это даже проще сделать дерево разбора:
Function
|
-------------------
| | |
Operator Integer Integer
Но как бы вы:
- Представляют EBNF или дерево разбора в C
- Используйте эти данные, чтобы получить код действителен Ĉ
Я чувствую, что если бы я мог видеть очень простой рабочий пример, было бы достаточно, чтобы я начал в правильном направлении , У меня такое чувство, что многие из вас будут рекомендовать, чтобы я прочитал Dragon Book
(кажется, это стандартный ресурс для компиляторов), поэтому я хочу сообщить вам, что он уже заказан и отправлен.
Благодарим вас за любой свет, который вы можете пролить на это!
-vikingsheepman
Вы поняли это правильно. C - далеко не идеальный язык для представления деревьев и выполнения преобразований деревьев. Я бы рекомендовал рассмотреть возможность использования любого языка с поддержкой алгебраических типов данных и сопоставления шаблонов. Что касается реализации функциональных языков в частности: http://research.microsoft.com/en-us/um/people/simonpj/Papers/pj-lester-book/ –
Я рекомендую искать «рекурсивный парсер спуска», который обрабатывает LL (1) грамматики (этого было достаточно для большинства языков, но, например, текущие C++ или C# немного сложнее). Существует пример реализации в C, показанный на http://en.wikipedia.org/wiki/Recursive_descent_parser По сравнению с другими типами (обычно генерируемыми) синтаксическими анализаторами этот код на самом деле вполне читается из исходного кода. –
@jJ Этот фрагмент кода был именно тем, что я искал! Благодаря! – vikingsheepman