begin process at 2010 03 19 07:58:11
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > (WIN32) PARSER DU LANGAGE C AVEC YACC

(WIN32) PARSER DU LANGAGE C AVEC YACC


 Information sur la source

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Divers Classé sous :parser, grammaire, langage C, gcc, yacc bison Niveau :Initié Date de création :08/11/2007 Date de mise à jour :09/11/2007 00:07:30 Vu / téléchargé :6 551 / 439

Auteur : acx01b

Ecrire un message privé
Site perso
Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note

 Description

Cette source permet de parser un code C (qui ne contient pas d'erreur !) déja préprocessé
(sur gcc ou mingw: option -E)
et d'afficher l'arbre syntaxique soit en mode win32 dans un treeview, soit en mode console

l'exécutable de la version win32 est dans le zip



pour le moment c'est une version très préliminaire !
mais qui peut déja très facilement servir de base pour créer la liste des typedef, la liste des fonctions, quelles fonctions appellent quelles fonctions...

pour faire ce parser j'ai pris la grammaire (yacc) de gcc version 2
j'ai enlevé toutes les actions, et j'ai rajouté à l'aide d'un hack une action qui construit l'arbre syntaxique à chaque réduction de yacc
résultat à la fin on obtient un tree_t *
- les feuilles de l'arbre contiennent le code
- et les noeuds contiennent une étiquette correspondant à l'analyse syntaxique

il manque pas mal de petits détails
par exemple dans c-lex.l j'ai rajouté en dure que 1LL était une constante...

Source

  • // savez-vous quel est l'arbre syntaxique qui correspond à ce code pour gcc ?
  • typedef int HWND,WNDCLASS,MSG,LPSTR,DWORD,HBRUSH,Uint32,Byte,HINSTANCE;
  • int WinMain (HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  • {
  • HWND hwnd;
  • WNDCLASS wc;
  • MSG msg;
  • wc.style = 0;
  • wc.lpfnWndProc = MainWndProc;
  • wc.cbClsExtra = 0;
  • wc.cbWndExtra = 0;
  • wc.hInstance = hinstance;
  • wc.hIcon = LoadIconA(((void *)0), (LPSTR)((DWORD)((WORD)(32512))));
  • wc.hCursor = LoadCursorA(((void *)0), (LPSTR)((DWORD)((WORD)(32512))));
  • wc.hbrBackground = (HBRUSH) (1 + 15);
  • wc.lpszMenuName = ((void *)0);
  • wc.lpszClassName = "MaWinClass";
  • if(!RegisterClassA(&wc)) return 0;
  • hwnd = CreateWindowExA(0,"MaWinClass","Essai SDL + API Win32",0xcf0000,0x80000000,0x80000000,800,600,((void *)0),((void *)0),hinstance,((void *)0));
  • if(!hwnd) return 0;
  • char windowid[100];
  • hwnd;
  • strcpy(windowid, "SDL_WINDOWID=" );
  • _ltoa((long)hwnd, windowid+13, 10);
  • _putenv(windowid);
  • SDL_Init(0x00000020);
  • SDL_Surface *ecran = ((void *)0), *photo = ((void *)0);
  • ecran = SDL_SetVideoMode(800, 600, 32, 0x00000001);
  • int i,j;
  • for (i = 0; i < 800; i++) {
  • for (j = 0; j < 600; j++) {
  • ((Uint32*)ecran->pixels)[j*800+i] = ((COLORREF)((BYTE)(i*255/800)|((BYTE)(j*255/600) << 8)|((BYTE)((i+j)*255/1400) << 16)));
  • }
  • }
  • SDL_Flip(ecran);
  • ShowWindow(hwnd, nCmdShow);
  • UpdateWindow(hwnd);
  • while(GetMessageA(&msg, hwnd, 0, 0))
  • {
  • TranslateMessage(&msg);
  • DispatchMessageA(&msg);
  • }
  • msg.wParam;
  • }
// savez-vous quel est l'arbre syntaxique qui correspond à ce code pour gcc ?


typedef int HWND,WNDCLASS,MSG,LPSTR,DWORD,HBRUSH,Uint32,Byte,HINSTANCE;


int WinMain (HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    HWND hwnd;
    WNDCLASS wc;
    MSG msg;
    wc.style = 0;
    wc.lpfnWndProc = MainWndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hinstance;
    wc.hIcon = LoadIconA(((void *)0), (LPSTR)((DWORD)((WORD)(32512))));
    wc.hCursor = LoadCursorA(((void *)0), (LPSTR)((DWORD)((WORD)(32512))));
    wc.hbrBackground = (HBRUSH) (1 + 15);
    wc.lpszMenuName = ((void *)0);
    wc.lpszClassName = "MaWinClass";
    if(!RegisterClassA(&wc)) return 0;
    hwnd = CreateWindowExA(0,"MaWinClass","Essai SDL + API Win32",0xcf0000,0x80000000,0x80000000,800,600,((void *)0),((void *)0),hinstance,((void *)0));
    if(!hwnd) return 0;
    char windowid[100];
    hwnd;
    strcpy(windowid, "SDL_WINDOWID=" );
    _ltoa((long)hwnd, windowid+13, 10);
    _putenv(windowid);
    SDL_Init(0x00000020);
    SDL_Surface *ecran = ((void *)0), *photo = ((void *)0);
    ecran = SDL_SetVideoMode(800, 600, 32, 0x00000001);
    int i,j;
    for (i = 0; i < 800; i++) {
        for (j = 0; j < 600; j++) {
            ((Uint32*)ecran->pixels)[j*800+i] = ((COLORREF)((BYTE)(i*255/800)|((BYTE)(j*255/600) << 8)|((BYTE)((i+j)*255/1400) << 16)));
        }
    }
    SDL_Flip(ecran);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);


    while(GetMessageA(&msg, hwnd, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessageA(&msg);
    }
    msg.wParam;
}


 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


 Historique

08 novembre 2007 15:01:33 :
.
09 novembre 2007 00:04:36 :
rajout d'une version win32 pour afficher l'arbre syntaxique sous forme de treeview
09 novembre 2007 00:07:30 :
.

 Sources du même auteur

Source avec une capture OPENGL - JEU DE BILLARD EN 3D PAS FINI
Source avec Zip Source avec une capture BIEN EXPLIQUE: EXEMPLE DE RESEAU DE NEURONE
Source avec Zip OPENGL: CLASSE CAMERA QUI GÈRE LE GLULOOKAT
Source avec Zip Source avec une capture SCREENSAVER HYPNOTISEUR
Source avec Zip LABYRINTHE EN 3D

 Sources de la même categorie

Source avec une capture POWER MATH: TESTE DE VITESSE ENTIERS VS REELS , CLASS VS STR... par dedalusman
Source avec Zip PARSER XML par MagnumPP
[C BZLIB] LIRE ET ÉCRIRE UN FICHIER COMPRESSÉ par Zestyr
Source avec Zip Source avec une capture BOT DE CLIC (SIMULATION DE CLIC PARAMÈTRABLE) par jojo930
Source avec Zip Source avec une capture [C++] GENERATEUR DE PSEUDO par Miwik

 Sources en rapport avec celle ci

Source avec Zip PARSER XML par MagnumPP
Source avec Zip Source avec une capture CLEX ANALYSEUR LEXICALE DU LANGAGE C par xtremejames183
AFFICHAGE D'UN TRIANGLE ISOCELE par nabche
Source avec Zip INI PARSER FLEX++ / BISON++ par neria
Source avec Zip Source avec une capture EXTENSION DU SHELL: MENU CONTEXTUEL EN C (WIN32 API) par racpp

Commentaires et avis

Commentaire de uaip le 16/07/2009 18:38:20

Salut,
Avec quelles versions de yacc et lex avez-vous obtenu les .c et .h (version linux ou windows) ? Si windows, quelles lib(s) avez-vous utilisée(s) ?
Je m'explique : j'ai créé un projet avec flex/bison et utilisé libfl.a pour compiler les .c et .h générés. En projet sous console, ça fonctionne, mais pas en projet win32 (GUI). C'est en incluant la lib que j'obtiens l'erreur.

Beau boulot, sinon :)

Dans l'attente de votre réponse.

Commentaire de acx01b le 21/07/2009 15:22:46

salut je l'ai fait sous cygwin avec bison 2.3 et flex 2.5.4

n'hésitez pas à me rendre compte de vos expériences problèmes avec ce parseur

Commentaire de uaip le 21/07/2009 23:35:57

Salut,
N'utilisant pas cygwin mais minGW, j'ai trouvé une "solution", visible ici si ça vous intéresse (ça prend 30sec de lecture :)) : http://www.cppfrance.com/forum/sujet-UTILISATION-FLEX-BISON-DANS-APPLICATION-GRAPHIQUE-WINDOWS-API_1338262.aspx

