Accueil > > > ANALYSE SYNTAXIQUE
ANALYSE SYNTAXIQUE
Information sur la source
Description
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
Sources du même auteur
Sources de la même categorie
Commentaires et avis
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: j'ai un document XML (un sché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, je vous remercie de m'avoir répondu. mais mon probleme est que je suis dé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 à parser du xml quand je donne un nom de fichier (dans la fonction
parser 3ds [ par Bimpson ]
Bonjour à tous, Partant d'un fichier 3ds je voudrais récupérer les coordonnées des vertexs, aretes et faces pour les réint&#
Parser Ligne de Commande MFC (WinMain) [ par GRenard ]
Bonjour, J'ai ceci : int WINAPI WinMain( HINSTANCE hInstance,
Besoin d'aide pour la réalisation d'un parser xml avec VC++6 [ par petiot_cedric2 ]
Mon but est de créer une application avec VC++6 avec une interface graphique en C++ pour ouvrir un fichier XML, le parser et le réécrir
|
Derniers Blogs
CONF'SHAREPOINT : 10 BONNES RAISONS POUR NE PAS LA RATERCONF'SHAREPOINT : 10 BONNES RAISONS POUR NE PAS LA RATER par pierre
Si vous hésitez encore à venir à la conférence, ci-après 10 bonnes raisons pour ne pas rater cet évènement unique : La Conf'SharePoint, c'est la 1ère conférence en France et en Français dédié à SharePoint : pas de barrière de la langue La Conf...
Cliquez pour lire la suite de l'article par pierre [EVENT] SOIRéE DE LANCEMENT AGILE .NET FRANCE à LYON[EVENT] SOIRéE DE LANCEMENT AGILE .NET FRANCE à LYON par thavo
Agile.Net France débarque à Lyon fin juin !! Je viens d'arriver à Lyon, et l'Agile .Net France aussi. Pour ceux/celles qui habitent en Rhône-Alpes, seriez-vous disponible pour une soirée « Agile .Net France » ?? (je sais que certains vi...
Cliquez pour lire la suite de l'article par thavo SHAREPOINT : INCOMPATIBILITé AVEC INTERNET EXPLORER 10 (IE10)SHAREPOINT : INCOMPATIBILITé AVEC INTERNET EXPLORER 10 (IE10) par ROMELARD Fabrice
Depuis plusieurs mois, Microsoft a publié un patch (comme très régulièrement) qui est passé relativement inaperçu à l'époque. L'arrivée de plus en plus de postes sous Windows 8 et surtout le déploiement par Windows Update de ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice AUTOSPINSTALLER POUR SHAREPOINT 2013 MAINTENANT DISPONIBLE EN "RTM"AUTOSPINSTALLER POUR SHAREPOINT 2013 MAINTENANT DISPONIBLE EN "RTM" par neodante
Alors qu'il n'était qu'en Beta et que quelques dysfonctionnements persistaient, la nouvelle version du fabuleux script AutoSPInstaller permettant d'installer SharePoint 2010/2013 en full script (idéal pour répliquer des fermes de dev/qual/prod) est mainte...
Cliquez pour lire la suite de l'article par neodante
Logiciels
Devis-Factures PHMSD (2.1.0.1)DEVIS-FACTURES PHMSD (2.1.0.1)Configuration minimale
Nécessite Windows™ 2000, XP, Windows 7, 8, Vista (Service Pack à... Cliquez pour télécharger Devis-Factures PHMSD Ludoprêt (3.2)LUDOPRêT (3.2)Logiciel gratuit de gestion de ludothèque.
Gestion des jeux et des adhérents.
Gestion des for... Cliquez pour télécharger Ludoprêt Revealer Keylogger Free (2.05)REVEALER KEYLOGGER FREE (2.05)Keylogger invisible et gratuit pour Windows 8, 7, Vista ou XP. Revealer Keylogger Free vous perme... Cliquez pour télécharger Revealer Keylogger Free 974 Application Server (13.2.1.3)974 APPLICATION SERVER (13.2.1.3)Ecommerce, Blogueur, Vitrine, Newsletter, Java IDE, ..., in the cloud et sous haute dispo. Facile... Cliquez pour télécharger 974 Application Server WDmemoCode (1.0.0)WDMEMOCODE (1.0.0)WDmemoCode a été créé pour aider les développeurs Windev à créer/compléter et conserver une base ... Cliquez pour télécharger WDmemoCode
|