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

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

सी के अलावा, लेक्स के कुछ पुराने संस्करण रैटफोर में एक लेक्सर उत्पन्न कर सकते हैं।

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

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

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

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

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

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

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

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

यह भी देखें

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

बाहरी संबंध

 * Using Flex and Bison at Macworld.com