%{ #include "context-int.h" #include "java.h" #include "../analysis/types/cse.h" /* ------------------------- CONTEXTE POUR LE DECODAGE JAVA ------------------------- */ #define G_TYPE_JAVA_DCONTEXT g_java_dcontext_get_type() #define G_JAVA_DCONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_java_dcontext_get_type(), GJavaDContext)) #define G_IS_JAVA_DCONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_java_dcontext_get_type())) #define G_JAVA_DCONTEXT_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE((inst), g_java_dcontext_get_type(), GJavaDContextIface)) #define G_JAVA_DCONTEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_JAVA_DCONTEXT, GJavaDContextClass)) /* Contexte de décodage Java (instance) */ struct _GJavaDContext { GDemanglingContext parent; /* A laisser en premier */ }; /* Contexte de décodage Java (classe) */ struct _GJavaDContextClass { GDemanglingContextClass parent; /* A laisser en premier */ }; /* Indique le type défini pour un contexte de décodage. */ static GType g_java_dcontext_get_type(void); /* Initialise la classe des contextes de décodage. */ static void g_java_dcontext_class_init(GJavaDContextClass *); /* Initialise une instance de contexte pour décodage. */ static void g_java_dcontext_init(GJavaDContext *); /* Affiche un message d'erreur concernant l'analyse. */ static int java_error(/*const YYLTYPE *yyloc, bool hunt, char **ucode, unsigned char *index, */GJavaDContext *, char *); %} %union { void /*GDataType*/ *type; size_t adeep; /* Dimension d'un tableau */ char *text; /* Chaîne de caractères */ } %parse-param { GJavaDContext *context } %token V Z B S C I J F D %token ARRAY %token L SEMICOLON %token SLASH DOLLAR %token TEXT %type type_descriptor field_type_descriptor non_array_field_type_descriptor full_class_name %type TEXT %{ /* De lexi.c... */ /*int yylex(YYSTYPE *, YYLTYPE *);*/ void java_restart(FILE *); typedef struct yy_buffer_state *YY_BUFFER_STATE; extern YY_BUFFER_STATE java__scan_string(const char *); extern void java__delete_buffer(YY_BUFFER_STATE); extern int java_lex (void); /* Affiche un message d'erreur concernant l'analyse. */ /*int yyerror(const YYLTYPE *, bool, char **, unsigned char *, char *);*/ %} %% input: type_descriptor { G_DEMANGLING_CONTEXT(context)->type = $1; } ; type_descriptor: V { $$ = g_basic_type_new(BTP_VOID); } | field_type_descriptor { $$ = $1; } ; field_type_descriptor: non_array_field_type_descriptor { $$ = $1; } | ARRAY non_array_field_type_descriptor { $$ = $2; } ; non_array_field_type_descriptor: Z { $$ = g_basic_type_new(BTP_BOOL); } | B { $$ = g_basic_type_new(BTP_UCHAR); } | S { $$ = g_basic_type_new(BTP_SHORT); } | C { $$ = g_basic_type_new(BTP_CHAR); } | I { $$ = g_basic_type_new(BTP_INT); } | J { $$ = g_basic_type_new(BTP_LONG); } | F { $$ = g_basic_type_new(BTP_FLOAT); } | D { $$ = g_basic_type_new(BTP_DOUBLE); } | L full_class_name SEMICOLON { $$ = $2; } ; full_class_name: TEXT { $$ = g_class_enum_type_new(CET_CLASS, $1); } | full_class_name SLASH TEXT { $$ = g_class_enum_type_new(CET_CLASS, $3); g_data_type_set_namespace($$, $1, "."); } | full_class_name DOLLAR TEXT { $$ = g_class_enum_type_new(CET_CLASS, $3); g_data_type_set_namespace($$, $1, "."); } ; %% /* ---------------------------------------------------------------------------------- */ /* CONTEXTE POUR LE DECODAGE JAVA */ /* ---------------------------------------------------------------------------------- */ /* Indique le type défini pour un contexte de décodage. */ G_DEFINE_TYPE(GJavaDContext, g_java_dcontext, G_TYPE_DEMANGLING_CONTEXT); /****************************************************************************** * * * Paramètres : klass = classe à initialiser. * * * * Description : Initialise la classe des contextes de décodage. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void g_java_dcontext_class_init(GJavaDContextClass *klass) { } /****************************************************************************** * * * Paramètres : context = instance à initialiser. * * * * Description : Initialise une instance de contexte pour décodage. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void g_java_dcontext_init(GJavaDContext *context) { } /****************************************************************************** * * * Paramètres : - * * * * Description : Prépare de quoi effectuer un décodage Java. * * * * Retour : Instance du contexte mis en place. * * * * Remarques : - * * * ******************************************************************************/ GDemanglingContext *g_java_dcontext_new(void) { GDemanglingContext *result; /* Structure à retourner */ result = g_object_new(G_TYPE_JAVA_DCONTEXT, NULL); return result; } /* ---------------------------------------------------------------------------------- */ /* TRAITEMENT DE L'ENCODAGE TYPE JAVA */ /* ---------------------------------------------------------------------------------- */ /** * Affiche un message d'erreur concernant l'analyse. * @param yyloc informations concernant les coordonnées du soucis. * @param hunt indique le type de passe réalisée. * @param ucode code résultant compilé. * @param index indice de commande à mettre à jour. * @param msg indications humaines sur l'événement. * @return 0. */ static int java_error(/*const YYLTYPE *yyloc, bool hunt, char **ucode, unsigned char *index, */GJavaDContext *context, char *msg) { fprintf(stderr, "ERREUR !\n"); fprintf(stderr, "%s\n", msg); return -1; } /****************************************************************************** * * * Paramètres : context = contexte de décodage à utiliser. * * desc = chaîne de caractères à décoder. * * * * Description : Procède au décodage d'une chaîne de caractères. * * * * Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ bool demangle_java_type(GJavaDContext *context, const char *desc) { YY_BUFFER_STATE buffer; /* Tampon pour bison */ int ret; /* Bilan de l'appel */ buffer = java__scan_string(desc); ret = yyparse(context); java__delete_buffer(buffer); return (ret == 0); }