Для моего собственного опыта обучения я хочу попробовать написать интерпретатор для простого языка программирования в C - главное, что мне кажется, это библиотека хеш-таблиц, но общий набор структур данных и вспомогательных функций будет Очень полезно. Что вы, ребята, порекомендуете?
Какие библиотеки были бы полезны для внедрения интерпретатора небольшого языка в C?
Ответ 1
libbasekit - автор Ио. Вы также можете использовать libcoroutine.
Ответ 2
Одна библиотека, которую я рекомендую, - это libgc, сборщик мусора для C.
Вы используете его, заменив вызовы на malloc
, realloc
, strdup
и т.д. с помощью своих библиотек libgc (например, GC_MALLOC
). Он работает путем сканирования стека, глобальных переменных и блоков, выделенных GC, и ищет числа, которые могут быть указателями. Верьте или нет, он действительно работает довольно хорошо (почти наравне с очень хорошим ptmalloc, который является значением по умолчанию (без мусора) malloc
в GNU/Linux), и многие программы используют его (в том числе Mono и GCJ). Недостатком, однако, является то, что он может плохо работать с другими библиотеками, которые вы, возможно, захотите использовать, и вам даже придется перекомпилировать некоторые из них вручную, чтобы заменить вызовы на malloc
на GC_MALLOC
.
Ответ 3
Честно говоря, я знаю, что некоторые люди меня ненавидят, но я рекомендую использовать С++. Вам не нужно перебивать кишку, чтобы узнать ее, чтобы начать свой проект. Просто используйте его, как C, но через час вы можете узнать, как использовать std:: map < > (ассоциативный контейнер), std::string для удобства обработки текстовых данных и std::vector < > для масштабируемого размера кучи массив. Если вы хотите потратить лишний час или два, научитесь вводить функции-члены в классы (не волнуйтесь о полиморфизме, виртуальных функциях и т.д.), И вы получите более организованную программу.
Ответ 4
Вам нужна не больше стандартной библиотеки для подходящего небольшого языка с простыми конструкциями. Наиболее сложной частью интерпретируемого языка является, вероятно, оценка выражения. Для этого, процедуры-вызова и построения-вложения вам нужно будет понять и реализовать структуры данных стека.
Код по ссылке выше - С++, но алгоритм описан четко, и вы можете легко его реализовать в C. Вновь существует несколько правильных аргументов для того, чтобы не использовать С++ IMO.
Ответ 5
Прежде чем погрузиться в какие библиотеки использовать, я предлагаю вам узнать о грамматиках и дизайне компилятора. Особенно синтаксический ввод для компиляторов и интерпретаторов аналогичен, то есть маркеры и синтаксический анализ. Процесс токенизации преобразует символы потока (ваш ввод) в поток токенов. Парсер берет этот поток токенов и сопоставляет его с вашей грамматикой.
Вы не указываете, на каком языке вы пишете переводчика. Но очень вероятно, что язык содержит рекурсию. В этом случае вам необходимо использовать так называемый синтаксический анализатор снизу вверх, который вы не можете написать вручную, но его нужно сгенерировать. Если вы попробуете написать такой синтаксический анализатор вручную, вы столкнетесь с беспорядочной ошибкой.
Если вы разрабатываете платформу posix, вы можете использовать lex и yacc. Эти инструменты немного старые, но очень мощные для создания парсеров. Лекс может генерировать код, который реализует процесс токенизации, и yacc может генерировать анализатор снизу вверх.
Мой ответ, вероятно, вызывает больше вопросов, чем ответов. Это потому, что поле компиляторов/переводчиков довольно сложно и не может быть просто объяснено в коротком ответе. Просто получите хорошую книгу о дизайне компилятора.