Написание компилятора

В основном мне нужно сделать компилятор для файлов bibtex, чтобы можно было запрашивать данную базу данных bibtex. Теперь я знаком с некоторыми аспектами теории, такими как автоматы, грамматики, анализ SLR, LR(1) и LALR. Тем не менее, я все еще нахожу все это теоретическим и абстрактным, поскольку я никогда не применял его. Было бы очень полезно, если бы кто-нибудь мог обрисовать в общих чертах шаги, необходимые для создания компилятора. Возможно, я буду использовать flex и bison/yacc, поэтому, если бы вы могли сообщить мне, как именно проходит процесс проектирования, какие файлы генерируются на каком этапе, каков результат на каждом этапе и в целом, как вещи связаны друг с другом, Я, вероятно, смогу получить более практическое представление о том, как все делается...

Спасибо!


person Achint    schedule 16.03.2011    source источник
comment
возможный дубликат анализа bibtex с помощью flex+bison: пересмотрено   -  person Brian Tompsett - 汤莱恩    schedule 28.02.2015


Ответы (2)


Вы уверены, что хотите скомпилировать базу данных bibtex в исполняемый файл? Если запросы — это единственное, что вам нужно, то имеет смысл перевести базу данных bibtex в реляционную и выполнить запрос с помощью SQL. Конечно, вам все равно придется сначала разобрать bibtex и сгенерировать из него код SQL, и некоторые назовут это "компиляцией", но это гораздо менее сложно, чем материал в уже упомянутой книге Dragon Book.

Синтаксис Bibtex чрезвычайно тривиален, поэтому вы можете выбрать любой подход к разбору. Я бы даже не стал использовать генераторы синтаксических анализаторов для такой тривиальной грамматики и вместо этого напишу парсер рекурсивного спуска. В зависимости от выбранного вами языка это может быть очень просто (например, если вы используете Haskell с Parsec или даже C#).

Если ваша дополнительная цель — изучить устаревшие инструменты вроде bison и flex, то, конечно, они тоже справятся, но это перебор.

Правка: лучшее практическое чтение по классическому подходу lex/yacc — это http://en.wikipedia.org/wiki/The_Unix_Programming_Environment

person SK-logic    schedule 17.03.2011
comment
Это учебное задание, поэтому мне придется следовать заданным спецификациям. Я, вероятно, буду использовать C дополнительно. - person Achint; 17.03.2011
comment
@Achint, значит ли это, что вам тоже придется реализовать язык запросов? Я отредактирую свой ответ. - person SK-logic; 17.03.2011
comment
Спецификации выглядят следующим образом: я должен разработать компилятор, который компилирует любой файл базы данных BIBTEX в программу C/C++/Java/Python/Lisp, которую впоследствии можно скомпилировать в исполняемый файл, а затем запустить, чтобы ответить на любой запрос о записи в файле базы данных BIBTEX. Также необходимо использовать flex и bison. Я могу скомпилировать базу данных в другую форму базы данных и использовать какой-то общий C/C++/Java/Python/Lisp для ее запроса, но я не могу запросить необработанную базу данных Bibtex с помощью кода. Я должен отправить файлы .l и .y и Makefile для их запуска в качестве вывода. - person Achint; 17.03.2011
comment
@Achint, тогда вам, по-видимому, также нужно разработать и реализовать какой-то язык запросов, встроив его в ваш скомпилированный код. Жаль, что у вас нет C# в списке возможных целей, иначе вы могли бы использовать его собственный LINQ. Но вы можете имитировать такое же поведение с помощью Lisp. Если ваша спецификация не заставляет вас использовать C и bison, вам лучше придерживаться Lisp и, скажем, cliki.net/cl-peg - person SK-logic; 17.03.2011
comment
Спецификации не навязывают C, но я думаю, что Bison просто необходим. :( Или, может быть, yacc, но я уверен, что один из них. Я немного не понимаю, как проходят точные этапы. Куда именно я должен встроить код для языка запросов? Из того, что я сейчас понимаю, Мне нужно будет написать лексический анализатор, используя flex/lex, который выдаст токены, и мне нужно будет сделать правильную грамматику в соответствии с синтаксисом BIBTEX и написать парсер, используя yacc/bison, который будет принимать токены. введите и скажите, принята ли строка или нет, и выведите синтаксическое дерево? - person Achint; 17.03.2011
comment
@Achint, верно, вам нужно написать лексер, связать его вывод с синтаксическим анализатором, сгенерированным бизоном, который либо построит абстрактное синтаксическое дерево (не нужно в таком тривиальном случае), либо немедленно напечатает проанализированные данные на статике вашего целевого языка. инициализаторы структуры. Сгенерированный код должен быть связан с написанной от руки программой, которая выполняет запросы к этим статическим структурам. Будет достаточно любого примера макета lex + yacc, см. книгу, которую я упомянул в своем ответе, для самого простого. - person SK-logic; 17.03.2011
comment
Я получил книгу, я начну читать ее. Спасибо за огромную помощь, но я уверен, что у меня будет около сотни вопросов по пути, так что я буду публиковать снова: P - person Achint; 17.03.2011

Я не эксперт по компиляторам, но знаю, что эта книга считается необходимой для чтения всем, кто хочет написать компилятор. Да, обложка устарела, но из того, что я читал, в ней все еще есть много хороших шаблонов, относящихся к компиляции кода:

https://rads.stackoverflow.com/amzn/click/com/0201100886

person Payson Welch    schedule 16.03.2011
comment
Да, я имел в виду эту книгу, но опять же, вся концепция кажется мне абстрактной, вероятно, потому, что я не видел результатов ни одного из шагов. - person Achint; 17.03.2011