В моей программе, написанной на C ++, мне нужно взять набор строк, каждая из которых содержит объявление функции C, и выполнить с ними ряд операций.
Одна из операций заключается всравните, равна ли одна функция другой.Для этого я планирую просто удалить комментарии и промежуточные пробелы, которые не влияют на семантику функции, а затем выполнить сравнение строк.Тем не менее, я хотел бы сохранить пробел в строке как удаление, которое изменило бы выходные данные, создаваемые функцией.
Я мог бы написать некоторый код, который перебирает строковые символы и входит в «строковый режим» всякий раз, когда кавычка ("
) встречаются и распознаются экранированные кавычки, но мне интересно, есть ли лучший способ сделать это.Идея состоит в том, чтобы использовать полноценный синтаксический анализатор C, запустить его над строкой функции, игнорировать все комментарии и лишние пробелы, а затем снова преобразовать AST в строку.Но, оглядываясь на какой-то синтаксический анализатор C, я чувствую, что большинство из них - сука, чтобы интегрироваться с моим исходным кодом (докажи, что я ошибаюсь).Возможно, я мог бы попытаться использовать yacc
или что-то еще и использовать существующую грамматику C и сам реализовать синтаксический анализатор ...
Итак, есть какие-нибудь идеи о наилучшем способе сделать это?
РЕДАКТИРОВАТЬ:
Программа, которую я пишу, берет абстрактную модель и преобразует ее в C-код.Модель состоит из графа, где узлы могут содержать или не содержать сегменты кода C (точнее, определение функции C, где ее выполнение должно быть полностью детерминированным (то есть без глобального состояния) и операции с памятью не допускаются).Программа выполняет сопоставление с образцом на графе и объединяет и разделяет определенные узлы, которые придерживаются этих шаблонов.Однако эти операции могут выполняться только в том случае, если узлы демонстрируют одинаковую функциональность (то есть, если их определения функций C одинаковы).Эта «проверка того, что они одинаковы», будет выполнена путем простого сравнения строк, которые содержат объявления функции C.Если они посимвольно идентичны, то они равны.
Из-за характера генерации моделей, это вполне разумный метод сравнения при условии , что комментариии лишние пробелы удаляются, так как это единственный фактор, который может отличаться.Это проблема, с которой я сталкиваюсь - как сделать это с минимальными затратами на реализацию?