Lex & Yacc

neda_eng

عضو جدید
کاربر ممتاز
lex و yacc دو ابزار برای طراحی کامپایلر ها هستند . برنامهLex در حقیقت یک ابزار کمکی برای برنامه نویسی به شمار میرود و به شما امکان میدهد تا کدهای C لازم برای ایجاد یک تحلیلگر لغوی را بطور اتوماتیک ایجاد کنید.
نحوه عمل هم بصورت کلی بدین حالت است که شما الگوهای مورد نیاز برای شناسایی توکن ها را مشخص میکنید و پس از تبدیل شدن این کد به کد زبان C میتوانید آن را در برنامه تان بکار گیرید.

Lex
– تولید کد C برای تحلیل گر لغوی
Generates C code for the lexical analyzer (scanner)
– تشخیص نقش نشانه ها با عبارات منظم
Token patterns specified by regular expressions
Yacc
- تولید کد C برای تحلیل گر نحوی (LR(1
Generates C code for a LR(1) syntax analyzer (parser)
- قانون های BNF برای گرامر
BNF rules for the grammar
BNF :قرارداد ثبت شده اى که براى توضيح نحو يک زبان برنامه نويسى استفاده مى شود.
Lex می تواند رشته ی دلخواهی از ورودی را بگیرد وهر قسمت از آن را تشخیص دهد ونشانه گذاری کند.واین دقیقا چیزی هست که برای ورودی Yacc لازم میباشد.
تحلیل گر مانند تابعی هست که رشته ای از کاراکتر ها را به عنوان ورودی میگیرد که هر موقع کاراکتر های ورودی با کلید های تعریف شده در آن مطابقت داشته باشند عمل خاصی را انجام میدهد.
فایل را در notepad با پسوند l. و با نام Example ذخیره می کنید و در فولدر برنامه lex قرار میدهید. فرض می کنیم که شما فولدر lex رو در درایو c قرار دادید. دستورات زیر رو در command prompt بنویسید:
c:\lex> set rootdir=. c:\lex> lex -l -o Example.l Example.c
حالا lex یک فایل با پسوند c تولید می کند که scanner هست. کد را با c اجرا کنید. در main برنامه یک فایل test را باز می کند که اگر مثلا در داخل فایل12 نوشته باشید در فایل ret_test که تولید می کند که NUMBER را بر می گرداند.
Yacc می تواند رشته ای از نشانه ها را با مقدار های مشخص ترجمه کند.واین ارتباط بین Yacc وLex را به طور واضح نشان میدهد.
به عنوان مثال اگه بخواهیم یک دستگاه تنظیم حرارت ساده (ترموستات) رو با یک زبان ساده کنترل کنیم به صورت زیر عمل می کنیم.​

نشانه های مورد نیاز برای lex file​
,number, heat on/of(STATE),target , temperature

Lex tokenizer
%{
#include
#include "y.tab.h"
%}
%%
;[0-9]+ return NUMBER
;heat return TOKHEAT;
;on|off return STATE;
;target return TOKTARGET;
;temperature return TOKTEMPERATURE;
\n /* ignore end of line */;
[ \t]+ /* ignore whitespace */;
%%

Yacc File
commands: /* empty */
| commands command
;
command:
heat_switch
|
target_set
;
heat_switch:
TOKHEAT STATE
{
printf("\tHeat turned on or off\n");
}
;
target_set:
TOKTARGET TOKTEMPERATURE NUMBER
{
printf("\tTemperature set\n");
}
;
نمونه ای از خروجی رو نشون میه که اگه کار بر heat on رو وارد کنه برنامه Heat turned on or off رو بر می گردونه.​
$ ./example4
heat on
Heat turned on or off
heat off
Heat turned on or off
target temperature 10
Temperature set
target humidity 20
error: parse error
$
برنامه lex یک مولد خودکار lexical analyser هست که تحت خانواده یونیکس کار میکند ولی واریانت های مختلفی تحت ویندوز نیز دارد.
اگه علاقه مند شدید می تونید کل فایل رو از لینک پایین دانلود کنید .اینجا فقط خلاصه ای از اون رو دیدید.امیدوارم که خوشتون اومده باشه.​
 
بالا