PDA

View Full Version : برنامه های lex و yacc چیستند و چگونه می توان با آن کار کرد



hassan_kahrizy
پنج شنبه 07 اردیبهشت 1385, 16:26 عصر
بسمه تعالی
با سلام
من باید اسکنر پاسکال رو با lexبنویسم
می شه یک توضیح در باره lexبدهید و آیا تحت ویندوز وهم هست
در سایت هر چه گشتم موردی که کمکم کنه نبود
لطفا دوستانی که اطلاع دارند توضیح بدهند
با تشکر

Nima2006
پنج شنبه 07 اردیبهشت 1385, 21:26 عصر
برنامه lex یک مولد خودکار lexical analyser هستش که تحت خانواده یونیکس کار میکنه ولی واریانت های مختلفی تحت ویندوز هم داره!
به این لینک ها یک نگاهی بندازید:
http://www.bumblebeesoftware.com/
http://www.scl.com/products/mks/datasheets/ly.html

hassan_kahrizy
جمعه 08 اردیبهشت 1385, 04:44 صبح
بسمه تعالی
با سلام
خیلی ممنون
می شه درباره نحوه کار این برنامه توضیح بدید
با تشکر

Nima2006
جمعه 08 اردیبهشت 1385, 08:13 صبح
این برنامه در حقیقت یک ابزار کمکی برای برنامه نویسی به شمار میرود و به شما امکان میدهد تا کدهای C لازم برای ایجاد یک تحلیلگر لغوی را بطور اتوماتیک ایجاد کنید. نحوه عمل هم بصورت کلی بدین حالت است که شما الگوهای مورد نیاز برای شناسایی توکن ها را مشخص میکنید و پس از تبدیل شدن این کد به کد زبان C میتوانید آن را در برنامه تان بکار گیرید. البته دانستن lex در کنار دانستن یک مولد پارسر مثل Yacc مفید خواهد بود. جزئیات مفصلتر از این حرفهاست و شما را ارجاع میدهم به:
http://epaperpress.com/lexandyacc/

SeyyedKarim
سه شنبه 21 فروردین 1386, 11:46 صبح
همانطوریکه دوستان گفتند lex , yacc دو تا ابزار برای طراحی کامپایلر ها هستند . من با نسخه های flexوbisonآن ها که از lex,yacc اولیه مشتق شده اند کار کرده ام . این نرم افزار ها برای پروژه ی درس طراحی کامپایلر کاربرد دارند . امیدوارم که مورد استفاده دوستان قرار بگیرد.
سه فایل آپلود کردم که به ترتیب عبارتند از :
1.یک راهنمای انگلیسی به همراه ترجمه فارسی آن
FlexBison_Guide.zip
2.فایل های Flexو Bison(یک نسخه از lex و yacc)
FlexBiosn_File.zip
3.یک نمونه ساده برنامه های Flex و Bison(اسکنر و پارسر) برای پاسکال
pascal_parser.zip
4.همان راهنمای فارسی به فرمت pdf

