Я работаю над очень простым декомпилятором для архитектуры MIPS, и по мере продвижения мне приходится определять множество правил для анализа кода, например, «если этот код операции lui, а следующий код операции addiu< /em>, затем верните var = value" или "если этот код операции bne и ссылается на адрес перед текущим - создайте определение цикла при синтаксическом анализе дерево". Проблема в том, что таких правил множество, и я не могу найти хороший способ их определить. Я пытался писать отдельные функции для каждого правила, определяя хорошие классы базовой логики ООП и расширяя их для создания правил, даже пробовал использовать регулярные выражения в дизассемблированном коде (к моему удивлению, это работает лучше, чем ожидалось), но независимо от того, что я пробовал, мой код вскоре стал слишком большим и трудным для чтения, независимо от того, насколько хорошо я пытаюсь его документировать и структурировать.
Это подводит меня к выводу, что я пытаюсь решить эту задачу, используя неправильные инструменты (не говоря уже о том, что я слишком глуп для такой сложной задачи :)), но я понятия не имею, что мне попробовать. В настоящее время у меня есть две непроверенные идеи: одна использует какой-то DSL (у меня нет абсолютно никакого опыта в этом, поэтому я могу ошибаться), а другая — написание каких-то бинарных инструментов, подобных регулярным выражениям, для сопоставления кодов операций.
Я надеюсь, что кто-то может указать мне правильное направление, спасибо.
goto
s для циклов и перерабатывать переменные , так далее.) - person Zifre   schedule 28.07.2010