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

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

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

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

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

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

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

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

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

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

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

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

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

यह भी देखें

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

बाहरी संबंध

 * Using Flex and Bison at Macworld.com