بسمه تعالی
با سلام
من باید اسکنر پاسکال رو با lexبنویسم
می شه یک توضیح در باره lexبدهید و آیا تحت ویندوز وهم هست
در سایت هر چه گشتم موردی که کمکم کنه نبود
لطفا دوستانی که اطلاع دارند توضیح بدهند
با تشکر
بسمه تعالی
با سلام
من باید اسکنر پاسکال رو با lexبنویسم
می شه یک توضیح در باره lexبدهید و آیا تحت ویندوز وهم هست
در سایت هر چه گشتم موردی که کمکم کنه نبود
لطفا دوستانی که اطلاع دارند توضیح بدهند
با تشکر
برنامه lex یک مولد خودکار lexical analyser هستش که تحت خانواده یونیکس کار میکنه ولی واریانت های مختلفی تحت ویندوز هم داره!
به این لینک ها یک نگاهی بندازید:
http://www.bumblebeesoftware.com/
http://www.scl.com/products/mks/datasheets/ly.html
بسمه تعالی
با سلام
خیلی ممنون
می شه درباره نحوه کار این برنامه توضیح بدید
با تشکر
این برنامه در حقیقت یک ابزار کمکی برای برنامه نویسی به شمار میرود و به شما امکان میدهد تا کدهای C لازم برای ایجاد یک تحلیلگر لغوی را بطور اتوماتیک ایجاد کنید. نحوه عمل هم بصورت کلی بدین حالت است که شما الگوهای مورد نیاز برای شناسایی توکن ها را مشخص میکنید و پس از تبدیل شدن این کد به کد زبان C میتوانید آن را در برنامه تان بکار گیرید. البته دانستن lex در کنار دانستن یک مولد پارسر مثل Yacc مفید خواهد بود. جزئیات مفصلتر از این حرفهاست و شما را ارجاع میدهم به:
http://epaperpress.com/lexandyacc/
همانطوریکه دوستان گفتند 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
آخرین ویرایش به وسیله SeyyedKarim : پنج شنبه 07 فروردین 1393 در 01:04 صبح
سلام دوستان
من میخواستم یه برنامه نوشته شده با C یا پاسکال رو به lex&yacc بدم و اونو کامپایل کنم
میشه لطف کنین یه توضیح بدین باید چیکار کنم ؟ ممنون میشم .
سلام
این برنامه 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 کمک بگیری یا اینکه جدول پارزپارز درست کنی و خودت کد بنویسی. ولی هیچ کدوم از این برنامه ها کد ماشین تولید نمی کنه
آخرین ویرایش به وسیله whitehat : پنج شنبه 29 فروردین 1387 در 02:47 صبح دلیل: استفاده از تگ کد برای خوانایی بیشتر
اینم فایل برنامه l.
فایل v هم کدی که lex تولید کرده. البته برای اینکه کار کنه باید این کد رو خط اول کد c اضافه کنی
define YYTRACE#
سلام
من یک flex میخوام که با #C کار کنه
اگه سراغ داریئ لینکش رو بگذارید.
سلام
بنده قبلا کد کامل آن را برای گرامر c تهیه کرده ام. میتوانید از آن استفاده بفرمایید:
گرامر c با lex و yacc
سلام
من از نرم افزار 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
اگه ممکنه منو راهنمایی کنید
باتشکر
سلام،خسته نباشید
شما چهارشنبه 28 فروردین 1387, 22:53 عصر یه توضیحاتی راجع به پرو ژه کامپایلر و نحوه ایجاد اسکنر دادید میخواستم بدونم نرم افزارش چی بوده؟ما باparser generatorاون کد رو اجرا کردیم و فایل ایجاد شده رو توی borlandC++ اجرا کردیم ولی error داد
ممنون میشم اگه جوابتونو به این آدرس sm.moradkhani@gmail.com بفرستید
سلام
من از نرم افزار 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
اگه ممکنه منو راهنمایی کنید
باتشکر
آیا نسخه ای از Lex و Yacc برای تولید کد سی شارپ یا پایتون یا جاوا وجود داره ؟
سلام خسته نباشید
من کد تگهای html با bison رو میخام میتونید کمکم کنید
حالا command prompt رو باز کن و دستورات زیر رو بنویس
c:\lex> set rootdir=. c:\lex> lex -l -o a.l a.c
سلام من این دستور رو نوشتم ولی درست نشد اشکالم کجاست؟
میشه یه کم بیشتر در مورد flexتوضیح بدید درواقع وقتی توی commond همون خطی را که نوشتیم باید چی کار کنیم اخه من هیچی بلد نیستم وواقعا بهش نیاز دارم ممنون میشم اگه راهنماییم کنید
سلام من هم تحلیلگر نحوی درست کردم هم لغوی
حالا باید این دو تارو با یک تابع به هم ربط بدم و کامپایلر رو درست کنم اما نمیشه!!!
par_tab.cوlex.yy.c
چطور بهم لینکشون کنم!!
رهنمای فارسی خوبه تقریبا مرسی،
مثلا یه جا گفته با یک تابع main به هم لینک کنید،گفته اگر main , yywrapرو دارید include رو بردارید،من همه این کار ها رو کردم ارور میده!!!
چطوری به هم لینکشون کنم،در واقع مرحله 3 رو نمیفهمم!!
میتونین از این وبلاگ کمک بگیرین:
http://majidr.blog.ir/1392/12/25/%D9...2-%D8%A7%D9%86
باید تو 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 ساخته میشود.