नियमित अभिव्यक्ति के बिना लेक्सिकल विश्लेषण


9

मैं विभिन्न उच्च स्तरीय लैंगुग ( पायथन , पीएचपी , जावास्क्रिप्ट अन्य लोगों में) में कुछ लेक्सर्स को देख रहा हूं और वे सभी एक या दूसरे रूप में नियमित अभिव्यक्ति का उपयोग करते हैं। हालांकि मुझे यकीन है कि रेगेक्स शायद ऐसा करने का सबसे अच्छा तरीका है, मैं सोच रहा था कि क्या नियमित अभिव्यक्तियों के बिना मूल लेक्सिंग प्राप्त करने का कोई तरीका था, शायद किसी प्रकार का सीधा स्ट्रिंग पार्सिंग या कुछ।

तो हाँ, क्या यह संभव है कि किसी भी रूप में नियमित अभिव्यक्ति का उपयोग किए बिना किसी उच्च स्तरीय भाषा में कुछ प्रकार के बुनियादी लेक्सिंग को लागू किया जा सके?

* उच्च स्तरीय भाषाएं जैसे पर्ल / पीएचपी / पायथन / जावास्क्रिप्ट आदि जैसी चीजें हैं, मुझे यकीन है कि सी में ऐसा करने का एक तरीका है।


2
ऐसा लगता है कि "क्या कैलकुलस पर एक किताब है जो उन सभी ग्रीक अक्षरों और अजीबोगरीब चीजों का उपयोग नहीं करती है?"
केविन क्लाइन

@kevincline जब आसमान में पूरी तरह से अच्छे विमान हैं तो लोग अटलांटिक के पार क्यों जाते हैं?
स्मज करें

1
रोइंग और राइडिंग के अलग-अलग दुष्प्रभाव हैं।
केविन क्लाइन

जवाबों:


3

सबसे पहले, आपके "उच्च-स्तरीय" भाषाओं का आविष्कार होने से पहले सी के लिए नियमित अभिव्यक्ति पुस्तकालय थे। सिर्फ यह कहते हुए कि C प्रोग्राम उतना पॉडंक नहीं है जितना कुछ लोग सोचते हैं।

अधिकांश व्याकरणों के लिए, लेक्सिंग व्हॉट्सएप और कुछ अन्य वर्णों की खोज करने का विषय है (जैसे [] {}; शब्दों को विभाजित करने के लिए, और फिर किसी भी मैच को देखने के लिए कीवर्ड की सूची के खिलाफ मिलान।


1
मेरा मतलब यह नहीं था कि सी रेगेक्स नहीं कर सकता, मेरा मतलब था कि इस तरह के सामान को करने के लिए और अधिक शक्तिशाली विशेषताएं हैं। मुझे लगता है कि उच्च स्तरीय भाषा की तुलना में सी में एक उन्नत और प्रदर्शनकारी लेक्सर का निर्माण करना आसान है।
स्मज करें

1
@ लेक्सर या पार्सर की जटिलता और प्रदर्शन भाषा की जटिलता का एक ऐसा कार्य है जिसे लैंगुगे की तुलना में पार्सर में लागू किया जाता है, इसलिए नहीं।
जे.के.

+1। एक लेक्सर अविश्वसनीय रूप से सरल है; आपको बस एक स्ट्रिंग, अपने टोकन के लिए एक डेटा प्रकार और पूर्वनिर्धारित कीवर्ड की एक तालिका की आवश्यकता है। चालबाज हिस्सा व्हॉट्सएप और टिप्पणियों के साथ काम कर रहा है: पी
मेसन व्हीलर

2

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

(खूंटी, जिनका उल्लेख अन्य उत्तरों में किया गया है, का उपयोग स्कैनर रहित पार्सर के निर्माण के लिए भी किया जा सकता है।)


1

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


0

बेशक आप अन्य पार्सर का उपयोग कर सकते हैं, क्योंकि हर नियमित भाषा भी संदर्भ मुक्त होती है। सवाल वास्तव में नीचे आता है कि आप क्यों करना चाहते हैं।

नियमित अभिव्यक्तियों की तुलना में वास्तव में कुछ भी सरल नहीं है (आप ओ (एन) को कैसे सुधार सकते हैं?) और सरल बनाने की कोशिश करने से मदद नहीं मिलेगी। आप हमेशा सरल बैकट्रैकिंग का उपयोग कर सकते हैं जैसा कि जेट्टी ने बताया है, हालांकि मैं इसे संभव होने से बचने की सलाह देता हूं।

यदि आप लेक्सिंग के लिए अधिक उन्नत पार्सर का उपयोग करने जा रहे हैं, तो आपको संभवतः लेक्सिंग चरण की आवश्यकता नहीं है। वास्तव में, हमारे पास एक लेक्सिंग चरण होने का कारण यह है कि यह पार्स पात्रों की तुलना में लेक्सिड टोकन को पार्स करने के लिए तेज़ है, साथ ही यह हमारे पार्सिंग चरण को काफी सरल करता है। तो एक और अधिक उन्नत पार्सर का उपयोग करके आप पहली जगह में लेक्सिंग के सभी लाभ खो देते हैं।


तो रेगेक्स कैसे करता है? क्या अभी भी चरित्र द्वारा चरित्र नहीं जाना होगा (कम से कम लेक्सिंग में उपयोग किए जाने वाले अधिकांश पैटर्न के लिए)?
जेटी

@ जेटी हां, बिल्कुल।
पब

प्रत्येक पात्र को पढ़ना उतना ही आसान होगा और यदि एक टोकन को बाहर निकालने की आवश्यकता होती है तो बैकट्रैक। यह अधिक कोड होगा लेकिन अधिक कठिन नहीं होगा।
जेटी

@ जेटी मैं यह देखने में विफल हूं कि भोली पीठ कैसे बेहतर है।
पब

मैंने कभी बेहतर नहीं कहा। लेकिन ओपी ने पूछा कि क्या अन्य तरीके हैं और यह एक और तरीका है जो एक उन्नत पार्सर नहीं है।
जेटी

0

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.