लेक्स (सॉफ्टवेयर): Difference between revisions

From Vigyanwiki
Line 75: Line 75:


=== पार्सर जेनरेटर के साथ लेक्स का उपयोग करना ===
=== पार्सर जेनरेटर के साथ लेक्स का उपयोग करना ===
लेक्स और पार्सर जनरेटर, जैसे Yacc या GNU बायसन, आमतौर पर एक साथ उपयोग किए जाते हैं। पार्सर जेनरेटर एक इनपुट स्ट्रीम को पार्स करने के लिए एक [[औपचारिक व्याकरण]] का उपयोग करते हैं, कुछ ऐसा जो लेक्स सरल नियमित अभिव्यक्तियों का उपयोग करके नहीं कर सकता, क्योंकि लेक्स सरल परिमित राज्य मशीन तक सीमित है।{{Clarify|reason=mixes together grammars, regular expressions and FSMs into a confusing result|date=May 2012}}
लेक्स और पार्सर जनरेटर, जैसे याक या बाइसन सामान्यतः साथ में उपयोग किए जाते हैं। पार्सर जेनरेटर एक [[औपचारिक व्याकरण]] का उपयोग करते हैं जिससे एक इनपुट स्ट्रीम को पार्स किया जा सके, जो कि लेक्स केवल साधारित सीमित स्थिति स्वतंत्र अभिव्यक्तियों का उपयोग करके नहीं कर सकता।


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


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


=== लेक्स और बनाओ ===
[[ स्कैनर रहित पार्सिंग | स्कैनर रहित पार्सिंग]] एक अलग लेक्स के बिना सीधे इनपुट वर्ण--स्ट्रीम को पार्स करने के लिए संदर्भित करता है।
[[ बनाओ (सॉफ्टवेयर) ]] एक उपयोगिता है जिसका उपयोग लेक्स से जुड़े कार्यक्रमों को बनाए रखने के लिए किया जा सकता है। मान लें कि एक फ़ाइल जिसका एक्सटेंशन है <code>.l</code> एक लेक्स स्रोत फ़ाइल है। आंतरिक मैक्रो बनाएं <code>LFLAGS</code> मेक द्वारा स्वचालित रूप से लागू किए जाने वाले लेक्स विकल्पों को निर्दिष्ट करने के लिए उपयोग किया जा सकता है।<ref>
 
=== लेक्स और मेक ===
[[ बनाओ (सॉफ्टवेयर) |मेक]] एक उपयोगी उपकरण है जिसका उपयोग लेक्स से जुड़े प्रोग्रामों को बनाए रखने में किया जा सकता है। मेक यह मानता है कि एक फ़ाइल जिसका एक्सटेंशन<code>.l</code> है, वह एक लेक्स स्रोत फ़ाइल है। मेक आंतरिक मैक्रो<code>LFLAGS</code> का उपयोग किया जा सकता है जिससे  स्वचालित रूप से मेक द्वारा आवंटित लेक्स विकल्पों को निर्दिष्ट किया जा सकता है।<ref>
{{Cite journal
{{Cite journal
  |url=http://www.opengroup.org/onlinepubs/009695399/utilities/make.html
  |url=http://www.opengroup.org/onlinepubs/009695399/utilities/make.html
Line 92: Line 94:
  |id=IEEE Std 1003.1, 2004 Edition
  |id=IEEE Std 1003.1, 2004 Edition
}}</ref>
}}</ref>





Revision as of 11:54, 5 July 2023

Lex
Original author(s)Mike Lesk, Eric Schmidt
Initial release1975; 49 years ago (1975)
Written inC
Operating systemUnix, Unix-like, Plan 9
PlatformCross-platform
TypeCommand
LicensePlan 9: MIT License

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

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

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

ओपन-सोर्स

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

एक लेक्स फ़ाइल की संरचना

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

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

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

एक लेक्स फ़ाइल का उदाहरण

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

/*** Definition section ***/

%{
/* C code to be copied verbatim */
#include <stdio.h>
%}

%%
    /*** Rules section ***/

    /* [0-9]+ matches a string of one or more digits */
[0-9]+  {
            /* yytext is a string containing the matched text. */
            printf("Saw an integer: %s\n", yytext);
        }

.|\n    {   /* Ignore all other characters. */   }

%%
/*** C Code section ***/

int main(void)
{
    /* Call the lexer, then quit. */
    yylex();
    return 0;
}

यदि यह इनपुटflex, को दिया जाता है, तो यह सी फ़ाइल में रूपांतरित हो जाएगा और lex.yy.c नामक फ़ाइल बन जाता है। इस lex.yy.c फ़ाइल को संकलित किया जा सकता है एक एक्सेक्यूटेबल फ़ाइल में जिससे स्ट्रिंग्स का मिलान किया जा सकता है और उसे आउटपुट किया जा सकता है। उदाहरण के लिए, निम्नलिखित इनपुट दिया गया है:

abc123z.!&*2gj6

कार्यक्रम प्रिंट करेगा:

Saw an integer: 123
Saw an integer: 2
Saw an integer: 6

अन्य प्रोग्रामिंग टूल्स के साथ लेक्स का उपयोग करना

पार्सर जेनरेटर के साथ लेक्स का उपयोग करना

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

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

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

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

लेक्स और मेक

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


यह भी देखें

संदर्भ

  1. Levine, John R.; Mason, Tony; Brown, Doug (1992). लेक्स और याक (2 ed.). O'Reilly. pp. 1–2. ISBN 1-56592-000-7.
  2. Levine, John (August 2009). फ्लेक्स और बाइसन. O'Reilly Media. p. 304. ISBN 978-0-596-15597-1.
  3. The Open Group Base Specifications Issue 7, 2018 edition § Shell & Utilities § Utilities § lex
  4. John R. Levine; John Mason; Doug Brown (1992). लेक्स और Yacc. O'Reilly.
  5. "make". The Open Group Base Specifications. The IEEE and The Open Group (6). 2004. IEEE Std 1003.1, 2004 Edition.


बाहरी संबंध