Какие библиотеки будут полезны для реализации небольшого интерпретатора языка в C? - PullRequest
10 голосов
/ 17 декабря 2010

Для моего собственного опыта обучения я хочу попробовать написать интерпретатор для простого языка программирования на C - главное, что мне нужно, - это библиотека хеш-таблиц, но общий набор структур данных и вспомогательных функций будеточень полезноЧто бы вы порекомендовали, ребята?

Ответы [ 5 ]

6 голосов
/ 17 декабря 2010

libbasekit - автором Io. Вы также можете использовать libcoroutine.

3 голосов
/ 17 декабря 2010

Честно говоря - и я знаю, что некоторые люди будут ненавидеть меня за это - но я рекомендую вам использовать C ++. Вам не нужно разбираться в интуиции, чтобы узнать это, просто чтобы иметь возможность начать свой проект. Просто используйте его как C, но через час вы можете узнать, как использовать std :: map <> (ассоциативный контейнер), std :: string для легкой обработки текстовых данных и std :: vector <> для изменяемой кучи. выделенный массив. Если вы хотите потратить дополнительный час или два, научитесь помещать функции-члены в классы (не беспокойтесь о полиморфизме, виртуальных функциях и т. Д.), И вы получите более организованную программу.

3 голосов
/ 17 декабря 2010

Одна библиотека, которую я рекомендую изучить, это libgc , сборщик мусора для C .

Вы используете его, заменяя вызовы на malloc, realloc, strdup и т. Д. С их аналогами libgc (например, GC_MALLOC).Он работает путем сканирования стека, глобальных переменных и блоков, выделенных GC, в поисках чисел, которые могут быть указателями.Хотите верьте, хотите нет, но на самом деле он работает довольно хорошо (почти наравне с очень хорошо ptmalloc , который является стандартной (не собранной) реализацией malloc в GNU / Linux), и многие программы используют его (в том числе Mono и GCJ ).Однако недостатком является то, что он может плохо работать с другими библиотеками, которые вы, возможно, захотите использовать, и вам, возможно, даже придется перекомпилировать некоторые из них вручную, чтобы заменить вызовы на malloc на GC_MALLOC.

0 голосов
/ 17 декабря 2010

Прежде чем углубляться в какие библиотеки использовать, я предлагаю вам ознакомиться с грамматикой и дизайном компилятора. Особенно входной синтаксический анализ предназначен для компиляторов и похожих интерпретаторов, то есть для токенизации и синтаксического анализа. Процесс токенизации преобразует поток символов (ваш ввод) в поток токенов. Парсер берет этот поток токенов и сопоставляет его с вашей грамматикой.

Вы не упоминаете, для какого языка вы пишете переводчик. Но очень вероятно, что язык содержит рекурсию. В этом случае вам нужно использовать так называемый анализатор снизу вверх, который вы не можете написать вручную, но его необходимо сгенерировать. Если вы попытаетесь написать такой синтаксический анализатор вручную, в результате вы получите беспорядочную ошибку.

Если вы разрабатываете для платформы posix, вы можете использовать lex и yacc. Эти инструменты немного старые, но очень мощные для создания парсеров. Lex может генерировать код, который реализует процесс токенизации, а yacc может генерировать анализатор снизу вверх.

Мой ответ, вероятно, вызывает больше вопросов, чем ответов. Это потому, что область компиляторов / интерпретаторов довольно сложна и не может быть просто объяснена в коротком ответе. Просто получите хорошую книгу по дизайну компилятора.

0 голосов
/ 17 декабря 2010

Вам нужно не больше, чем стандартная библиотека для достаточно маленького языка с простыми конструкциями. Самая сложная часть интерпретируемого языка - это, вероятно, оценка выражений . И для этого, и для вызова процедур, и для вложения конструкций вам необходимо понимать и реализовывать структуры данных стека.

Код по приведенной выше ссылке - C ++, но алгоритм описан четко, и вы могли бы легко реализовать его в C. Там снова есть несколько веских аргументов для отказа от использования C ++ IMO.

...