Compilateur symtaxique c

Bonjour,
je vx au plus vite possible le compilateur syntaxique pr se programe c suivant qui est un compilateur lexical :
#include <stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
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;i<nbid;i++)
if(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<strlen(req))
{
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<nblex;h++) printf("%s: %d\n",resultat[h].type,resultat[h].ind);
getch();
}
Configuration: Windows XP
Internet Explorer 6.0

7 réponses

  1. Modérateur
    je vx au plus vite possible le compilateur syntaxique pr se programe c suivant qui est un compilateur

    Sinon...?
    0
    1. je vx un programme c pr un compilateur syntaxique ,parceque j'ai programmé le compilateur lexical suivant et je vx le syntaxique au plus vite possible et merci ,le programme du compilateur lexical et le suivant :
      #include <stdio.h>
      #include<string.h>
      #include<conio.h>
      #include<stdlib.h>
      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;i<nbid;i++)
      if(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<strlen(req))
      {
      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<nblex;h++) printf("%s: %d\n",resultat[h].type,resultat[h].ind);
      getch();
      }
      0
      1. Modérateur
        Je ne comprends pas bien. Tu veux quoi en fait, du code Sql ou? Parce qu'apparemment c'est un analyseur syntaxique pour du Sql...
        0
        1. oui exactement c pour le sql,mais un programme écris en language C comme j'ai programmé moi, si tu me comprend pas passe moi ton adresse msn pour te parlé diréctement, parceque c'est vraiment urgent et merci bcp bcp bcp ...
          0
          1. Modérateur
            Ben j'ai jamais fait d'analyseur syntaxique alors je peux pas trop t'aider....
            0
            1. méme avec un programme similaire a celui que j'ai programmé ,vous pouvez pas m'aider !!,vous etes le seul qui peux m'aider,alors svp,donne moi juste se que tu trouve,svp,et merci bcp
              0