लेक्स (सॉफ्टवेयर)

लेक्स एक कंप्यूटर प्रोग्राम है जो लेक्सिकल विश्लेषण उत्पन्न करता है

लेक्स सामान्यतः याक पार्सर जनरेटर के साथ उपयोग किया जाता है। लेक्स, माइक लेस्क और एरिक श्मिट द्वारा पहले लिखा गया था और 1975 में वर्णित किया गया था। यह कई यूनिक्स सिस्टमों पर मानक शब्दिक विश्लेषक जेनरेटर है, और पॉज़िक्स मानक का हिस्सा के रूप में एक समकक्ष उपकरण निर्दिष्ट किया गया है। लेक्स एक इनपुट स्ट्रीम को पढ़ता है जिसमें शब्दिक विश्लेषक को निर्दिष्ट किया गया होता है और सी प्रोग्रामिंग भाषा में शब्दिक विश्लेषक को कार्यान्वित करने वाला स्रोत कोड लिखता है।

कुछ पुराने संस्करणों में लेक्स रैटफोर में भी शब्दिक विश्लेषक उत्पन्न कर सकता था।

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

एक लेक्स फ़ाइल की संरचना
एक लेक्स फ़ाइल की संरचना जानबूझकर एक याक फ़ाइल के समान होती है: फ़ाइलों को तीन खंडों में विभाजित किया जाता है, जो लाइनों से अलग होते हैं जिनमें केवल दो प्रतिशत संकेत होते हैं:

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

एक लेक्स फ़ाइल का उदाहरण
निम्नलिखित लेक्स के फ्लेक्स लेक्सिकल एनालाइज़र संस्करण के लिए एक उदाहरण लेक्स फ़ाइल है। यह इनपुट में संख्याओं के तार को पहचानता है, और उन्हें प्रिंट करता है।

यदि यह इनपुट, को दिया जाता है, तो यह सी फ़ाइल में रूपांतरित हो जाएगा और नामक फ़ाइल बन जाता है। इस फ़ाइल को संकलित किया जा सकता है एक एक्सेक्यूटेबल फ़ाइल में जिससे स्ट्रिंग्स का मिलान किया जा सकता है और उसे आउटपुट किया जा सकता है। उदाहरण के लिए, निम्नलिखित इनपुट दिया गया है: abc123z.!&*2gj6 कार्यक्रम प्रिंट करेगा: Saw an integer: 123 Saw an integer: 2 Saw an integer: 6

पार्सर जेनरेटर के साथ लेक्स का उपयोग करना
लेक्स और पार्सर जनरेटर, जैसे Yacc या GNU बायसन, आमतौर पर एक साथ उपयोग किए जाते हैं। पार्सर जेनरेटर एक इनपुट स्ट्रीम को पार्स करने के लिए एक औपचारिक व्याकरण का उपयोग करते हैं, कुछ ऐसा जो लेक्स सरल नियमित अभिव्यक्तियों का उपयोग करके नहीं कर सकता, क्योंकि लेक्स सरल परिमित राज्य मशीन तक सीमित है।

आमतौर पर एक पार्सर होना बेहतर होता है, उदाहरण के लिए Yacc द्वारा उत्पन्न एक, टोकन की एक धारा (एक टोकन-स्ट्रीम) को इनपुट के रूप में स्वीकार करता है, बजाय सीधे वर्णों की एक धारा (एक वर्ण-धारा) को संसाधित करने के लिए। इस तरह के टोकन-स्ट्रीम का उत्पादन करने के लिए अक्सर लेक्स का उपयोग किया जाता है।

स्कैनर रहित पार्सिंग एक अलग लेक्सर के बिना सीधे इनपुट कैरेक्टर-स्ट्रीम को पार्स करने के लिए संदर्भित करता है।

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

यह भी देखें

 * फ्लेक्स लेक्सिकल एनालाइजर
 * हाँ
 * रागल
 * प्लाई (पायथन लेक्स-वाईएसीसी)
 * पार्सर जेनरेटर की तुलना

बाहरी संबंध

 * Using Flex and Bison at Macworld.com