मैं एमआईपीएस आर्किटेक्चर के लिए एक बहुत ही सरल डिकंपेलर पर काम कर रहा हूं और जैसा कि मैंने प्रगति की है, मुझे कोड विश्लेषण के लिए कई नियमों को परिभाषित करना है, उदाहरण के लिए "यदि यह ऑपोड है लूप बना पेड़ पार्स करने में परिभाषा "- लुई और अगले opcode addiu तो वर लौट = मूल्य" या "इस opcode BNE है और यह वर्तमान से पहले पता करने के लिए चर्चा करते हुए दी जाती है। समस्या - ऐसे कई नियम हैं और मुझे उन्हें परिभाषित करने का एक अच्छा तरीका नहीं मिल रहा है। मैंने प्रत्येक नियम के लिए अलग-अलग कार्यों को लिखने की कोशिश की है, अच्छे ओओपी बेस लॉजिक क्लास को परिभाषित किया है और नियम बनाने के लिए उन्हें विस्तारित किया है, यहां तक कि असम्बद्ध कोड पर नियमित अभिव्यक्तियों की कोशिश की है (मेरे आश्चर्य से यह अपेक्षा से बेहतर काम करता है) लेकिन इससे कोई फर्क नहीं पड़ता कि मैंने क्या प्रयास किया है, मेरा कोड जल्द ही बड़ा हो गया और पढ़ना मुश्किल हो गया, इससे कोई फर्क नहीं पड़ता कि मैं इसे दस्तावेज और संरचना करने की कोशिश कर रहा हूं।डिकंपेलर के नियमों को परिभाषित करने के लिए एक अच्छा तरीका खोजना, सलाह की आवश्यकता है
यह मुझे निष्कर्ष पर लाता है कि मैं गलत उपकरण का उपयोग करके इस कार्य को हल करने की कोशिश कर रहा हूं (इस तरह के जटिल कार्य के लिए बहुत बेवकूफ होने का उल्लेख नहीं करना :)), लेकिन मुझे कोई वास्तविक विचार नहीं है कि मुझे क्या प्रयास करना चाहिए। वर्तमान में मेरे पास दो अवांछित विचार हैं, कोई किसी प्रकार का डीएसएल उपयोग कर रहा है (मुझे इसमें बिल्कुल कोई अनुभव नहीं है, इसलिए मैं पूरी तरह से गलत हो सकता हूं), और दूसरा ओपोड मिलान के लिए किसी प्रकार का बाइनरी रीगेक्सपी-जैसे टूल लिख रहा है।
मुझे उम्मीद है कि कोई मुझे सही दिशा में इंगित कर सकता है, thx।
मुझे नहीं लगता कि निर्देश पैटर्न को देखकर एक डिकंपेलर लिखना संभव है। कोड ब्लॉक और अभिव्यक्तियों को सही ढंग से बनाने के लिए कोड प्रवाह और डेटा विश्लेषण आवश्यक है। –
AFAIK ओपोड पैटर्न अवलोकन कोड प्रवाह प्राप्त करने का तरीका है, जैसे कि मेरे दूसरे उदाहरण में (आपको बनी ऑपोड मिल जाता है जो स्वयं से पहले पते को संदर्भित करता है = यह एक लूप है), लेकिन आप सही हैं कि यह केवल चरणों में से एक है मुझे इस लूप के लिए स्थिति की गणना करने की आवश्यकता है, जिसका अर्थ है कि मुझे पहले कोड को देखने और मेमोरी \ रजिस्टर्स संशोधनों की जांच करने की आवश्यकता है। तो, यह दो पास विश्लेषण है - पहले अंदर सबकुछ की गणना करने के बजाय प्रवाह पेड़ का निर्माण करें। – Riz
द्विआधारी regex विधि वास्तव में एक बहुत अच्छा विचार की तरह लगता है। एकमात्र अन्य चीज जिसे मैं सोच सकता हूं, एलआईएलवीएम को एक एमआईपीएस फ्रंटएंड लिखना होगा, और कोड प्राप्त करने के लिए सी बैकएंड का उपयोग करना होगा (हालांकि मुझे नहीं पता कि जेनरेट कोड कितना पठनीय होगा, उदाहरण के लिए यह 'गोटो के लिए' गोटो 'का उपयोग कर सकता है और रीसायकल चर, आदि) – Zifre