Абстрактно-синтаксическое дерево для подмножества C - PullRequest
4 голосов
/ 24 мая 2011

В целях обучения мы создаем пошаговый интерпретатор javascript для (подмножества) кода C.

В основном мы имеем: int, float ..., массивы, функции для for, while ..Нет указателей.Интерпретатор javascript готов и позволяет нам объяснить, как вычисляется логическое выражение, покажет стек переменных ...

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

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

Знаете ли вы хороший C-парсер, который мог бы генерировать такое дерево?Не нужно быть в javascript (но это было бы идеально), любой язык в порядке, так как это можно сделать в автономном режиме.

Я смотрел на Emscripten (https://github.com/kripken/emscripten), но это больше C=> Javascript компилятор, и это не то, что мы хотим.

Ответы [ 2 ]

3 голосов
/ 24 мая 2011

Я недавно использовал Eli Bendersky pycparser , чтобы связываться с AST кода C. Я думаю, что это будет хорошо для ваших целей.

0 голосов
/ 06 июня 2011

Я думаю, что ANTLR имеет полный синтаксический анализатор C.

Я подозреваю, что вам потребуется полная поддержка таблиц символов;Вы должны знать, что означают символы .Здесь большинство "парсеров" подведут вас;они не создают полную таблицу символов.Я думаю, что ANTLR этого не делает, но я могу ошибаться.

Наш инструментарий реинжиниринга программного обеспечения DMS с его C Front End предоставляет полный C arser и создает полный символстолы.(Вам может не понадобиться это для вашего приложения, но он также включает в себя полный препроцессор C).Он также обеспечивает поток управления, поток данных, анализ точек и построение графа вызовов, и все это может быть полезно при переводе C в любую целевую виртуальную машину.

...