2011-05-12 9 views
15

मैं अपने भाषा दो विशेषताएं है कि कर करना चाहते हैं के साथ अजगर की तरह खरोज कैसे करना है Python इस तरह के एक ठीक से स्वरूपित भाषा:फ्लेक्स/जंगली भैंसों

  • प्रति पंक्ति बयान
  • ब्लॉक एक और खरोज स्तर के साथ शुरू और पर जाने के लिए जब तक कि

किसी को भी मुझे कैसे है कि प्राप्त करने के लिए flex/bison की तरह उपकरणों के साथ पर एक विस्तृत संकेत दे सकते हैं समाप्त हो गया है? ऐसी ब्लॉक सुविधा उपयोगकर्ता को पठनीय कोड लिखने के लिए मजबूर करती है।

उत्तर

6

मुझे लगता है कि केवल लेक्स/yacc के साथ अजगर की तरह सिंटैक्स पार्सर बनाने का कोई तरीका नहीं है, क्योंकि लेक्स/yacc केवल संदर्भ मुक्त व्याकरण से निपट सकता है, लेकिन एक अजगर की तरह वाक्यविन्यास संदर्भ संवेदनशील है।

कारण यह है कि, यदि आप यह जानना चाहते हैं कि कोई कथन और पिछला एक ही ब्लॉक में है, तो आपको यह बयान पिछले एक के इंडेंटेशन को जानता है, यह संदर्भ है।

मेरा सुझाव है कि आप इसे पूरा करने के लिए लेक्स/yacc के अलावा कुछ अतिरिक्त तर्क दें, और यह इतना कठिन नहीं होगा। आप "व्याकरण" मॉड्यूल में कोड here पढ़ सकते हैं।

कुंजी है, लेक्स/yacc भाग इंडेंटेशन स्तर के साथ एकल कथन का विश्लेषण करें, और ब्लॉक में कुछ पैकिंग कथन लिखें।

+0

कहो , क्या यह हास्केल के 'पारसी' के साथ ऐसा करने में "आसान" होगा? मैंने सुना है कि यह सिर्फ संदर्भ-मुक्त से अधिक है। – Lanbo

15

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

+2

एक दयालुता मैं केवल उत्तर के रूप में चिह्नित कर सकता हूं। धन्यवाद, आपके इनपुट ने मुझे बहुत मदद की। – Lanbo

11

मैट, स्टैंडअलोन पारसर्स पर एक लेख लिखा था शायद महत्वपूर्ण खाली स्थान के रख-रखाव "unput" का उपयोग करने का एक तरीका के साथ:

http://matt.might.net/articles/standalone-lexers-with-lex/

(। उदाहरण के पृष्ठ नीचे आधे रास्ते है)