امیدوارم بکار دوستان بیاد.
(در مورد راهنمای فارسی نظر بدید! )
seyyedkarim@gmail.com (https://mail.google.com/mail?view=cm&tf=0&ui=1&to=seyyedkarim@gmail.com)

oracle_2007
سه شنبه 27 فروردین 1387, 23:17 عصر
سلام دوستان
من میخواستم یه برنامه نوشته شده با C یا پاسکال رو به lex&yacc بدم و اونو کامپایل کنم
میشه لطف کنین یه توضیح بدین باید چیکار کنم ؟ ممنون میشم .

KavehAlvand
چهارشنبه 28 فروردین 1387, 23:23 عصر
سلام
این برنامه lex هستش. توی ویندوز هم کار می کنه
شما نمی تونید یک برنامه رو به lex بدید و اون برای شما کامپایل کنه.شما می تونید از lex کمک بگیرید تا کد مربوط به قسمت scanner یا همون تحلیل گر لغوی رو برای شما تولید کنه. یعنی شما عبارات منظم رو میدین و اون کد scanner رو برای شما تولید می کنه و باید از این کد در برنامه ای که دارین برای کامپایلر می نویسید استفاده کنید. مثلا کد زیر رو در یک note pad می نویسید:



%{


#define ERROR 400
#define PROGRAM 259
#define LT 260
#define LE 261
#define EQ 262
#define NE 263
#define GT 264
#define GE 265
#define IF 266
#define THEN 267
#define ELSE 268
#define ID 269
#define NUMBER 270
#define RELOP 271
#define function 272
#define procedure 273
#define begin 274
#define end 275
#define INT 276
#define REAL 277
#define WHILE 278
#define PROPEN 279
#define PRCLOSE 280
#define BROPEN 281
#define BRCLOSE 282
#define ADDOP 283
#define ASSIGNOP 284
#define SEMICOLON 285
#define JODA 286
#define DOTDOT 287
#define OF 288
#define TWODOT 289
#define INTEGER 290
#define ARRAY 291
#define MULOP 292
#define OPMUL 293
#define OPDIVCAST 294
#define OPDIV 295
#define OPMOD 296
#define OPAND 297
#define OPSUM 298
#define OPDIF 299
#define OPOR 300
#define ASSOP 301
#define VAR 302
#define DO 303
#define NOT 304
int line=0;
int yyval;
FILE *in;
FILE *out;
%}
delim [\t\n ]
ws {delim}+
digit [0-9]
letter [a-zA-Z]
digits [0-9]+
id {letter}({letter}|{digit})*
sign [+-]
opt_fraction (\.{digits})?
opt_exponent (E({sign})?{digits})?
num {digits}{opt_fraction}{opt_exponent}

%%
{delim} {if (yytext[0]=='\n') line++;}
program {return PROGRAM;}
begin {return begin;}
end {return end;}
function {return function;}
procedure {return procedure;}
\{(.)*\} { /* ignore whitespace */}
";" {return SEMICOLON;}
"," {return JODA;}
\.\. {return DOTDOT;}
[0-9]+ {return INT;}
[0-9]*\.[0-9]+ {return REAL;}
{num} {return NUMBER;}
while {return WHILE;}
if {return IF;}
then {return THEN;}
else {return ELSE;}
of {return OF;}
do {return DO;}
real {return REAL;}
array {return ARRAY;}
integer {return INTEGER;}
var {return VAR;}
not {return NOT;}

"*" {yyval=OPMUL;return MULOP;}
"/" {yyval=OPDIVCAST;return MULOP;}
"mod" {yyval=OPMOD;return MULOP;}
"div" {yyval=OPDIV;return MULOP;}
"and" {yyval=OPAND;return MULOP;}
"+" {yyval=OPSUM;return ADDOP;}
"-" {yyval=OPDIF;return ADDOP;}
"or" {yyval=OPOR;return ADDOP;}
":=" {yyval=ASSOP;return ASSIGNOP;}
"<" {yyval=LT;return RELOP;}
">" {yyval=GT;return RELOP;}

">=" {yyval=GE;return RELOP;}
"<=" {yyval=LE;return RELOP;}

"=" {yyval=EQ;return RELOP;}
"<>" {yyval=NE;return RELOP;}
"(" {yyval=PROPEN;return PROPEN;}
")" {yyval=PRCLOSE;return PRCLOSE;}
"*" {yyval=OPMUL;return MULOP;}
"[" {yyval=PROPEN;return BROPEN;}
"]" {yyval=PRCLOSE;return BRCLOSE;}
":" {return TWODOT;}

{id} {return ID;}
. {return ERROR;}
%%

int yywrap(void){
return 1;
}
int yt_getc(void){
return (getc(in));
}
void main (){
int token;
in=fopen("c:\\test.txt","r");
out=fopen("c:\\ret_test.txt","w");
while( (token=yylex() ) !=0)
switch(token){
case RELOP: fprintf(out,"RELOP\n");break;
case PROGRAM: fprintf(out,"Program\n");break;
case begin: fprintf(out,"begin\n ");break;
case end: fprintf(out,"end\n");break;
case function: fprintf(out,"function\n");break;
case procedure: fprintf(out,"procedure\n");break;
case INT: fprintf(out,"int\n");break;
case REAL: fprintf(out,"real\n");break;
case ID: fprintf(out,"id\n");break;
case NUMBER: fprintf(out,"number\n");break;
case IF: fprintf(out,"if\n");break;
case THEN: fprintf(out,"then\n");break;
case ELSE: fprintf(out,"else\n");break;
case WHILE: fprintf(out,"while\n");break;
case ADDOP: fprintf(out,"addop\n",yyval);break;
case ASSIGNOP: fprintf(out,"assignop\n");break;
case PROPEN: fprintf(out,"(\n");break;
case PRCLOSE: fprintf(out,")\n");break;
case BROPEN: fprintf(out,"[\n");break;
case BRCLOSE: fprintf(out,"]\n");break;
case SEMICOLON: fprintf(out,";\n");break;
case JODA: fprintf(out,",\n");break;
case DOTDOT: fprintf(out,"..\n");break;
case TWODOT: fprintf(out,":\n");break;
case INTEGER: fprintf(out,"integer\n");break;
case OF: fprintf(out,"of\n");break;
case DO: fprintf(out,"do\n");break;
case ARRAY:fprintf(out,"array\n");break;
case VAR:fprintf(out,"var\n");break;
case MULOP:fprintf(out,"MULOP\n");break;
case ERROR:fprintf(out,"\n %s%d","lexical ERROR at line: ",line);break;
}
}


این فایل رو با پسوند l. ذخیره می کنی و در فولدر برنامه lex که گفتم قرار میدی. فرض می کنیم که شما فولدر lex رو در درایو c قرار دادی. حالا command prompt رو باز کن و دستورات زیر رو بنویس

c:\lex> set rootdir=. c:\lex> lex -l -o a.l a.c

اسم فایل a گذاشتم.فایل کد بالا رو attach کردم
حالا lex یک فایل با پسوند c تولید می کنه که همون scanner هست. اون کد رو با c اجرا کنی. توی main برنامه یک فایل test رو باز می کنه که اگه توش مثلا 12 نوشته باشی برات توی فایل ret_test که تولید می کنه INT بر می گردونه. یعنی توکن هایی که بالای کد تعریف کردم رو می تونه بر گردونه.مثلا if رو IF بر می گردونه. تازه این شد فاز اول
فاز بعدی هم از لحاظ نحو که می تونی از yacc کمک بگیری یا اینکه جدول پارزپارز درست کنی و خودت کد بنویسی. ولی هیچ کدوم از این برنامه ها کد ماشین تولید نمی کنه

KavehAlvand
چهارشنبه 28 فروردین 1387, 23:31 عصر
اینم فایل برنامه l.

فایل v هم کدی که lex تولید کرده. البته برای اینکه کار کنه باید این کد رو خط اول کد c اضافه کنی

define YYTRACE#

animove
پنج شنبه 25 مهر 1387, 17:00 عصر
سلام
من یک flex میخوام که با #C کار کنه
اگه سراغ داریئ لینکش رو بگذارید.

atefeh_kh
شنبه 30 آذر 1387, 06:37 صبح
همانطوریکه دوستان گفتند lex , yacc دو تا ابزار برای طراحی کامپایلر ها هستند . من با نسخه های flexوbisonآن ها که از lex,yacc اولیه مشتق شده اند کار کرده ام . این نرم افزار ها برای پروژه ی درس طراحی کامپایلر کاربرد دارند . امیدوارم که مورد استفاده دوستان قرار بگیرد.
سه فایل آپلود کردم که به ترتیب عبارتند از :
1.یک راهنمای انگلیسی به همراه ترجمه فارسی آن
FlexBison_Guide.zip
2.فایل های Flexو Bison(یک نسخه از lex و yacc)
FlexBiosn_File.zip
3.یک نمونه ساده برنامه های Flex و Bison(اسکنر و پارسر) برای پاسکال
pascal_parser.zip
4.همان راهنمای فارسی به فرمت pdf

امیدوارم بکار دوستان بیاد.
(در مورد راهنمای فارسی نظر بدید! )
seyyedkarim@gmail.com (https://mail.google.com/mail?view=cm&tf=0&ui=1&to=seyyedkarim@gmail.com)
my weblog:(قابل توجه علاقمندان سی شارپ)
http://www.csharp-fun.persianblog.ir (http://www.csharp-fun.persianblog.ir/)
سایت فروش بلیط اتوبوس استان مازندران
http://www.fbt.ir (http://www.fbt.ir/)


سلام
این لینک ها کمک خوبی برای پروژه کامپایلرم بودن
متشکرم
:تشویق: :لبخندساده:

d_iran
شنبه 22 اسفند 1388, 11:11 صبح
اینم فایل برنامه l.

فایل v هم کدی که lex تولید کرده. البته برای اینکه کار کنه باید این کد رو خط اول کد c اضافه کنی


define YYTRACE#





کسی کامپایلر lex داره ؟؟؟؟؟؟؟؟؟؟؟؟؟؟

d_iran
شنبه 01 خرداد 1389, 20:10 عصر
همانطوریکه دوستان گفتند lex , yacc دو تا ابزار برای طراحی کامپایلر ها هستند . من با نسخه های flexوbisonآن ها که از lex,yacc اولیه مشتق شده اند کار کرده ام . این نرم افزار ها برای پروژه ی درس طراحی کامپایلر کاربرد دارند . امیدوارم که مورد استفاده دوستان قرار بگیرد.
سه فایل آپلود کردم که به ترتیب عبارتند از :
1.یک راهنمای انگلیسی به همراه ترجمه فارسی آن
FlexBison_Guide.zip
2.فایل های Flexو Bison(یک نسخه از lex و yacc)
FlexBiosn_File.zip
3.یک نمونه ساده برنامه های Flex و Bison(اسکنر و پارسر) برای پاسکال
pascal_parser.zip
4.همان راهنمای فارسی به فرمت pdf

امیدوارم بکار دوستان بیاد.
(در مورد راهنمای فارسی نظر بدید! )
seyyedkarim@gmail.com (https://mail.google.com/mail?view=cm&tf=0&ui=1&to=seyyedkarim@gmail.com)
my weblog:(قابل توجه علاقمندان سی شارپ)
http://www.csharp-fun.persianblog.ir (http://www.csharp-fun.persianblog.ir/)
سایت فروش بلیط اتوبوس استان مازندران
http://www.fbt.ir (http://www.fbt.ir/)




می شه بگید چه جوری می تونم خروج مثالی که گذاشتید در Parser Generator ببینم ؟

BOB
دوشنبه 17 خرداد 1389, 12:07 عصر
سلام

بنده قبلا کد کامل آن را برای گرامر c تهیه کرده ام. میتوانید از آن استفاده بفرمایید:
گرامر c با lex و yacc (http://mohammadshams.blogspot.com/2009/07/parser-ansi-c-flex-yacc.html)

feature
چهارشنبه 19 خرداد 1389, 18:14 عصر
سلام
من از نرم افزار parser generator برای پروژه طراحی کامپایلر استفاده میکنم ولی تو کار باهاش مشکل دارم
فعلا قسمت تحلیلگر لغویشو دارم کار میکنم.
تو نرم افزار بعد کامپایل فایل c تولید میشه این فایلو تو boorland c++ که اجرا میکنم این خطارو میده:
Error: Error: Unresolved external '_yyreturnflg' referenced from C:\LEX\A.OBJ
Error: Error: Unresolved external '_yylex' referenced from C:\LEX\A.OBJ
اگه ممکنه منو راهنمایی کنید
باتشکر

feature
یک شنبه 27 تیر 1389, 17:08 عصر
سلام،خسته نباشید
شما چهارشنبه 28 فروردین 1387, 22:53 عصر یه توضیحاتی راجع به پرو ژه کامپایلر و نحوه ایجاد اسکنر دادید میخواستم بدونم نرم افزارش چی بوده؟ما باparser generatorاون کد رو اجرا کردیم و فایل ایجاد شده رو توی borlandc++ اجرا کردیم ولی error داد
ممنون میشم اگه جوابتونو به این آدرس sm.moradkhani@gmail.com بفرستید

feature
یک شنبه 27 تیر 1389, 17:12 عصر
سلام
من از نرم افزار parser generator برای پروژه طراحی کامپایلر استفاده میکنم ولی تو کار باهاش مشکل دارم
فعلا قسمت تحلیلگر لغویشو دارم کار میکنم.
تو نرم افزار بعد کامپایل فایل c تولید میشه این فایلو تو boorland C++‎ که اجرا میکنم این خطارو میده:
Error: Error: Unresolved external '_yyreturnflg' referenced from C:\LEX\A.OBJ
Error: Error: Unresolved external '_yylex' referenced from C:\LEX\A.OBJ
اگه ممکنه منو راهنمایی کنید
باتشکر

asefy2008
دوشنبه 28 تیر 1389, 00:47 صبح
آیا نسخه ای از Lex و Yacc برای تولید کد سی شارپ یا پایتون یا جاوا وجود داره ؟

queenel65
پنج شنبه 23 دی 1389, 20:35 عصر
سلام خسته نباشید
من کد تگهای html با bison رو میخام میتونید کمکم کنید

arash75
پنج شنبه 08 اردیبهشت 1390, 11:18 صبح
حالا command prompt رو باز کن و دستورات زیر رو بنویس
c:\lex> set rootdir=. c:\lex> lex -l -o a.l a.c

سلام من این دستور رو نوشتم ولی درست نشد اشکالم کجاست؟

مهسا ستایش
دوشنبه 01 خرداد 1391, 17:45 عصر
میشه یه کم بیشتر در مورد flexتوضیح بدید درواقع وقتی توی commond همون خطی را که نوشتیم باید چی کار کنیم اخه من هیچی بلد نیستم وواقعا بهش نیاز دارم ممنون میشم اگه راهنماییم کنید

marziehm869
پنج شنبه 06 تیر 1392, 23:31 عصر
سلام من هم تحلیلگر نحوی درست کردم هم لغوی
حالا باید این دو تارو با یک تابع به هم ربط بدم و کامپایلر رو درست کنم اما نمیشه!!!
par_tab.cوlex.yy.c
چطور بهم لینکشون کنم!!:عصبانی++::عصبانی++:

marziehm869
پنج شنبه 06 تیر 1392, 23:36 عصر
رهنمای فارسی خوبه تقریبا مرسی،
مثلا یه جا گفته با یک تابع main به هم لینک کنید،گفته اگر main , yywrapرو دارید include رو بردارید،من همه این کار ها رو کردم ارور میده!!!
چطوری به هم لینکشون کنم،در واقع مرحله 3 رو نمیفهمم!!

png_92
چهارشنبه 12 فروردین 1394, 13:00 عصر
میشه یه کم بیشتر در مورد flexتوضیح بدید درواقع وقتی توی commond همون خطی را که نوشتیم باید چی کار کنیم اخه من هیچی بلد نیستم وواقعا بهش نیاز دارم ممنون میشم اگه راهنماییم کنید

میتونین از این وبلاگ کمک بگیرین:
http://majidr.blog.ir/1392/12/25/%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-flex-%D9%88-%D9%86%D8%AD%D9%88%D9%87-%DB%8C-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%A7%D9%86

png_92
چهارشنبه 12 فروردین 1394, 13:11 عصر
باید تو command اینطوری عمل کرد:

اول برین به محلی که flex رو نصب کردین تو پوشه bin ینی اینطوری : C:\user\png\flex\bin یا هرجاکه خودتون نصب کردین
بعد که فایل با پسوند .l (فایل a.l)رو ساختین و گرامرو توش گذاشتین باید lex.yy.c رو اینطوری تو همون محل بسازین : flex a.l
حالا باید lex.yy.c رو کامپایل کرد. بادستور cl lex.yy.c که فایل اجرایی درکنار فایل c ساخته میشود.