Работя върху много прост декомпилатор за MIPS архитектура и докато напредвам, трябва да дефинирам много правила за анализ на кода, например „ако този код на операция е lui и следващият код на операция е addiu< /em> след това връща var = value" или "ако този код на операцията е bne и се отнася за адрес преди текущия - създайте дефиниция на loop при анализиране дърво". Проблемът - има тонове такива правила и не мога да намеря добър начин да ги дефинирам. Опитах се да напиша отделни функции за всяко правило, да дефинирам хубави OOP базови логически класове и да ги разширя, за да създавам правила, дори опитах регулярни изрази върху разглобен код (за моя изненада това работи по-добре от очакваното), но независимо от това, което опитах, кодът ми скоро стана твърде голям и труден за четене, без значение колко добре се опитвам да го документирам и структурирам.
Това ме навежда на заключението, че се опитвам да реша тази задача с помощта на грешни инструменти (да не говорим, че съм твърде глупав за такава сложна задача :) ), но нямам реална идея какво да опитам. В момента имам две непроверени идеи, едната е да използвам някакъв вид DSL (нямам абсолютно никакъв опит в това, така че може да греша напълно), а другата е да напиша някакъв вид инструменти, подобни на бинарен regexp, за съвпадение на код на операция.
Надявам се, че някой може да ме насочи в правилната посока, благодаря.
goto
s за цикли и рециклиране на променливи и т.н.) - person Zifre   schedule 28.07.2010