Преобразование "c-like language" в "custom language" с помощью парсера
У меня есть коллекция файлов, написанных на языке "A", которые необходимо перевести в соответствующие файлы на языке "B". Я хочу создать программу / парсер, которая может автоматизировать эту задачу (вероятно, скорее набор инструментов, чем отдельная программа). Однако я изо всех сил пытаюсь найти подходящий выбор для программ моего набора инструментов.
Язык A - это встроенный программный код, то есть язык низкого уровня. Это на 90% стандартный C-код и 10% "пользовательский" код, то есть файлы также содержат небольшие сегменты, которые не могут быть поняты стандартным C-компилятором. 90-процентный C-код не является какой-либо случайной C-конструкцией, которая возможна в C (это было бы трудно проанализировать в отношении семантики), но следует определенным повторяющимся выражениям, действиям и шаблонам. И это всегда следует за этими образцами (более или менее) одинаково. Он в основном выполняет операции записи в память и не включает в себя сложные структуры, такие как C-struct или enum и т. Д.
Пример обычного низкоуровневого C-кода на языке A:
#define MYMACRO 0x123
uint32_t regAddr;
regAddr = MYMACRO;
*(uint32_t*)(regAddr) = 0xdeadbeef;
Пример для "пользовательского кода" на языке A:
custom_printf("hello world! Cpu number: %d \n", cpu_nr);
Язык B - это 100% пользовательский язык. Это преобразование необходимо для работы с файлом в другом инструменте в целях отладки. Перевод приведенного выше примера будет выглядеть примерно так:
definemacro MYMACRO 0x123
define_local_int regAddr
localint.set regAddr = MYMACRO
data.write regAddr 0xdeadbeef
Примечание. Мне хорошо известно, что Stackru не предназначен для того, чтобы быть местом для открытых дискуссий о том, "какой инструмент вы предпочитаете?". Но я думаю, что этот вопрос скорее похож на "Мне нужен по крайней мере ОДИН значимый набор инструментов, который выполняет свою работу", то есть, вероятно, в любом случае разумных вариантов для обсуждения не так много.
Это были мои соображения и подходы до сих пор:
- Производительность не имеет отношения к моей цепочке инструментов. Это должно быть легко реализовано и адаптировано к изменениям.
- Первый подход. Поскольку язык А в основном представляет собой C-код, я сначала подумал о Python- модуле Pycparser, который предоставляет C-анализатор, который анализирует C-код в AST (абстрактное синтаксическое дерево). Мой план состоял в том, чтобы прочитать файлы языка A, а затем написать программу на Python, которая создает файлы языка B из AST. Однако мне было трудно адаптировать / обучить плагин pycparser для полной поддержки 10% пользовательских свойств языка A.
- Второй подход: использование генераторов парсеров общего назначения, таких как Yacc/Bison или ANTLR. Здесь, однако, я не уверен, какой из инструментов удовлетворяет моим потребностям (Yacc/Bison с анализатором LALR или ANTLR с анализатором LL) и как настроить соответствующий набор инструментов, который включает в себя такой анализатор и затем обрабатывает (например, с Python) данные структура, которую создает сгенерированный синтаксический анализатор для создания пользовательского языка B. Было бы также полезно, если бы выбранный генератор синтаксического анализатора предоставил существующее определение языка C, которое можно легко адаптировать для 10% пользовательской части языка C. Я должен также упомянуть, что я никогда раньше не работал с парсерами общего назначения.
Может ли кто-нибудь дать мне несколько советов о значительном наборе инструментов для этой задачи?
Редактировать: я прошу прощения, если это кажется расплывчатым вопросом, я пытался поставить его так точно, как мог. Я добавил пример для языков A и B, чтобы сделать состав языков более понятным, и чтобы показать, что язык A следует определенным повторяющимся шаблонам, которые легко понять в отношении семантики.
Если это редактирование не улучшит ясность и широту, я сделаю репост о программистах, как было предложено.
Edit2: Хорошо, так как тема, по-видимому, все еще здесь неуместна, я тем самым снимаю вопрос. Я уже получил ценный вклад от первых нескольких постеров, которые воодушевили меня на дальнейшие эксперименты с генераторами синтаксических анализаторов общего назначения.