Bonne continuation.

Commentaire de LandTech le 17/01/2010 17:37:40 10/10

Bonjour,

Tout d'abord très bonne source.

Deuxièmement, je voulais savoir comment vous aviez fait pour modifier la grammaire yacc du parser de GCC.
Vous dites l'avoir fait avec un "hack", c'est à dire ?

Merci d'avance

LandTech

Commentaire de uaip le 17/01/2010 19:08:27

Salut,
Apparemment, gcc est construit avec yacc. Il a donc récupéré le fichier yacc (visible dans les sources de gcc), et fait un hook pour intercepter les actions et en ajouter une. (différence hook / hack, je ne sais pas, à voir sur google).

Cordialement, uaip.

Commentaire de acx01b le 26/01/2010 14:39:49

salut,

en premier on dit à yacc d'utiliser une structure d'arbre comme YYSTYPE:
#define YYSTYPE tree_t
YYSTYPE c'est la structure (instanciée sous le nom yyval dans le parser) qui permet de sauvegarder des états sémantiques, c'est donc par l'intermédiaire de cette variable que tout ce fait dans un programme utilisant yacc

la structure tree_t est définie dans le .h

ensuite le hack (détournement) de yacc est ici (ligne "hack:" dans la grammaire .y)
on active le mode debug: #define YYDEBUG 1

