Lex क्या है? | Lex in Compiler Design in Hindi


Lex क्या है? (What is Lex in Compiler Design?)

Lex एक लोकप्रिय लेक्सिकल एनालाइज़र जनरेटर (Lexical Analyzer Generator) है, जिसका उपयोग कंपाइलर डिज़ाइन में लेक्सिकल एनालाइज़र को स्वचालित रूप से उत्पन्न करने के लिए किया जाता है। यह UNIX-आधारित टूल है, जो किसी भाषा के नियमित व्याकरण (Regular Expressions) को फाइनाइट स्टेट मशीन (Finite State Machine - FSM) में बदलकर टोकन्स (Tokens) को पहचानने में मदद करता है।

Lex का उपयोग क्यों किया जाता है? (Why is Lex Used?)

Lex का उपयोग कंपाइलर डिज़ाइन में किया जाता है, क्योंकि यह:

  • लेक्सिकल एनालाइज़र को स्वचालित रूप से उत्पन्न करता है।
  • रेगुलर एक्सप्रेशन्स (Regular Expressions) के आधार पर टोकन्स को पहचान सकता है।
  • टोकन्स को अन्य कंपाइलर चरणों (जैसे सिंटैक्स एनालिसिस) को भेज सकता है।
  • स्पीड और एफिशिएंसी बढ़ाने के लिए फाइनाइट स्टेट मशीन (FSM) का उपयोग करता है।

Lex का वर्किंग मॉडल (Working Model of Lex)

Lex का उपयोग निम्नलिखित चरणों में किया जाता है:

  1. Lex Code लिखना: इसमें टोकन्स को परिभाषित किया जाता है।
  2. Lex कंपाइल करना: Lex कोड को `lex` कमांड से कंपाइल किया जाता है।
  3. C कंपाइलर से कंपाइल करना: Lex कोड को C में बदलकर GCC से कंपाइल किया जाता है।
  4. इनपुट देना और आउटपुट प्राप्त करना: रनिंग प्रोग्राम के दौरान सोर्स कोड को स्कैन करके टोकन्स जेनरेट किए जाते हैं।

Lex प्रोग्राम का स्ट्रक्चर (Structure of a Lex Program)

Lex प्रोग्राम मुख्य रूप से तीन भागों में विभाजित होता है:

%{
    /* C कोड */
%}
%%
    /* पैटर्न और एक्शन */
%%
    /* मुख्य फ़ंक्शन */

Lex कोड का उदाहरण (Example of Lex Code)

यह एक साधारण Lex प्रोग्राम है, जो पहचानकर्ता (Identifiers) और संख्याओं (Numbers) को अलग करता है:

%{
#include <stdio.h>
%}
%%
[a-zA-Z][a-zA-Z0-9]*   { printf("Identifier: %s\n", yytext); }
[0-9]+                 { printf("Number: %s\n", yytext); }
.                      { printf("Symbol: %s\n", yytext); }
%%
int main() {
    yylex();
    return 0;
}
int yywrap() {
    return 1;
}

Lex कोड को कैसे रन करें? (How to Run a Lex Program?)

Lex प्रोग्राम को निम्नलिखित स्टेप्स के माध्यम से चलाया जाता है:

  1. Lex कोड को `.l` एक्सटेंशन के साथ सेव करें (जैसे `program.l`)।
  2. Lex कोड को कंपाइल करें: lex program.l
  3. सी कोड को GCC से कंपाइल करें: gcc lex.yy.c -o output
  4. अंत में, इसे चलाएँ: ./output

Lex में उपयोग होने वाले मुख्य फ़ंक्शन्स (Important Functions in Lex)

फ़ंक्शन विवरण
yylex() लेक्सिकल एनालाइज़र को कॉल करता है और इनपुट स्कैन करता है।
yytext वर्तमान टोकन का टेक्स्ट स्टोर करता है।
yywrap() जब इनपुट समाप्त हो जाता है, तो इसे कॉल किया जाता है।

Lex के लाभ (Advantages of Lex)

  • स्वचालित रूप से लेक्सिकल एनालाइज़र बनाता है।
  • कई प्रोग्रामिंग भाषाओं के लिए उपयुक्त है।
  • एफिशिएंसी बढ़ाने के लिए FSM का उपयोग करता है।
  • रेगुलर एक्सप्रेशन्स को सपोर्ट करता है।

Lex की सीमाएँ (Limitations of Lex)

  • केवल लेक्सिकल एनालिसिस करता है, सिंटैक्स और सेमांटिक एनालिसिस नहीं।
  • जटिल भाषाओं के लिए अतिरिक्त कोडिंग की आवश्यकता होती है।
  • सभी प्रकार के लेक्सिकल एरर्स को सही से नहीं पकड़ सकता।

निष्कर्ष (Conclusion)

Lex कंपाइलर डिज़ाइन का एक शक्तिशाली टूल है, जो लेक्सिकल एनालिसिस को सरल और तेज़ बनाता है। यह नियमित व्याकरण (Regular Expressions) का उपयोग करके टोकन्स को पहचानता है और फाइनाइट स्टेट मशीन (FSM) के सिद्धांतों पर काम करता है। Lex का उपयोग करके कंपाइलर डिज़ाइन को अधिक प्रभावी और सुव्यवस्थित बनाया जा सकता है।

Related Post