begin process at 2013 05 20 00:21:37
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > ANALYSE SYNTAXIQUE

ANALYSE SYNTAXIQUE


 Description

Cliquez pour voir la capture en taille normale
ce programme permet de mettre en oeuvre une grammaire context free de type LL(1). La grammaire traité est la célebre grammaire ETF :

E -> TE'
E' -> +TE' | -TE' | eps
T -> FT'
T' -> *FT' | /FT' | eps
F -> (E) | n

Source

  • # include <stdio.h>
  • # include <stdlib.h>
  • # include <string.h>
  • # include <ctype.h>
  • //Fonctions et varaiables du lexer
  • char Expr[200];
  • char lex[10];
  • int pos = 0;
  • char Getlex();
  • void Ungetlex();
  • //Pile d'analyse
  • //structure de donnée
  • typedef struct node {
  • char val;
  • struct node *prev;
  • }Tnode;
  • //Déclaration de la pile
  • Tnode *stack = NULL;
  • //Fonctions utilisées avec la pile
  • void Push(char);
  • void Pop();
  • void DispStack();
  • //Fonction d'analyse syntaxique
  • int Syntaxe();
  • int IsTerminal(char);
  • int Ligne(char);
  • int Col(char);
  • void Erreur(int,int);
  • int Err = 0;
  • char * matrice[5][8] = {
  • /* ( ) * + - / n $*/
  • {"TH", "-1", "-1", "-1", "-1", "-1", "TH", "-1"}, //E
  • {"(E)", "-1", "-1", "-1", "-1", "-1", "n", "-1"}, //F
  • {"-1", "!", "*FG", "!", "!", "/FG", "-1", "!"}, //G
  • {"-1", "!", "-1", "+TH", "-TH", "-1", "-1", "!"}, //H
  • {"FG", "-1", "-1", "-1", "-1", "-1", "FG", "-1"}}; //T
  • int main() {
  • Push('$');
  • Push('E');
  • system("cls");
  • printf("\n\t\t\tTaper une xepression valide .. \t");
  • gets(Expr);
  • if(Syntaxe()) printf("\n\nOk ...");
  • else printf("\n\nKo ... ");
  • // fflush(stdin); getchar();
  • return 0;
  • }
  • char Getlex(){
  • int i=0;
  • switch(Expr[pos]){
  • case '+' : case '-' : case '*': case '$':
  • case '/' : case '(' : case ')': lex[0] = Expr[pos];lex[1] = '\0';
  • pos++;
  • return Expr[pos-1];
  • default : while(isdigit(Expr[pos]) || Expr[pos] == '.')
  • lex[i++] = Expr[pos++];
  • lex[i] = '\0';
  • return 'n';
  • }
  • }
  • void Ungetlex(){
  • pos -= strlen(lex);
  • }
  • //Fonctions utilisées avec la pile
  • void Push(char c){
  • Tnode*nd = (Tnode*)malloc(sizeof(Tnode));
  • nd->val = c; nd->prev = stack;
  • stack = nd;
  • // DispStack();
  • }
  • void Pop(){
  • DispStack();
  • if(stack != NULL){
  • Tnode *tnd = stack;
  • stack = stack->prev;
  • free(tnd);
  • }
  • // DispStack();
  • }
  • //Fonction d'analyse syntaxique
  • int Syntaxe(){
  • int i,lg,ln,col;
  • char cel[4];
  • char c = Getlex();
  • while(stack->val != '$' && c != '$'){
  • if(IsTerminal(stack->val)) {
  • Pop(); printf("\tréduction");
  • if(c != '$') c = Getlex();}
  • else {
  • ln = Ligne(stack->val);
  • col = Col(c);
  • strcpy(cel,matrice[ln][col]);
  • if(!strcmp(cel,"-1")) {
  • Erreur(ln,col);
  • c = Getlex();
  • ln = Ligne(stack->val);
  • col = Col(c);
  • strcpy(cel,matrice[ln][col]);
  • }
  • if(!strcmp(cel,"!")) Pop();
  • else {
  • Pop();
  • for(i = 0 , lg = strlen(cel)-1 ; i < strlen(cel); i++)
  • Push(cel[lg--]);
  • }
  • }
  • }
  • if(!Err) return 1;
  • return 0;
  • }
  • int IsTerminal(char c){
  • if(c == 'n' || c == '+' || c == '-' ||
  • c == '*' || c == '/' || c == '(' ||
  • c == ')' || c == '$' ) return 1;
  • return 0;
  • }
  • int Ligne(char c){
  • if(c == 'E') return 0;
  • if(c == 'F') return 1;
  • if(c == 'G') return 2;
  • if(c == 'H') return 3;
  • if(c == 'T') return 4;
  • }
  • int Col(char c){
  • /* ( ) * + - / n $*/
  • if(c == '(') return 0;
  • if(c == ')') return 1;
  • if(c == '*') return 2;
  • if(c == '+') return 3;
  • if(c == '-') return 4;
  • if(c == '/') return 5;
  • if(c == 'n') return 6;
  • }
  • void Erreur(int l,int cc){
  • char c = Getlex();
  • Err = 1;
  • /* ( ) * + - / n $
  • {"TH", "-1", "-1", "-1", "-1", "-1", "TH", "-1"}, //E
  • {"(E)", "-1", "-1", "-1", "-1", "-1", "n", "-1"}, //F
  • {"-1", "!", "*FG", "!", "!", "/FG", "-1", "!"}, //G
  • {"-1", "!", "-1", "+TH", "-TH", "-1", "-1", "!"}, //H
  • {"FG", "-1", "-1", "-1", "-1", "-1", "FG", "-1"}}; //T
  • */
  • switch( l ) {
  • case 0 : case 1 : case 4 :
  • fprintf(stderr,"\nErreur 1 : nombre ou ( attendu ");
  • while( c != '(' && c != 'n' ) c = Getlex();
  • Ungetlex();
  • break;
  • case 3 :
  • fprintf(stderr,"\nErreur 2 : +,-,),$ attendu ");
  • while( c != '+' && c != '-' && c != ')' && c != '$' ) c = Getlex();
  • Ungetlex();
  • break;
  • case 2 :
  • fprintf(stderr,"\nErreur 3 : +,-,*,/,),$ attendu ");
  • while( c =='n' || c == '(' ) c = Getlex();
  • Ungetlex();
  • break;
  • }
  • }
  • void DispStack() {
  • Tnode * st = stack;
  • printf("\n");
  • while(st != NULL) {
  • printf("%c ",st->val);
  • st = st->prev;
  • }
  • }
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <ctype.h>