et on redéfinit la macro YY_SYMBOL_PRINT :
// le hack: on hack une des macros utilisées en mode YYDEBUG pour éxecuter notre action (création de l'arbre) à chaque réduction
#undef YY_SYMBOL_PRINT
#define YY_SYMBOL_PRINT(A,B,C,D) \
do { \
int n = yyr2[yyn]; \
int i; \
yyval.nb_links = n; \
yyval.links = malloc(sizeof *yyval.links * yyval.nb_links); \
yyval.str = NULL; \
yyval.type = yytname[yyr1[yyn]]; \
for (i = 0; i < n; i++) { \
yyval.links[i] = malloc(sizeof (YYSTYPE)); \
memcpy(yyval.links[i], &yyvsp[(i + 1) - n], sizeof (YYSTYPE)); \
} \
} while (0)

en activant le debug, YY_SYMBOL_PRINT est appelé à chaque réduction, et le YY_SYMBOL_PRINT ainsi redéfini construit l'abre syntaxique (yyval, variable interne de yacc est de type YYSTYPE c'est à dire de type tree_t)

conclusion : j'aurais pu près chaque ligne de la grammaire rajouter un appel à construire_noeud(fils1,fils2,fils3...) et stocker le noeud ainsi créé dans le yyval, mais ici j'ai trouvé un moyen d'éviter ça même si le résultat est le même

Commentaire de biline1miline le 24/02/2010 14:58:34

Bonjour,
voilà j'ai postulé mon problème sur un autre site
mais comme ton travail est similaire au mien tu pourra peut etre m'aider
voilà je dois faire un parsing
mais avant celà je le fais passer par un pre processing
mais j'évite tout ce qui est système pour des raisons
mais j'ai créer un fichier dans lequel il y a le traitement de tout les macro les plus utilisées
mais voilà la commande sur l'invite de commande passe tres bien mais pas en java
voilà le problème détaillé
merci de me répondre


Je travail sur le pre processsing de c++
Seulement là il y a un problème avec les marco système
La solution a été donc de créer un fichier fichier.h dans lequel je mettrai tout les macro les plus utilisés
Pour inclure #include " fichier.h" il faut rajouter au bien par programmation
Et dans ce cas je dois toucher au code source client
Ou alors me referer au commande gcc

J'ai fais une petite recherche pour trouver l'option à intégrer pour
ajouter le fichier fichier.h et je suis tomber sur celle là -include
voilà sur l'invite de commande ça marche très bien

D:\Amina\WorkSpace\ParseurCPP5> Resource\gcc.exe -E -B Resource
-I Resource\libM -include fichier.h
TestCases\main.cpp > Test\resl.cpp

D:\Amina\WorkSpace\ParseurCPP5>    ? Le chemin vers le gcc
Resource\gcc.exe -E -B Resource    ? Exécuter que le pre processing
-I libM                 -          ? Donner le chemin ou se trouve le fichier .h
-include fichier.h                 ? L'option pour ajouter le fichier .h
TestCases\main.cpp > Test\resl.cpp ?Le fichier d'entrée cpp (main.cpp) et celui de sortie pour le parsing(resl.cpp)

seulement voilà si j'exécute la commande suivante
et que je met la ligne "fichier.h" dans le fichier cpp alors ça marche

String[] Commande = new String[] {"command.com","/C",
            "Resource\\gcc.exe",
            "-E",                                                                    
            "-B","Resource",
            "-I","LibM",          
            in_path,
            ">",                                                                        
            "test\\"+out_path};


