Sve što se tiče čuvanja grafova u fajlove i učitavanje istih iz fajlova običan korisnik može da radi direktno iz programa i uz pomoć grafičkih alata koji su na raspolaganju. Međutim, za naprednije korisnike postoji mogućnot ručnog zadavanja grafova u fajl.
Da bi korisnici mogli to da rade, kao i da bi razumeli format fajla koji generiše ExGERM, potrebno je da poznaju sintaksu jezika za definiciju grafova (u daljem tekstu GDL) koji program koristi.
Svaki graf se definiše u posebnom fajlu i započinje ključnom rečju graph. Najjednostavniji graf, bez osobina, čvorova i i veza bi izgledao ovako:
graph primer_grafa {}
Ovaj graf se se zove “primer_grafa”.
Da bi se zadala imena grafa, čvorova i osobina potrebno je imati pojam identifikatora. U GDL-u identifikator može biti bilo koja sekvenca slova i brojeva. Ako je potrebno da identifikator sadrži nešto izvan ovog skupa (dodatne znake, razmak...), potrebno ga je staviti pod navodnike. Ukoliko u imenu identifikatora treba da se pojavi i navodnik, ispred navodnika treba staviti znak \.
Postoje samo tri ključne reči koje ne mogu da se koriste kao identifikatori, jer ih GDL interno koristi. To su:
· graph
· node
· edge
Ukoliko je potrebno da se ove reči koriste za identifikatore, potrebno ih je stativi pod navodnike.
Osobine mogu da imaju svi entiteti u GDL-u (grafovi, čvorovi i grane). Osobine se navode između uglastih zagrada ( “[“ i “]” ) u obliku kljuc=vrednost. Više osobina se jednostavno navodi tako što se stavi zarez između.
Osobine grafa se navode kao prva stvar u telu grafa. Osobine čvora se navode odmah posle definicije čvora, a osobone grafa se navode odmah posle definicije grane.
Za gornji primer dodavanje osobina grafu bi izgledalo ovako:
Graph primer_grafa {
[ kljuc=”Vrednost”, novi_kljuc=bla]
}
Čvorovi se zadaju na sledeći način:
node ime_cvora [osobina=vrednost];
Moguće je uraditi i ovako nešto:
node cvor1, cvor2 [osobina=vrednost];
i u tom slučaju će i cvor1 i cvor2 imati iste atribute.
Grane se zadaju na sledeći način:
edge cvor1 -- cvor2 [osobina=vrednost];
Ili
edge cvor1 -> cvor2 [osobina=vrednost];
ili
edge cvor1 <- cvor2 [osobina=vrednost];
U prvom slučaju kreira se grana koja povezuje čvorove cvor1 i cvor2 neusmereno. U drugom slučaju se isti čvorovi povezuju usmereno, s tim da je cvor1 izvorišni, a cvor2 odredišni. Treći slučaj je isti kao drugi, s tim da su čvorovi cvor1 i cvor2 zamenili mesta.
Moguće je zadati više grana odjednom na sledeći način:
edge cvor1 -- cvor2 -> cvor3 <- cvor4 [osobina=vrednost];
U ovom slučaju se grane prave baš kao što je napisano. Cvor1 se neusmerenom vezom povezuje sa čvorom cvor2, cvor2 dva se usmerenom vezom povezuje sa čvorom cvor3, a cvor3 isto usmerenom vezom sa čvorom cvor4. U oba slučaja je cvor3 odredišni. Sve grane imaju isti atribut. Rezultat je isti kao da je napisano:
edge cvor1 -- cvor2 [osobina=vrednost];
edge cvor2 -> cvor3 [osobina=vrednost];
edge cvor4 -> cvor3 [osobina=vrednost];
GDL poštuje komentare C stila.
Sve što je napisano posle // se zanemaruje (komentari u jednom redu), kao i sve što je napisano između /* i */ se zanemaruje (komentari u više redova).