سلام
این برنامه 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 کمک بگیری یا اینکه جدول پارزپارز درست کنی و خودت کد بنویسی. ولی هیچ کدوم از این برنامه ها کد ماشین تولید نمی کنه