et si je veux rajouter la ligne de commande qui fais ça sans passer par programmation
en mettant cette commande                          
                                  
String[] Commande = new String[] {"command.com","/C",
            "Resource\\gcc.exe",
            "-E",                                                                    
            "-B","Resource",
            "-I","LibM",
            "-include","fichier.h",
            in_path,
            ">",                                                                        
            "test\\"+out_path};  
ça ne marche plus

ERROR [main] - java.io.IOException: Cannot run program "command.com": CreateProcess error=87, Paramètre incorrect

je ne vois pas ou est le problème puisque avec l'invite de commande ça marche.
tout marche sauf cette quant j'ajoute l'option

Cordialement.

Commentaire de LandTech le 25/02/2010 17:50:26

Salut,

Il faut remplacer command.com par cmd.exe, command.com est l'ancien nom de cmd.exe.

Voilà

Commentaire de biline1miline le 26/02/2010 02:43:28

j'ai trouvé ou est le problème
c'est le fichier où se trouve les fichier de test
in_path: c'est un chemin qui n'est pas donné en dur
il est en paramètre
pour spécifier le chemin des test
je l'ai afficher il contient ça
D:\Amina\WorkSpace\ParseurCPP7\.\TestCases\main.cpp

voilà en faite il y a deux cas ou ça ne marche
c'est quant le chemin des dossier cpp est trop long
et quant le nom du fichier en sortie dépasse 8 caractère
j'ai lu qu'il y'avait une limitation
parceque quant je change de chemin ça marche tres bien
est ce que tu peux m'aider??

Commentaire de LandTech le 05/03/2010 17:51:34

Salut,

Pour les chemins, dans le pire des cas, tu peux utiliser les chemins courts (Type DOS).

Pour cela il suffit d'utiliser l'API GetShortPathNameA qui te retourne la taille du chemin court et le chemin court dans la variable lpszShortPath .

et sinon, je veux bien t'aider.

Voila.

Commentaire de biline1miline le 14/03/2010 10:08:30

Salut,
Merci pour tes réponse
j'ai été prise par un autre travail.
voilà le lien ou j'ai trouvé ce qu'il faut faire par rapport à ton idée
mais ça ne marche pas peut etre que tu pourrais m'orienté vers un autre lien ou me dire ce qui manque

http://dolf.trieschnigg.nl/eightpointthree/eightpointthree.html

Commentaire de biline1miline le 14/03/2010 11:06:08

Précision: je travail avec JAVA sous eclipse
voilà j'ai téléchargé les deux jar
et je les ai rajouté au librairie et importer
j'ai cette erreur:
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d8f6188, pid=2968, tid=3352
#
# JRE version: 6.0_14-b08
# Java VM: Java HotSpot(TM) Client VM (14.0-b16 mixed mode windows-x86 )
# Problematic frame:
# V  [jvm.dll+0xf6188]
#
# An error report file with more information is saved as:
# D:\Amina\WorkSpace\Pre_processing\hs_err_pid2968.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Gtk avec gcc [ par GoldenEye ] Bonjour à tous.Je suis en trian de passer de VC++ à gccSi qqun pouvait m'indiquer un site de documentation sur la librairie graphique gtk, ce serait t 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 gcc et les couleurs !! [ par UncleShu ] Salut je voudrais savoir les autres couleurs en C avec gcc, exemple :printf("\033[1;34m Ecrit en bleu !! \033[0m\n");Merci d'avance ! Attendres x secondes mais avec gcc !! [ par UncleShu ] Merci d'avance !!PS : sinon qql'un à convertit conio.h pour gcc je voudrais bien savoir si ça existe !! Lire un wav et un mp3 sur linux avec gcc !! [ par UncleShu ] Merci d'avance !! Que faire contre... [ par Kayl ] ce message : undefined reference to `__gxx_personality_v0'Bonjour à tous !je suis débutant en c++, et j'ai eu la désagréable surprise d'avoir ce messa Conversion de lib VC++ en lib GCC [ par Nebula ] Salut à tous !Je cherche à me connecter sur un serveur MySQL pour accéder à une base de données (logique implacable...). MySQL 3.23 est livré avec des cherche documentation sur gcc in french please [ par cylboo ] je cherche de la doc sur le gcc et aussi sur le c merci ...... ;) )) ) )) Problème avec GCC [ par Cho7Kipu ] Je réalise actuellement un programme destiné a etre utilisé sous unix, et que je devrais donc compiler avec gcc.Un probleme se pose, vu que gcc ne rec 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


Nos sponsors


Sondage...

Comparez les prix


HTC Hero

Entre 550€ et 550€

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
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,624 sec (3)

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