sobota 31. ledna 2015

Uložení AST jako grafu

Popis uložení AST do grafu sestává ze seznamu vrcholů, hran a vlastností k jednotlivým vrcholům. Protože bude využit framework Frames, je nutno zapsat popis vrcholů do jednotlivých rozhraní.
V kódu bude před název každého vrcholu (uvedeného v závorkách) přiložen symbol "I" pro jednodušší oddělení ostatních tříd či rozhraní.

Vrcholy grafu:
  • Objekt (Object)
    • Třída (CLASS)
      • Rozhraní (IF)
      • Anonymní třída (C_ANONYM)
      • Vnitřní třída (C_INNER)
      • Datový typ (DATT)
      • Generický typ (GENT)
      • Typový parametr (TYPE_PAR) (pouze jeden svého druhu)
      • Pole (FIELD)
      • Výčet prvků (ENUM)
      • Anotace (ANOT)
      • Anotační typ (IF_ANOT)
    • Atribut (ATTR)
    • Metoda (METH)
      • Konstruktor (METH_CON)
    • Parametr (PAR)
    • Hodnota (VALUE)
Pro větší jednoduchost a přehlednost implementace bude využito dědění rozhraní. Dostaneme tak například možnost zacházet s třídami stejně jako s rozhraním, generickým typem, polem a dalšími. Užitečnost využití bude zejména při dotazování, kdy například při dotazu na datový typ elementu může být výsledkem třída, rozhraní, anonymní třída, datový typ, generický typ, pole nebo výčet prvků.

Popis vrcholů

Objekt

Vlastnosti:
  • name (String)
  • ObjectType (o který typ vrholu se jedná)
Vztahy:
  • have_annotation (Anotace)

Třída
Dědíme vše od vrcholu Objekt.
Obsah stejný s rozhraním, vnitřní třídou, anonymní třídou, datovým typem, generickým datovým typem, polem, výčtem, typovým parametrem, anotací a anotačním typem.

Vlastnosti:
  • static (yes/no)
  • abstract (yes/no)
  • final (yes/no)
  • anonym (yes/no)
  • inner (yes/no)
  • access (public/private/protected)
  • package (String) 
  • strictfp (yes/no)
Vztahy:
  • extends (Třída)
  • uses (Třída)
  • implements (Rozhraní)
  • have_inner (Vnitřní třída)
  • have_anonym (Anonymní třída)
  • have_method (Metoda)
  • have_attribute (Atribut)
  • have_element (Hodnota)
  • main_type (Třída)
  • generic_parameter (Třída)


Atribut
Dědí od vrcholu Objekt.

Vlasnosti:
  • static (yes/no)
  • final (yes/no)
  • access (public/private/protected)
  • transient (yes/no)
  • volatile (yes/no)
Vztahy:
  • is_type (Třída)


Metoda
Dědí od vrcholu Objekt.
Obsah stejný jako konstruktor.

Vlastnosti:
  • static (yes/no)
  • final (yes/no)
  • access (public/private/protected)
  • abstract (yes/no)
  • synchronized (yes/no) 
  • native (yes/no)
  • strictfp (yes/no)
Vztahy:
  • is_type (Třída)
  • have_parameters (Parametr)
  • call (Metoda)
  • uses (Třída)
  • throws (Třída)
  • call_throws (Metoda)
  • catch (Třída)


Parametr
Také dědí od vrcholu Objekt.

Vlastnosti:
  • final (yes/no)
  • position (int)
Vztahy:
  • is_type (Třída)

Hodnota
Dědí od vrcholu Objekt.

Vlastnosti:
  • value (String)
Vztahy:
  • is_value_of (Metoda)

Zdroje:
https://github.com/tinkerpop/frames/wiki