//Fonctions et varaiables du lexer
char Expr[200];
char lex[10];
int pos = 0;

char Getlex();
void Ungetlex();

//Pile d'analyse
//structure de donnée
typedef struct node {
        char val;
        struct node *prev;
        }Tnode;

//Déclaration de la pile
Tnode *stack = NULL;

//Fonctions utilisées avec la pile
void Push(char);
void Pop();
void DispStack();

//Fonction d'analyse syntaxique
int Syntaxe();
int IsTerminal(char);
int Ligne(char);
int Col(char);
void Erreur(int,int);
int Err = 0;

char * matrice[5][8] = {
/* (     )       *        +       -       /       n       $*/
{"TH",	"-1",	"-1",	"-1",	"-1",	"-1",	"TH",	"-1"},  //E
{"(E)",	"-1",	"-1",	"-1",	"-1",	"-1",	"n",	"-1"},  //F
{"-1",	"!",	"*FG",	"!",	"!",	"/FG",	"-1",	"!"},   //G
{"-1",	"!",	"-1",	"+TH",	"-TH",	"-1",	"-1",	"!"},   //H
{"FG",	"-1",	"-1",	"-1",	"-1",	"-1",	"FG",	"-1"}}; //T

int main() {
    Push('$');
    Push('E');
    system("cls");
    printf("\n\t\t\tTaper une xepression valide .. \t");
    gets(Expr);
    if(Syntaxe()) printf("\n\nOk ...");
    else printf("\n\nKo ... ");
//    fflush(stdin); getchar();
    return 0;
}



char Getlex(){
     int i=0;
     switch(Expr[pos]){
       case '+' : case '-' : case '*': case '$':
       case '/' : case '(' : case ')': lex[0] = Expr[pos];lex[1] = '\0';
                           pos++;
                           return Expr[pos-1];
       default : while(isdigit(Expr[pos]) || Expr[pos] == '.')
                 lex[i++] = Expr[pos++];
                 lex[i] = '\0';
                 return 'n';
     }
     }

void Ungetlex(){
     pos -= strlen(lex);
     }

//Fonctions utilisées avec la pile
void Push(char c){
     Tnode*nd = (Tnode*)malloc(sizeof(Tnode));
     nd->val = c; nd->prev = stack;
     stack = nd;
//     DispStack();
     }

void Pop(){
     DispStack();
     if(stack != NULL){
              Tnode *tnd = stack;
              stack = stack->prev;
              free(tnd);
     }
//     DispStack();
     }

//Fonction d'analyse syntaxique
int Syntaxe(){
    int i,lg,ln,col;
    char cel[4];
    char c = Getlex();
    while(stack->val != '$' && c != '$'){
         if(IsTerminal(stack->val)) {
                Pop(); printf("\tréduction");
                if(c != '$') c = Getlex();}
         else {
              ln = Ligne(stack->val);
              col = Col(c);
              strcpy(cel,matrice[ln][col]);
              if(!strcmp(cel,"-1")) {
                       Erreur(ln,col);
                       c = Getlex();
                       ln = Ligne(stack->val);
                       col = Col(c);
                       strcpy(cel,matrice[ln][col]);
                       }
              if(!strcmp(cel,"!")) Pop();
              else {
                   Pop();
                   for(i = 0 , lg = strlen(cel)-1 ; i < strlen(cel); i++)
                         Push(cel[lg--]);
                   }
              }

    }
    if(!Err) return 1;
    return 0;
}

int IsTerminal(char c){
    if(c == 'n' || c == '+' || c == '-' ||
         c == '*' || c == '/' || c == '(' ||
         c == ')' || c == '$' ) return 1;
    return 0;
    }

int Ligne(char c){
    if(c == 'E') return 0;
    if(c == 'F') return 1;
    if(c == 'G') return 2;
    if(c == 'H') return 3;
    if(c == 'T') return 4;
}

int Col(char c){
/* (     )       *        +       -       /       n       $*/
    if(c == '(') return 0;
    if(c == ')') return 1;
    if(c == '*') return 2;
    if(c == '+') return 3;
    if(c == '-') return 4;
    if(c == '/') return 5;
    if(c == 'n') return 6;
}

void Erreur(int l,int cc){
     char c = Getlex();
     Err = 1;
/* (     )       *        +       -       /       n       $
{"TH",	"-1",	"-1",	"-1",	"-1",	"-1",	"TH",	"-1"},  //E
{"(E)",	"-1",	"-1",	"-1",	"-1",	"-1",	"n",	"-1"},  //F
{"-1",	"!",	"*FG",	"!",	"!",	"/FG",	"-1",	"!"},   //G
{"-1",	"!",	"-1",	"+TH",	"-TH",	"-1",	"-1",	"!"},   //H
{"FG",	"-1",	"-1",	"-1",	"-1",	"-1",	"FG",	"-1"}}; //T
*/
       switch( l ) {
            case 0 : case  1 : case 4 :
                 fprintf(stderr,"\nErreur 1 : nombre ou ( attendu ");
                 while( c != '(' && c != 'n' )   c = Getlex();
                 Ungetlex();
                 break;
            case 3 :
                 fprintf(stderr,"\nErreur 2 : +,-,),$ attendu ");
                 while( c != '+' && c != '-' && c != ')' && c != '$' )   c = Getlex();
                 Ungetlex();
                 break;
            case 2 :
                 fprintf(stderr,"\nErreur 3 : +,-,*,/,),$ attendu ");
                 while( c =='n' || c == '(' )   c = Getlex();
                 Ungetlex();
                 break;
               }
     }

void DispStack() {
     Tnode * st = stack;
     printf("\n");
     while(st != NULL) {
              printf("%c  ",st->val);
              st = st->prev;
              }
     }

 Conclusion

char * matrice[5][8] = {
/* (     )       *        +       -       /       n       $*/
{"TH", "-1", "-1", "-1", "-1", "-1", "TH", "-1 "},  //E
{"(E)", "-1", "-1", "-1", "-1", "-1", "n", "-1 "},  //F
{"-1", "!", "*FG", "!", "!", "/FG", "-1", "!"} ,   //G
{"-1", "!", "-1", "+TH", "-TH", "-1", "-1", "! "},   //H
{"FG", "-1", "-1", "-1", "-1", "-1", "FG", "-1 "}}; //T

