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

From Vigyanwiki
No edit summary
Line 18: Line 18:
| website                =  
| website                =  
}}
}}
लेक्स एक [[कंप्यूटर प्रोग्राम]] है जो लेक्सिकल विश्लेषण  उत्पन्न करता है
'''लेक्स''' एक [[कंप्यूटर प्रोग्राम]] है जो लेक्सिकल विश्लेषण  उत्पन्न करता है


लेक्स सामान्यतः [[याक]] [[पार्सर जनरेटर]] के साथ उपयोग किया जाता है।<ref>{{cite book |last1=Levine |first1=John R. | author-link1=John R. Levine |last2=Mason |first2=Tony |last3=Brown |first3=Doug |title=लेक्स और याक|pages=[https://archive.org/details/lexyacc00levi/page/1 1]–2 |publisher=[[O'Reilly Media|O'Reilly]] |year=1992 |edition=2 |isbn=1-56592-000-7 |url=https://archive.org/details/lexyacc00levi|url-access=registration }}</ref> लेक्स, [[माइक लेस्क]] और [[एरिक श्मिट]] द्वारा पहले लिखा गया था और 1975 में वर्णित किया गया था। यह कई [[यूनिक्स]] सिस्टमों पर मानक शब्दिक विश्लेषक जेनरेटर है, और पॉज़िक्स मानक का हिस्सा के रूप में एक समकक्ष उपकरण निर्दिष्ट किया गया है।<ref>{{Cite book | last=Levine | first=John | author-link=John Levine | title =फ्लेक्स और बाइसन| publisher=O'Reilly Media | date=August 2009 | page=304 | url=http://oreilly.com/catalog/9780596155988 | isbn=978-0-596-15597-1}}</ref><ref>[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/lex.html The Open Group Base Specifications Issue 7, 2018 edition § Shell & Utilities § Utilities § lex]</ref> लेक्स एक इनपुट [[स्ट्रीम (कंप्यूटिंग)|स्ट्रीम]] को पढ़ता है जिसमें शब्दिक विश्लेषक को निर्दिष्ट किया गया होता है और [[ सी (प्रोग्रामिंग भाषा) |सी]] प्रोग्रामिंग भाषा में शब्दिक विश्लेषक को कार्यान्वित करने वाला स्रोत कोड लिखता है।
लेक्स सामान्यतः [[याक]] [[पार्सर जनरेटर]] के साथ उपयोग किया जाता है।<ref>{{cite book |last1=Levine |first1=John R. | author-link1=John R. Levine |last2=Mason |first2=Tony |last3=Brown |first3=Doug |title=लेक्स और याक|pages=[https://archive.org/details/lexyacc00levi/page/1 1]–2 |publisher=[[O'Reilly Media|O'Reilly]] |year=1992 |edition=2 |isbn=1-56592-000-7 |url=https://archive.org/details/lexyacc00levi|url-access=registration }}</ref> लेक्स, [[माइक लेस्क]] और [[एरिक श्मिट]] द्वारा पहले लिखा गया था और 1975 में वर्णित किया गया था। यह कई [[यूनिक्स]] सिस्टमों पर मानक शब्दिक विश्लेषक जेनरेटर है, और पॉज़िक्स मानक का हिस्सा के रूप में एक समकक्ष उपकरण निर्दिष्ट किया गया है।<ref>{{Cite book | last=Levine | first=John | author-link=John Levine | title =फ्लेक्स और बाइसन| publisher=O'Reilly Media | date=August 2009 | page=304 | url=http://oreilly.com/catalog/9780596155988 | isbn=978-0-596-15597-1}}</ref><ref>[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/lex.html The Open Group Base Specifications Issue 7, 2018 edition § Shell & Utilities § Utilities § lex]</ref> लेक्स एक इनपुट [[स्ट्रीम (कंप्यूटिंग)|स्ट्रीम]] को पढ़ता है जिसमें शब्दिक विश्लेषक को निर्दिष्ट किया गया होता है और [[ सी (प्रोग्रामिंग भाषा) |सी]] प्रोग्रामिंग भाषा में शब्दिक विश्लेषक को कार्यान्वित करने वाला स्रोत कोड लिखता है।
Line 24: Line 24:
<ref>{{cite book|title=लेक्स और Yacc|url=https://archive.org/details/lexyacc00levi |url-access=registration |author1=John R. Levine |author2=John Mason |author3=Doug Brown |publisher=O'Reilly |date=1992 }}</ref>कुछ पुराने संस्करणों में लेक्स [[रैटफोर]] में भी शब्दिक विश्लेषक उत्पन्न कर सकता था।
<ref>{{cite book|title=लेक्स और Yacc|url=https://archive.org/details/lexyacc00levi |url-access=registration |author1=John R. Levine |author2=John Mason |author3=Doug Brown |publisher=O'Reilly |date=1992 }}</ref>कुछ पुराने संस्करणों में लेक्स [[रैटफोर]] में भी शब्दिक विश्लेषक उत्पन्न कर सकता था।


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


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


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


<syntaxhighlight lang="c">/*** Definition section ***/
<syntaxhighlight lang="c">/*** Definition section ***/
Line 65: Line 65:
     return 0;
     return 0;
}</syntaxhighlight>
}</syntaxhighlight>
अगर यह इनपुट दिया जाता है <code>flex</code>, यह एक सी फाइल में परिवर्तित हो जाएगा, {{nowrap | <code>lex.yy.c</code>}}. इसे निष्पादन योग्य में संकलित किया जा सकता है जो पूर्णांक के तारों से मेल खाता है और आउटपुट करता है। उदाहरण के लिए, इनपुट दिया गया:
यदि यह इनपुट<code>flex</code>, को दिया जाता है, तो यह सी फ़ाइल में रूपांतरित हो जाएगा और{{nowrap | <code>lex.yy.c</code>}} नामक फ़ाइल बन जाता है। इस {{nowrap | <code>lex.yy.c</code>}} फ़ाइल को संकलित किया जा सकता है एक एक्सेक्यूटेबल फ़ाइल में जिससे स्ट्रिंग्स का मिलान किया जा सकता है और उसे आउटपुट किया जा सकता है। उदाहरण के लिए, निम्नलिखित इनपुट दिया गया है:
  abc123z.!&*2gj6
  abc123z.!&*2gj6
कार्यक्रम प्रिंट करेगा:
कार्यक्रम प्रिंट करेगा:
  एक पूर्णांक देखा: 123
  Saw an integer: 123
  एक पूर्णांक देखा: 2
  Saw an integer: 2
  एक पूर्णांक देखा: 6
  Saw an integer: 6


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

Revision as of 11:27, 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 या GNU बायसन, आमतौर पर एक साथ उपयोग किए जाते हैं। पार्सर जेनरेटर एक इनपुट स्ट्रीम को पार्स करने के लिए एक औपचारिक व्याकरण का उपयोग करते हैं, कुछ ऐसा जो लेक्स सरल नियमित अभिव्यक्तियों का उपयोग करके नहीं कर सकता, क्योंकि लेक्स सरल परिमित राज्य मशीन तक सीमित है।[clarification needed]

आमतौर पर एक पार्सर होना बेहतर होता है, उदाहरण के लिए 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.


बाहरी संबंध