(win32) parser du langage c avec yacc

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 / Exemple :


// 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;
}

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.