j'attend vos commentaires

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture SCANNER FLEX
Source avec Zip Source avec une capture GENERE BMP
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE
Source avec Zip SCANNER LANGAGE

 Sources de la même categorie

Source avec Zip Source avec une capture FONCTIONS EN ACTION par ringo73
CALCUL DE PI AVEC LA BIBLIOTHÈQUE GMP par lann
Source avec Zip Source avec une capture MAGEO3D, POUR GÉRER LES POINTS ET LES VECTEURS DE L'ESPACE R... par pgl10
Source avec Zip Source avec une capture ALGORITHME ACO TOILE D'ARAIGNÉE par RyBeN
Source avec Zip Source avec une capture TRAITEMENT D'IMAGE EN C++, QT par Akham75

 Sources en rapport avec celle ci

Source avec Zip EVALUATEUR D'EXPRESSION ARITHMÉTIQUE par matrx180vTitanium
Source avec Zip Source avec une capture EVALUATEUR_EXPRESSION_ARITHMETIQUE par Donald180v
Source avec Zip Source avec une capture ANALYSEUR_LEXICAL_TABLEAU par Donald180v
Source avec Zip Source avec une capture ANALYSEUR LEXICAL par Donald180v
Source avec Zip ANALYSEUR SYNTAXIQUE DU LANGUAGE PASCAL (ANALYSE DESCENDANTE... par wiseman1989

Commentaires et avis

Commentaire de HajourtySmi le 08/04/2013 12:25:14

Bonjour!! s'il vous plait vous pouvez m'aider à trouver le grammaire d'algorithme pour réaliser un analyseur syntaxique et merci d'avance

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

parser xml en C [ par jbt36 ] bonjour à tous,j'ai besoin de realiser un editeur xml en Cpour cela je dois notamment parser le fichier xml pour pouvoir le manipuler,l'affichersous f surcharge de l'operateur ">>" du cin [ par pounch ] bon voila mon problemej'aimerai parser une ligne de commande grace au cin et afficher un prompt lorsque j'ai fini de parser. Mais le cin n'a pas de me coloration syntaxique VC++ [ par baniway ] Bonjour,J'ai plusieurs fichiers en C++ dont l'extension (.txx) n'est pas reconnu par VC comme etant du C++. Quelqu'un saurait-il comment indiquer a vc Parser /proc/pid/environ pour un process PHP [ par jdoucet ] Salut tout le monde !Voilà j'ai besoin de récupérer dans un joli tableau le contenu de /proc/pid/environ, le tout découpé comme il faut (le fichier es parser un document XML avec C++ [ par assiatoune ] bonjour tout le monde!ma question est la suivante:&nbsp;j'ai un document XML (un sch&#233;ma XML) et je veux extraire (avec C++) dante une structure d parser un schéma XML avec C++ [ par assiatoune ] Bonjour tout le monde, &nbsp;je vous remercie de m'avoir&nbsp;r&#233;pondu.&nbsp;&nbsp;mais mon probleme est que je suis d&#233;btante en visuel C++, XML DOM xerces parser une chaine de caractères avec Wrapper4InputSource [ par pbouchard ] Bonjour, Je voudrai parser une string avec l'api dom de xerces. J'arrive bien &#224; parser du xml quand je donne un nom de fichier (dans la fonction parser 3ds [ par Bimpson ] Bonjour &#224; tous, Partant d'un fichier 3ds je voudrais r&#233;cup&#233;rer les coordonn&#233;es des vertexs, aretes et faces pour les r&#233;int&# Parser Ligne de Commande MFC (WinMain) [ par GRenard ] Bonjour, J'ai ceci : int WINAPI WinMain(&nbsp;&nbsp;&nbsp; HINSTANCE hInstance, &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; Besoin d'aide pour la réalisation d'un parser xml avec VC++6 [ par petiot_cedric2 ] Mon but est de cr&#233;er une application avec VC++6 avec une interface graphique en C++ pour ouvrir un fichier XML, le parser et le r&#233;&#233;crir


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,967 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales