تحلیل‌گر واژگانی فلکس

از ویکی‌پدیا، دانشنامهٔ آزاد
پرش به: ناوبری، جستجو
فلکس
توسعه‌دهنده(ها) ورن پاکسن
انتشار پایدار ۲٫۵٫۳۷
وضعیت توسعه در جریان
سیستم‌عامل شبه یونیکس
سکو چند سکویی
گونه تولید کننده تحلیل‌گر واژگانی
پروانه پروانه بی‌اس‌دی
وب‌گاه flex.sourceforge.net

فلکس (به انگلیسی: flex) (مخفف عبارت fast lexical analyzer generator) یک نرم‌افزار آزاد و جایگزینی برای لکس است. فلکس بیشتر به همراه گنو بایسون استفاده می‌شود. اما بر خلاف بایسون جزئی از پروژه گنو به حساب نمی‌آید. فلکس در سال ۱۹۸۷ توسط ورن پاکسون و به زبان سی نوشته شده است. فلکس برنامه‌ای برای ساختن یک تحلیل‌گر واژگانی است. یک تحلیل‌گر واژگانی برنامه‌ایست که الگوهای واژگانی را از یک متن تشخیص می‌دهد. برنامه فلکس یک فایل از ورودی می‌گیرید که الگوهای مورد نظر کاربر به همراه تعدادی کد سی برای هر الگو در آن تعریف شده است. فلکس این فایل را پردازش کرده و سپس فایلی به نام lex.yy.c تولید می‌کند که در این فایل تابعی به نام yylex()‎ تعریف شده است. این فایل می‌تواند توسط کاربر کامپایل شود تا یک فایل اجرایی بوجود آید که همان برنامه تحلیل‌گر واژگانی است. وقتی این برنامه اجرا شد، متنی را از ورودی می‌گیرد و سعی می‌کند که الگوهای مورد نظر کاربر را در این متن تشخیص دهد. وقتی که یکی از این الگوها پیدا شد، یک کد به زبان سی (که از قبل تعریف شده) اجرا می‌شود.

فلکس به همراه بایسون به صورت گسترده برای طراحی کامپایلرها استفاده می‌شوند.

تحلیل کننده های واژگانی[ویرایش]

این در واقع مثالی از یک اسکنر فلکس برای زبان برنامه نویسی دستوری PL/0است. توکن های تشخیص داده شده :+ , - , * , / , = , ( , ), , , ; , . , := , < , > , <> , >=، اعداد 0 تا 9، حروف a تا z و کلمات کلیدی begin ، call، const، do، end، if، odd، procedure، then، var، while می باشد.


%{
#include "y.tab.h"
%}
digit [0-9]
letter [a-zA-Z]
%%
"+" { return PLUS; }
"-" { return MINUS; }
"*" { return TIMES; }
"/" { return SLASH; }
"(" { return LPAREN; }
")" { return RPAREN; }
";" { return SEMICOLON; }
"," { return COMMA; }
"." { return PERIOD; }
":=" { return BECOMES; }
"=" { return EQL; }
"<>" { return NEQ; }
"<" { return LSS; }
">" { return GTR; }
"<=" { return LEQ; }
">=" { return GEQ; }
"begin" { return BEGINSYM; }
"call" { return CALLSYM; }
"const" { return CONSTSYM; }
"do" { return DOSYM; }
"end" { return ENDSYM; }
"if" { return IFSYM; }
"odd" { return ODDSYM; }
"procedure" { return PROCSYM; }
"then" { return THENSYM; }
"var" { return VARSYM; }
"while" { return WHILESYM; }
{letter}({letter}|{digit})* {
yylval.id = strdup(yytext);
return IDENT; }
{digit}+ { yylval.num = atoi(yytext);
return NUMBER; }
[ \t\n\r] /* skip whitespace */
. { printf("Unknown character [%c]\n",yytext[0]);
return UNKNOWN; }
%%
int yywrap(void){return 1;}

پیچیدگی زمانی[ویرایش]

یک تحلیل کننده واژگانی فلکس معمولا دارای پیچیدگی زمانی (On) است که یعنی به طول ورودی هم بستگی دارد. در واقع آن تعداد ثابتی از عملیات را برای هر سمبل ورودی اجرا می کند. این ثابت بسیار کم است: GCC، 12 دستور را برای حلقه DFA تولید می کند. توجه داشته باشید که این ثابت وابسته به طول توکن ها، طول عبارت ثابت و اندازه DFA می باشد.

بازگشتی[ویرایش]

به صورت پیشفرض، اسکنر تولید شده توسط فلکس بازگشتی نیست. این امر می تواند منجر به مشکلاتی جدی برای برنامه هایی شود که از اسکنر تولید شده از نخ های مختلف استفاده می کنند. برای غلبه بر این موضوع، گزینه هایی وجود دارد که فلکس به منظور رسیدن به بازگشت پذیری فراهم می کند. یک موضوع جزئی از این گزینه های می تواند در راهنمای فلکس یافت شود.

استفاده تحت محیط غیر یونیکسی[ویرایش]

به صورت نرمال، اسکنر تولید شده شامل ارجاعاتی به هدرفایل unistd.h می شود که خاص یونیکس است. برای پرهیز از تولید کد که شامل unistd.h می شود، باید از %option استفاده کرد. موضوع دیگر، فراخوانی isatty است که در کد تولید شده یافت می شود.

استفاده در زبان‌های دیگر[ویرایش]

فلکس تنها می تواند کد را برایC و C++ تولید کند. برای استفاده از اسکنر کد تولید شده توسط فلکس در دیگر زبان ها، ابزار انقیاد زبان مانند SWIG نیاز است.


منابع[ویرایش]