Jump to content

Recommended Posts

j'ai programmé un analyseur lexiacal pour une requette en sql,et je vx au plus vite possible son analyseur syntaxique ,le programme d'un analyseur lexical que j'ai fais est le suivant:

 

#include

#include

#include

#include

typedef struct

{

char *type;

int ind;

** unite;

unite resultat[50];

int nbid,nblex,k;

char *id[50];

char *key[10];

char sep[5];

char *lex,*req;

int test(char u)

{

if((u>='a')&&(u<='z')) return 1;

if((u>='0')&&(u<='9')) return 2;

if((u==',')||(u==';')||(u=='(')||(u==')')) return 3;

if((u==' ')) return 4;

**

int iskey(char *u)

{

int i;

for(i=0;i<3;i++)

if(strcmp(u,key)==0) return i;

return -1;

**

char *add(char *s1,char c)

{

char *s=(char *)malloc(10* sizeof(char));

sprintf(s,"%s%c",s1,c);

return s;

**

int isid(char *u)

{

int i;

for(i=0;i

if(strcmp(u,id)==0) return i;

return -1;

**

int issep(char u)

{

int i;

for(i=0;i<3;i++)

if(u==sep) return i;

return -1;

**

void main()

{

clrscr();

key[0]="create";

key[1]="table";

key[2]="select";

sep[0]='(';

sep[1]=')';

sep[2]=',';

gets(req);

k=0;

nbid=0;

nblex=0;

while(k

{

switch(test(req[k]))

{

case 1:lex="";

while((test(req[k])==1)||(test(req[k])==2)) {lex=add(lex,req[k]);k++;**

k--;

printf("%s \n",lex);

if(iskey(lex)>=0)

{

resultat[nblex].type="key";

resultat[nblex].ind=iskey(lex);

nblex++;

**

else if(isid(lex)>=0)

{

resultat[nblex].type="id";

resultat[nblex].ind=isid(lex);

nblex++;

**

else

{

id[nbid]=lex;

resultat[nblex].type="id";

resultat[nblex].ind=nbid;

nbid++;

nblex++;

**

break;

case 2: lex="";

while(test(req[k])==2) {lex=add(lex,req[k]);k++;**

k--;

printf("%s\n",lex);

resultat[nblex].type="const";

resultat[nblex].ind=-1;

nblex++;

break;

case 3:

printf("%c\n",req[k]);

resultat[nblex].type="sep";

resultat[nblex].ind=issep(req[k]);

nblex++;

break;

case 4:printf("space\n");

break;

default: printf("erreur");

**

k++;

**

for(int h=0;h

getch();

**

merci !!

Link to post
Share on other sites

j'ai pas trop suivi ton problème ... à partir de ton analyseur tu peux introduire des règles syntaxiques (sauvagardées dans un fichier) et les utiliser tout simplement. il faudrait détailler ton problème :)

Link to post
Share on other sites
Merci pourquoi ?

Moi qui suis dans l'informatique j'ai rien compris a ton post...

 

il a défini un programme qui peut reconnaitre les mots clefs SQL sauf qu'il ne peut pas vérifié par l'exemple l'ordre. en gros, il veut peut être un programme qui fait ça :D

Link to post
Share on other sites
  • 6 months later...



#include  
#include 
#include 
#include 
typedef struct 
{ 
char *type; 
int ind; 
** unite; 
unite resultat[50]; 
int nbid,nblex,k; 
char *id[50]; 
char *key[10]; 
char sep[5]; 
char *lex,*req; 
int test(char u) 
{ 
if((u>='a')&&(u<='z')) return 1; 
if((u>='0')&&(u<='9')) return 2; 
if((u==',')||(u==';')||(u=='(')||(u==')')) return 3; 
if((u==' ')) return 4; 
** 
int iskey(char *u) 
{ 
int i; 
for(i=0;i<3;i++) 
if(strcmp(u,key[i])==0) return i; 
return -1; 
** 
char *add(char *s1,char c) 
{ 
char *s=(char *)malloc(10* sizeof(char)); 
sprintf(s,"%s%c",s1,c); 
return s; 
** 
int isid(char *u) 
{ 
int i; 
for(i=0;iif(strcmp(u,id[i])==0) return i; 
return -1; 
** 
int issep(char u) 
{ 
int i; 
for(i=0;i<3;i++) 
if(u==sep[i]) return i; 
return -1; 
** 
void main() 
{ 
clrscr(); 
key[0]="create"; 
key[1]="table"; 
key[2]="select"; 
sep[0]='('; 
sep[1]=')'; 
sep[2]=','; 
gets(req); 
k=0; 
nbid=0; 
nblex=0; 
while(k{ 
switch(test(req[k])) 
{ 
case 1:lex=""; 
while((test(req[k])==1)||(test(req[k])==2)) {lex=add(lex,req[k]);k++;** 
k--; 
printf("%s \n",lex); 
if(iskey(lex)>=0) 
{ 
resultat[nblex].type="key"; 
resultat[nblex].ind=iskey(lex); 
nblex++; 
** 
else if(isid(lex)>=0) 
{ 
resultat[nblex].type="id"; 
resultat[nblex].ind=isid(lex); 
nblex++; 
** 
else 
{ 
id[nbid]=lex; 
resultat[nblex].type="id"; 
resultat[nblex].ind=nbid; 
nbid++; 
nblex++; 
** 
break; 
case 2: lex=""; 
while(test(req[k])==2) {lex=add(lex,req[k]);k++;** 
k--; 
printf("%s\n",lex); 
resultat[nblex].type="const"; 
resultat[nblex].ind=-1; 
nblex++; 
break; 
case 3: 
printf("%c\n",req[k]); 
resultat[nblex].type="sep"; 
resultat[nblex].ind=issep(req[k]); 
nblex++; 
break; 
case 4:printf("space\n"); 
break; 
default: printf("erreur"); 
** 
k++; 
** 
for(int h=0;hgetch(); 

 

voila c son code

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Répondre

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...