PDA

View Full Version : طراحی کامپایلر !



Developer Programmer
دوشنبه 23 خرداد 1384, 21:12 عصر
برنامه ای که یک رشته و یک گرامر را دریافت کند و اطلاع دهد که آیا این رشته توسط این گرامر قابل تولید است یا خیر ! :kaf:
احتراما استاد مربوطه فرموده اند که خیلی راحته ! حال آنکه ... :D

Delphi Skyline
دوشنبه 23 خرداد 1384, 22:02 عصر
برنامه ای که یک رشته و یک گرامر را دریافت کند و اطلاع دهد که آیا این رشته توسط این گرامر قابل تولید است یا خیر !
احتراما استاد مربوطه فرموده اند که خیلی راحته ! حال آنکه ...
اگه خواستی به من PM بزن کمکت می کنم !

مهدی
دوشنبه 23 خرداد 1384, 23:28 عصر
برای اینکه ببینی کمه کدش رو همیجا برات میزنم! :موفق:

#define MAX_LEN 80
#define MAX_LAW 20

#include <string.h>
#include <iostream.h>
#include <fstream.h>

struct law_type
{
char variable;
char production[MAX_LEN+1];
};


law_type laws[MAX_LAW];
int law_n;
char start_symbol[2];
char main_str[MAX_LEN];

void read_data()
{
ifstream fin("G:\\LAWS.TXT");
int i;
char tmp;
fin>>law_n;
fin>>start_symbol;
for(i=0;i<law_n;i++)
{
fin>>laws[i].variable;
fin>>tmp>>tmp;
fin.getline(laws[i].production,MAX_LEN);
}
fin.close();
}

int is_variable(char ch)
{
return (ch>='A'&&ch<='Z');
}

int match(char s[])
{
int i;
for(i=0; s[i] && (!is_variable(s[i])) && (s[i]==main_str[i]) ;i++);
if(s[i] && is_variable(s[i]))
return 1;
return 0;
}

int find_variable(char s[])
{
int i;
for(i=0;s[i]&&!is_variable(s[i]);i++);
if(s[i]==0)return -1;
return i;
}

void replace_variable(char source[],int v,char target[],int law)
{
int i,j;
for(i=0;i<v;i++)
target[i]=source[i];
for(j=0;laws[law].production[j];j++,i++)
target[i]=laws[law].production[j];
for(j=v+1;source[j];j++,i++)
target[i]=source[j];
target[i]=0;
}

int parse(char s[])
{
char ch,tmp_str[MAX_LEN+1];
int i,x;

if(strcmp(s,main_str)==0)
return 1;

x=find_variable(s);
if(x==-1)
return 0;
if(!match(s))
return 0;

ch=s[x];
for(i=0;i<law_n;i++)
{
if(laws[i].variable==ch)
{
replace_variable(s,x,tmp_str,i);
if(parse(tmp_str))return 1;
}
}
return 0;
}

int main()
{
read_data();

cin.getline(main_str,MAX_LEN);
while(strcmp(main_str,"q")!=0)
{
if(parse(start_symbol))
cout<<"Exists"<<endl;
else
cout<<"Doesn't Exist"<<endl;
cin.getline(main_str,MAX_LEN);
}

return 0;
}


ضمنا فایل قوانین گرامر هم که اسمش laws.txt بوده باید چیزی شبیه این باشه:

7
S
S->aSb
S->
S->ABA
A->aA
A->a
B->bB
B->

Developer Programmer
دوشنبه 23 خرداد 1384, 23:59 عصر
خوب من یه تست کنم بعد نتیجه رو عرض کنم
فقط یه نکته که استاد فرموده بودند ... باید پارس بشه و جدول طراحی بشه و Syntax و این چیزها تست بشن ها!

Delphi Skyline
سه شنبه 24 خرداد 1384, 10:22 صبح
خوب من یه تست کنم بعد نتیجه رو عرض کنم
فقط یه نکته که استاد فرموده بودند ... باید پارس بشه و جدول طراحی بشه و Syntax و این چیزها تست بشن ها!
من که گفتم . کامل می تونم راهنماییت کنم .

Developer Programmer
سه شنبه 24 خرداد 1384, 19:34 عصر
مهرداد جان عزیزم
مبحث کامپایلرها که در کارشناسی تدریش میشه فراتر از این صحبت ها است والا من هم تمام آنچه که در PM نوشته بودید رو میدونستم.
بحث Lexical و Syntax و Semantic ...

Delphi Skyline
سه شنبه 24 خرداد 1384, 20:56 عصر
مهرداد جان عزیزم
مبحث کامپایلرها که در کارشناسی تدریش میشه فراتر از این صحبت ها است والا من هم تمام آنچه که در PM نوشته بودید رو میدونستم.
بحث Lexical و Syntax و Semantic ...
خوب من که گفتم .
اگر می خوای ادامه بدم بگو وگرنه .

Delphi_Developer
شنبه 28 خرداد 1384, 19:54 عصر
---
اینقدر چرت و پرت ننویس
Edited