parsing - सरल पार्सर का विकास करना




bison flex-lexer (6)

अगर आप इसे जावा में लिख रहे थे, तो मैं एएनटीएलआर की सिफारिश करता था। यह जावा में लिखा गया एक अच्छा एलएल (*) पार्सर जनरेटर है अमेज़ॅन पर इसके लिए एक भयानक किताब भी है,

मेरे दिन की नौकरी में पास्कल जैसे संकलक को विकसित करने में काम करना शामिल है मैं अनुकूलन और कोड पीढ़ी के साथ काम कर रहा हूं।

मैं भी एक ही भाषा के लिए एक साधारण पार्सर बनाने के लिए सीखना शुरू करना चाहूंगा। मैं वास्तव में यह नहीं जानता कि कैसे इस बारे में जाना है फ्लेक्स और बाइसन को पसंद लगता है लेकिन, सी ++ या सी # का इस्तेमाल करने वाला पार्सर लिखना संभव नहीं है? मैं सी के साथ थोड़ा डरावना हूँ

Yacc ++ सी # का समर्थन करता है, लेकिन यह लाइसेंस प्राप्त एक है मैं इस संबंध में सभी मदद की तलाश कर रहा हूं। सुझावों की अत्यधिक सराहना की जाएगी


आप वास्तव में C ++ के साथ फ्लेक्स और बायसन का उपयोग कर सकते हैं इस ट्यूटोरियल में , उदाहरण के लिए, आप देख सकते हैं कि धारा 5 उस बात को समर्पित है। बस इसके लिए गूगल, और मुझे यकीन है कि आप बहुत सारे उदाहरण मिल जाएगा


मेरा मानना ​​है कि आप सी # के साथ एएनटीएलआर का उपयोग कर सकते हैं। मैंने इसे स्वयं (कभी भी) की कोशिश नहीं की है, हालांकि यहां एक ट्यूटोरियल है जो आपको सही दिशा में बता सकता है।


अपने क्लासिक प्रोग्रामिंग पाठ में, एल्गोरिदम + डाटा स्ट्रक्चर्स = प्रोग्राम , निकलॉस विर्थ एक साधारण पुनरावर्ती वंश पार्सल (पास्कल में) को सरल पास्कल 0 जैसी भाषा के लिए विकसित करता है।


अगर आपकी चाहत सी # के अनुसार इस प्रश्न के मुताबिक गार्डन प्वाइंट जीपीपीजी और जीपीएलएक्स


मैंने फ्लेक्स और बीज़न के साथ एक्सएसएलटी पार्सर लिखा है। और हाल ही में मैं एएनटीएलआर का उपयोग कर एक परियोजना कर रहा हूं, हालांकि:

क्या जेफिग भाषा वाक्यविन्यास कुशल और स्पष्ट है (और स्प्रिंग-फ्रेमवर्क के एक्सएमएल डीएसएल से बेहतर है)?

मुझे फ्लेक्स और बाइसन की तुलना में बहुत अधिक एएनटीएलआर में काम करना पसंद आया। एएनटीएलआर आपको कुछ मामलों में अमूर्त के उच्च स्तर पर रखता है। लेक्सिकल परिभाषाएं और पार्सर व्याकरण सभी एक फाइल में जा सकते हैं (ANTLR टोकन फ़ाइल उत्पन्न करेगा।)

मुख्य वस्तुओं में से एक पेड़ व्याकरण को परिभाषित करने की क्षमता है असल में आप इनपुट भाषा पर एक व्याकरण का पार्स करते हैं और ऐसी क्रियाएं होती हैं जो उच्चतम एस्ट ट्री आउटपुट (जो स्मृति में जुड़े डेटा संरचना के रूप में रहती हैं) को फिर से लिखती हैं। फिर आप इस पेड़ को एक अलग पेड़ पार्सर फ़ाइल में परिभाषित दूसरे पार्स को पारित कर सकते हैं। पेड़ पार्सर है, जहां आप चाहते हैं कि आप जिस एक्शन मदों का असली काम करते हैं

यह एक अच्छा तरीका है क्योंकि आप एएसटी फॉर्म को रख सकते हैं और बार-बार पुनर्रचना कर सकते हैं - बाद में क्रियाओं, आदि के आधार पर प्रक्रिया करने के लिए विशिष्ट उप-नोड्स को छीलने के लिए। भाषा व्याख्याता की तरह कुछ सोचें। लूप में जाने के बजाय और फिर से जमीन से भाषा को प्रोसेस करने के बजाय, केवल एएसटी प्रतिनिधित्व के माध्यम से इसकी प्रक्रिया कर सकते हैं।

मेरे मामले में मैंने आईओसी निर्भरता इंजेक्शन के लिए एक बीन कारखाने तैयार किया है। मेरी बीन फैक्ट्री रनटाइम पर आस-पास बीन्स डिस्क्रिप्टर के एएसटी रखती है। जब यह एक नया बीन उदाहरण बनाने (या पुनः प्राप्त करने) की आवश्यकता होती है, तो मैं बस अपने पेड़ के पार्स करने के लिए बीन डिस्क्रिप्टर एएसटी सबट्री पास करता हूं - परिणाम वांछित बीन उदाहरण होता है (कई कारक हैं जो इन्हें इन्स्तांत करने का तरीका निर्धारित करते हैं अनुरोधित बीन, किसी अन्य बीन्स को संदर्भित करने और / या मेटा विशेषता के माध्यम से अन्य विशेष व्यवहारों को लागू करने सहित)।

अंत में, मेरा वर्तमान बीन कारखाना जावा को लक्षित कर रहा है, लेकिन मैं ActionScript3 और C # .NET को लक्षित करना चाहता हूं। एएनटीएलआर को ऐसा करने के लिए समर्थन है

जैसा कि उल्लेख किया गया है, टेरेंस पार ने एएनटीएलआर का उपयोग करने के बारे में एक किताब लिखी है। इसका उद्देश्य प्रोग्रामर को काम करना है, जिसे एएनटीएलआर के साथ कुछ व्यावहारिक करने की आवश्यकता है (इस विषय के एक शैक्षिक उपचार के विपरीत)।







flex-lexer