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

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

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

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

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

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

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

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

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

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

सामान्यतः यह अधिक उपयुक्त होता है कि पार्सर, जैसे कि याक द्वारा उत्पन्न, एक "टोकन-स्ट्रीम" को इनपुट के रूप में स्वीकार करना अनुचित होता है कि सीधे एक "वर्ण-स्ट्रीम" को सीधे प्रोसेस करना हो। लेक्स वर्ण-स्ट्रीम को टोकन-स्ट्रीम में रूपांतरित करने के लिए उपयोग होता है। लेक्स एक टोकन-स्ट्रीम उत्पन्न करने के लिए सामान्यतः उपयोग किया जाता है।

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

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

यह भी देखें

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

बाहरी संबंध

 * Using Flex and Bison at Macworld.com