2012-10-27 22 views
5

मेरा लक्ष्य एक ऐसा कार्य लिखना है जो एक तार्किक अभिव्यक्ति (उदाहरण: ए या नहीं (बी और सी)) ले जाएगा और इसे सामान्य सामान्य रूप में परिवर्तित करेगा। (ए या बी या नहीं सी नहीं)एक पार्सर लिखना जो व्याकरण लेता है और एक पार्स पेड़ उत्पन्न करता है

मैं एक व्याकरण है कि तार्किक अभिव्यक्ति

S => !S 
S => (S) 
S => S op S 
S => W 
op => AND | OR 
W => A | B | C | ... | Z 

उत्पन्न होगा लिखा है यह मेरा एल्गोरिथ्म

  1. को देखते हुए एक अभिव्यक्ति एस रिकर्सिवली पार्स है उपरोक्त व्याकरण का उपयोग करके अभिव्यक्ति और संबंधित पार्स पेड़
  2. अभिव्यक्ति को किसी भी ऑपरेटरों को "सरल" करने के द्वारा डीएनएफ में कनवर्ट करें पेड़।
  3. रिकर्सिवली अंतिम पार्स पेड़ के माध्यम से जाएं और डीएनएफ लॉजिकल एक्सप्रेशन आउटपुट करें।

एक पार्स पेड़ के साथ मैं वर्तमान नोड के माता-पिता की जांच करके ऑपरेटर को सरल नहीं कर सकता, और पेड़ को दबाकर या पेड़ को फिर से व्यवस्थित नहीं कर सकता (न कि मामले में)। फिर पेड़ को फटकारना तुच्छ है।

यह कागज पर काम करता है, लेकिन अब मैं वास्तविक पार्सर से फंस गया हूं। मैं इन नियमों को एक पार्सर क्लास में कैसे परिवर्तित कर सकता हूं? मैं बाहरी पुस्तकालयों का उपयोग नहीं करना चाहता हूं और पार्सर को खरोंच से लिखना चाहता हूं।

+0

यदि आप बाहरी उपकरणों का उपयोग नहीं करना चाहते हैं तो मैं इस पुस्तक की सिफारिश करता हूं - कंपाइलर निर्माण का "बाइबल": http://www.amazon.com/Compilers-Principles-Techniques-Alfred-Aho/dp/0201100886 – Casper

+0

यह भी एक महान श्रृंखला है: http://www.rubyinside.com/writing-a-compiler-in-ruby-1222.html – Casper

+0

और: http://stackoverflow.com/questions/1669/learning-to-write -ए-कंपाइलर – Casper

उत्तर

1

ट्रिटॉप पर एक नज़र डालें, जो आप चाहते हैं कि कर सकते हैं। http://treetop.rubyforge.org/

+1

[साइट्रस] (https://github.com/mjijackson/citrus) उस परिवार का एक और सदस्य है। यदि रिकर्सिव वंश की आवश्यकता होती है तो न तो काम करेगा, लेकिन व्याकरण रत्नों के लिए उपयुक्त रूप में मालिश किया जा सकता है। – x1a4

संबंधित मुद्दे

 संबंधित मुद्दे