(WIN32) PARSER DU LANGAGE C AVEC YACC

uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011 - 16 juil. 2009 à 18:38
biline1miline Messages postés 18 Date d'inscription dimanche 2 novembre 2008 Statut Membre Dernière intervention 3 mai 2012 - 14 mars 2010 à 11:06
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/44642-win32-parser-du-langage-c-avec-yacc

biline1miline Messages postés 18 Date d'inscription dimanche 2 novembre 2008 Statut Membre Dernière intervention 3 mai 2012
14 mars 2010 à 11:06
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
biline1miline Messages postés 18 Date d'inscription dimanche 2 novembre 2008 Statut Membre Dernière intervention 3 mai 2012
14 mars 2010 à 10:08
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
LandTech Messages postés 73 Date d'inscription dimanche 14 octobre 2007 Statut Membre Dernière intervention 28 février 2011
5 mars 2010 à 17:51
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.
biline1miline Messages postés 18 Date d'inscription dimanche 2 novembre 2008 Statut Membre Dernière intervention 3 mai 2012
26 févr. 2010 à 02:43
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??
LandTech Messages postés 73 Date d'inscription dimanche 14 octobre 2007 Statut Membre Dernière intervention 28 février 2011
25 févr. 2010 à 17:50
Salut,

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

Voilà
biline1miline Messages postés 18 Date d'inscription dimanche 2 novembre 2008 Statut Membre Dernière intervention 3 mai 2012
24 févr. 2010 à 14:58
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.
acx01b Messages postés 280 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 8 juillet 2014 6
26 janv. 2010 à 14:39
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
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
17 janv. 2010 à 19:08
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.
LandTech Messages postés 73 Date d'inscription dimanche 14 octobre 2007 Statut Membre Dernière intervention 28 février 2011
17 janv. 2010 à 17:37
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
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
21 juil. 2009 à 23:35
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.
acx01b Messages postés 280 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 8 juillet 2014 6
21 juil. 2009 à 15:22
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
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
16 juil. 2009 à 18:38
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.
Rejoignez-nous