لکس: تفاوت میان نسخهها
محتوای حذفشده محتوای افزودهشده
جز ویرایش به وسیلهٔ ابزار خودکار ابرابزار |
بدون خلاصۀ ویرایش |
||
خط ۶:
== ساختار یک فایل Lex ==
ساختار یک فایل Lex عمدا شبیه به یک فایل Yacc است. فایلها به سه بخش تقسیم میشوند که هر بخش با
''بخش تعریف''
%%
''بخش قواعد''
%%
''بخش کد زبان C''
** ''قسمت تعریف(definition section)''، جایی برای تعریف ماکروها و وارد کردن فایلهای سرآمدی (header) است که به زبان C نوشته شدهاند. همچنین امکان اینکه هر کدی از زبان C را در اینجا بنویسید، وجود دارد، و این کد بصورت کلمه به کلمه، در کد اصلی تولید شده خواهد آمد.
** ''قسمت قواعد(rules section)''، مهمترین بخش است که الگو ها (عبارات منظم ساده) را با استفاده از دستورات زبان C با هم مرتبط میسازد. زمانی که لکسر، متون را از ورودی میگیرد، الگوی معینی را برایشان مشخص میکند و کد (به زبان C) مرتبط با آن الگو را نیز اجرا میکند. و این چرخهٔ اصلی فعالیت Lex میباشد.
** ''قسمت کد زبان C (C code section)''، شامل دستورات و توابع کد زبان C است که کلمه به کلمه به فایل سورس تولید شده، اضافه میشود. احتمالاً این دستورات حاوی کدهایی هستند که در قسمت قواعد، توسط قواعد مختلف، فراخوانی میگردند. بهتر است که در برنامههای بزرگ، این بخش بطور جداگانه در یک فایل دیگر قرار بگیرد و در زمان کامپایل، به فایل اصلی اضافه شود.
سطر ۲۲ ⟵ ۲۰:
== مثالی از فایل Flex ==
در ادامه یک فایل Lex از ویرایش Flex میآید. که یک رشتهای از اعداد صحیح را از ورودی، تشخیص داده و در خروجی نمایشش میدهد:
<pre>/*** Definition section ***/
%{
/* C code to be copied verbatim */
#
%}
/* This tells flex to read only one input file */
%option noyywrap
%%
/*** Rules section ***/
/* [0-9]+ matches a string of one or more digits */
[
/* 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;
}</pre>
اگر رشته ورودی به Flex ارسال شود، آنرا به فایل C (lex.yy.c) تبدیل میکند. و به فایل قابل اجرا، کامپایل میشود که رشتهای از اعداد صحیح را تشخیص داده و در خروجی نمایش میدهد. بهعنوان مثال اگر رشتهٔ زیر را بهعنوان ورودی بدهیم:
abc123z.!&*2gj6
برنامه، خروجی زیر را خواهد داشت:
Saw an integer:
Saw an integer:
Saw an integer:
== استفاده از Lex به همراه Yacc ==
سطر ۷۷ ⟵ ۶۸:
مزیت ساختن، برای حفظ و نگهداری برنامههایی است که شامل Lex هستند. سازنده هر فایلی را که دارای پسوند.l باشد را فایل سورس Lex در نظر میگیرد. و چنین فایلی را بهعنوان فایلی که باید به فایل مقصد تبدیل شود، میشناسد.
بطور مثال اجازه دهید تا فایلی با نام ex.l و فایل قابل اجرای EXE را در خروجی داشته باشیم. روش معمول بصورت زیر است:
{{
$>lex ex.l <return>
{{پایان چپچین}}
شما فایلی با نام lex.yy.c را خواهید داشت.
{{چپچین}}
$>gcc -o EXE lex.yy.c -ll (or -lfl) <return>
{{پایان چپچین}}
با این روش ما فایل EXE را تهیه میکنیم.
{{چپچین}}
EXE: ex.o
<tab>gcc -o EXE ex.o –ll
{{پایان چپچین}}
قبل از تعریفات سازنده، <tab> مورد نیاز میباشد. یعنی در هر زمان فقط سازنده اجرا میشود:
{{چپچین}}
$> make <return>
{{پایان چپچین}}
این کار در اینجا بسیار سریع انجام شد اما اگر شما به ۱۰ فایل برای کامپایل، نیاز داشته باشید، آنگاه این روش واقعا مفید خواهد بود.
|