# مهندسی نرم افزار > مباحث مرتبط با مهندسی نرم‌افزار > الگوریتم، کامپایلر، هوش مصنوعی و ساختمان داده ها >  برنامه های lex و yacc چیستند و چگونه می توان با آن کار کرد

## hassan_kahrizy

بسمه تعالی
با سلام
من باید اسکنر پاسکال رو با lexبنویسم 
می شه یک توضیح در باره lexبدهید و آیا تحت ویندوز وهم هست
در سایت هر چه گشتم موردی که کمکم کنه نبود
لطفا دوستانی که اطلاع دارند توضیح بدهند
با تشکر

----------


## Nima2006

برنامه lex یک مولد خودکار lexical analyser هستش که تحت خانواده یونیکس کار میکنه ولی واریانت های مختلفی تحت ویندوز هم داره!
به این لینک ها یک نگاهی بندازید:
http://www.bumblebeesoftware.com/
http://www.scl.com/products/mks/datasheets/ly.html

----------


## hassan_kahrizy

بسمه تعالی
با سلام
خیلی ممنون
می شه درباره نحوه کار این برنامه توضیح بدید
با تشکر

----------


## Nima2006

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

----------


## SeyyedKarim

همانطوریکه دوستان گفتند 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

----------


## oracle_2007

سلام دوستان 
من میخواستم یه برنامه نوشته شده با C یا پاسکال رو به lex&yacc بدم و اونو کامپایل کنم
میشه لطف کنین یه توضیح بدین باید چیکار کنم ؟ ممنون میشم .

----------


## KavehAlvand

سلام
این برنامه 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

اینم فایل برنامه l.

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

----------


## animove

سلام 
من یک flex میخوام که با #C کار کنه
اگه سراغ داریئ لینکش رو بگذارید.

----------


## atefeh_kh

> همانطوریکه دوستان گفتند 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
> ...


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

----------


## d_iran

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


 


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

----------


## d_iran

> همانطوریکه دوستان گفتند 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
> ...


 


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

----------


## BOB

سلام

بنده قبلا کد کامل آن را برای گرامر c تهیه کرده ام. میتوانید از آن استفاده بفرمایید:
گرامر c با lex  و yacc

----------


## feature

سلام
من از نرم افزار 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

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

----------


## feature

سلام
من از نرم افزار 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

آیا نسخه ای از Lex و Yacc برای تولید کد سی شارپ یا پایتون یا جاوا وجود داره ؟

----------


## queenel65

سلام خسته نباشید
من کد تگهای html با bison رو میخام میتونید کمکم کنید

----------


## arash75

حالا command prompt رو باز کن و دستورات زیر رو بنویس
c:\lex> set rootdir=. c:\lex> lex -l -o a.l a.c

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

----------


## مهسا ستایش

میشه یه کم بیشتر در مورد flexتوضیح بدید درواقع وقتی توی commond همون خطی را که نوشتیم باید چی کار کنیم اخه من هیچی بلد نیستم وواقعا بهش نیاز دارم ممنون میشم اگه راهنماییم کنید

----------


## marziehm869

سلام من هم تحلیلگر نحوی درست کردم هم لغوی
حالا باید این دو تارو با یک تابع به هم ربط بدم و کامپایلر رو درست کنم اما نمیشه!!!
par_tab.cوlex.yy.c
چطور بهم لینکشون کنم!! :خیلی عصبانی:  :خیلی عصبانی:

----------


## marziehm869

رهنمای فارسی خوبه تقریبا مرسی،
مثلا یه جا گفته با یک تابع main به هم لینک کنید،گفته اگر main , yywrapرو دارید include رو بردارید،من همه این کار ها رو کردم ارور میده!!!
چطوری به هم لینکشون کنم،در واقع مرحله 3 رو نمیفهمم!!

----------


## png_92

> میشه یه کم بیشتر در مورد flexتوضیح بدید درواقع وقتی توی commond همون خطی را که نوشتیم باید چی کار کنیم اخه من هیچی بلد نیستم وواقعا بهش نیاز دارم ممنون میشم اگه راهنماییم کنید


میتونین از این وبلاگ کمک بگیرین:
http://majidr.blog.ir/1392/12/25/%D9...2-%D8%A7%D9%86

----------


## png_92

باید تو 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 ساخته میشود.

----------

