1. #1
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    novembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : novembre 2007
    Messages : 16
    Points : 11
    Points
    11

    Par défaut Analyser le code d'un programme ABAP

    Bonjour aux Abapeur(euse)s, et aux autres !

    Je suis à la recherche d'éléments de programmation (classes, astuces, voire exemple de code, sait-on jamais !) pour analyser, en ABAP, un programme ABAP.

    Je dois concevoir une sorte de Parseur/Analyseur_syntaxique qui pourrait me donner, à partir du nom d'un programme (donc, de son code), la liste des variables, constantes, types locaux, routines, etc, utilisées dans ce programme.

    En quelque sorte, repérer par programmation les éléments disponibles/visibles dans SE80 utilisé comme éditeur.

    Attention : pas les variables/structures standard (MATNR, LFA1, etc...), mais bien les variables et types propres au programme.

    Exemple :

    DATA : gv_matnr TYPE matnr. => je repère 'gv_matnr'

    TYPES : BEGIN OF ty_struc,
    zone1 TYPE kunnr,
    zone2 TYPE char20,
    END OF ty_struc. => je repère 'ty_struc', 'zone1', 'zone2'.

    FORM f_routine TABLES ut_tab
    USING uv_var.

    DATA : lv_buf(10) TYPE c,
    k TYPE i.
    [...]
    ENDFORM. => je repère 'f_routine', 'ut_tab', 'uv_var', 'lv_buf, 'k'.

    J'ai bien trouvé CL_ABAP_PARSER, mais visiblement, ce n'est pas tout à fait ce que je cherche.

    Incidemment, il me faudrait la liste de tous les mots-clés utilisés en ABAP (IF, CASE, TYPE, DELETE, FROM, etc...)

    Quelqu'un aurait-il une piste, svp ???

    Meeeeeeeeeeeeerciiiiiiiii d'avance !

  2. #2
    Membre du Club
    Homme Profil pro
    Consultant SAP (Abap)
    Inscrit en
    février 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant SAP (Abap)
    Secteur : Conseil

    Informations forums :
    Inscription : février 2015
    Messages : 26
    Points : 40
    Points
    40

    Par défaut

    Salut,

    Il doit déjà y avoir une fonction standard qui le fait.
    Si tu affiche un programme en SE80, dans la partie gauche, si tu charges "Object explorer" il va te parser le programme comme tu le souhaites.
    Si tu arrives a retrouver la fonction SAP qui alimente l'arborescence, je pense que tu auras trouvé ton bonheur !

    Nom : 2017-05-12 14_01_50-Editeur ABAP _ Progr. BCALV_DND_01 Afficher.png
Affichages : 230
Taille : 271,0 Ko

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    août 2009
    Messages
    571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2009
    Messages : 571
    Points : 757
    Points
    757

    Par défaut

    Tu peux essayer avec CL_ABAP_COMPILER (ce n'est pas un compilateur mais plutôt un analyseur de code/voire de byte code, basé sur l'instruction interne ABAP "SYNTAX-CHECK"). Voici un exemple de programme pour récupérer les types (utilise le débogueur pour voir le contenu des variables et continuer le programme), j'espère que ça te permettra d'avancer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    DATA lo_prog TYPE REF TO cl_abap_compiler.
    CREATE OBJECT lo_prog
      EXPORTING
        p_name = 'SAPLSEU0'.
    
    DATA lt_types TYPE scr_rtags.
    DATA ls_types TYPE LINE OF scr_rtags.
    DATA lt_result2 TYPE scr_glrefs.
    DATA ls_result2 TYPE scr_glref.
    
    ls_types-sign = 'I'.
    ls_types-option = 'EQ'.
    ls_types-low = cl_abap_compiler=>tag_type.
    APPEND ls_types TO lt_types.
    
    lo_prog->get_all_refs( EXPORTING
      p_local = 'X'
      p_types = lt_types
       IMPORTING p_result = lt_result2 ).
    
    DATA lo_type TYPE REF TO cl_abap_comp_type.
    DATA lo_structure_type TYPE REF TO cl_abap_comp_structure_type.
    DATA lo_class TYPE REF TO cl_abap_comp_class.
    
    LOOP AT lt_result2 INTO ls_result2
          WHERE symbol IS BOUND.
      CASE ls_result2-tag.
        WHEN cl_abap_compiler=>tag_type.
          lo_type ?= ls_result2-symbol.
          CASE lo_type->type_kind.
            WHEN cl_abap_comp_type=>TYPE_KIND_STRUCTURE.
              lo_structure_type ?= lo_type.
            WHEN cl_abap_comp_type=>TYPE_KIND_CLASS.
              lo_CLASS ?= lo_type.
            WHEN cl_abap_comp_type=>TYPE_KIND_INTERFACE.
              assert 1 = 1.
            WHEN cl_abap_comp_type=>TYPE_KIND_TABLE.
              assert 1 = 1.
            WHEN cl_abap_comp_type=>TYPE_KIND_REFERENCE.
              assert 1 = 1.
            WHEN cl_abap_comp_type=>TYPE_KIND_ELEMENTARY.
              assert 1 = 1.
          ENDCASE.
      ENDCASE.
    ENDLOOP.

  4. #4
    Membre du Club
    Homme Profil pro
    Consultant SAP (Abap)
    Inscrit en
    février 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant SAP (Abap)
    Secteur : Conseil

    Informations forums :
    Inscription : février 2015
    Messages : 26
    Points : 40
    Points
    40

    Par défaut

    Merci sandraros pour cette classe.

    J'ai testé avec ton code et effectivement ça permet de récupérer plein de choses.

    Dans l'exemple donné par sandraros, on récupère les variables déclarées dans le programme via le TAG_TYPE utilisé à la ligne 13. Il y a d'autres types qui peuvent être utilisés, pour les connaitre il suffit d'afficher les attributs de la classe en SE24, ce sont tous les attributs TAG_*. Notez la présence d'un TAG_ANY qui permet de tout récupérer.

    En fouinant un peu ce matin sur le sujet je suis tombé sur ce module fonction RS_PROGRAM_INDEX qui permet de faire sensiblement la même chose mais peut-être plus simplement

  5. #5
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    novembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : novembre 2007
    Messages : 16
    Points : 11
    Points
    11

    Par défaut

    Je reviens !

    ( J'avais réussi à obtenir un délai pour la réalisation de mon projet (soulagée!) et dans l'intervalle, on m'a donné un truc plus urgent (et sûrement plus rentable) à faire.

    Et comme fait exprès, je n'ai pas reçu les notifications de vos réponses... )

    En tout cas, je vous remercie pour vos pistes très utiles : dès que je me replonge sur ce sujet (une sorte de pré-compilateur), je vous fais signe.

    Merci à tous !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Outil d'analyse de code
    Par Bloon dans le forum Outils
    Réponses: 8
    Dernier message: 07/08/2007, 10h04
  2. Analyse de code
    Par ecocentric dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 11/02/2005, 02h09
  3. [WSAD 5 ] - Analyse de code
    Par nicoswiss dans le forum Eclipse Java
    Réponses: 8
    Dernier message: 13/08/2004, 11h21
  4. [ Code ] Analyse de code - Attribut Inutile
    Par geegee dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 19/05/2004, 10h07
  5. Cherche lien info... sur l'analyse du code
    Par Alec6 dans le forum Qualimétrie
    Réponses: 3
    Dernier message: 03/03/2004, 15h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo