A Shakespeare programozási nyelv

Az SPL fordító?

Hogyan készült?

Az SPL-t C-re transzformáló program a Flex és a Bison technológiák felhasználásával készült. A Flex egy lexikai elemző létrehozásához nagyszerű segédeszköz, amely a forráskód beolvasása után tokenizálja azt, a Bison pedig egy értelmező, más néven parser megalkotásában segít, amely egy kódfát épít ezekből a tokenekből, melynek következtében ebből a fából C kód lesz.

Kézzel írt lexikai elemző nem készült, mert igen sok egyszerű, viszont nagyon hasonló utasítást kellett volna lekezelni. Ehelyett egy program készült, amely ezt a feladatot ellátja.

A lexikai elemző és a parser egy programmá linkelődik össze azzal a szövegfeldolgozó programmal, amelyet a parser előszeretettel hívogat.

Utolsó lépésként egy library is készült, amely mindazt a C nyelvben használatos függvényt tartalmazza, amely a transzformátor által generált kódban szerepel.


Az átalakító

2. ábra: Folyamatábra arról, hogyan készült az SPL-átalakító program.

A 2. kép azt ábrázolja, hogy hogyan készült a transzformáló program. A makescanner program készíti a lexikai elemző specifikációját (scanner.l). Ez szólistákat olvas be, amelyek az SPL hivatalos főneveit, mellékneveit, a szereplők neveit, és ezekhez hasonló adatokat tartalmazzák.

A környezet tesztelése

Saját élményeim (Á.Z.)

A tesztelést Linuxon tudtam kényelmesen megoldani, mivel egy C-alapú projekt formájában lehetett letölteni az átalakító programot. A "targz" kicsomagolása után egy olyan könyvtár tárult a szemem elé, amelyben egy Makefile csücsült, így ebből már lehetett sejteni, mi a teendő. Mégsem volt teljesen triviális, mert néhány dolgot még be kellett szerezni ahhoz, hogy leforduljon a forráskód. A make utasítás írta ki hibaüzenetként, mit hiányol, persze csak a legelső hiányzó programért könyörgött, de egy rutinos vén róka már tudhatja, hogy a Makefile felsorolja azokat a programokat, amelyekre a buildeléshez szüksége van. Így is lett. A szükséges programok listája:

Ezek közül persze van néhány alapból, ezek nélkül Linux nincs, csak a hiányzókat kell beszerezni.

Miután ezek meglettek, szépen lefutott (volna) a make. A bökkenő csak az volt, hogy a szépen lefordult átalakítót elkezdte alkalmazni a mellékelt példaprogramokra. Ezek közül már az első elhasalt! Megpróbáltam manuálisan kibogozni, mi lehet a bibi. Másolgattam a fájlokat szorgosan, hogy lássák egymást, majd amikor már mindenki a helyén volt, végre rá lehetett szabadítani az SPL-átalakítót. Kiválasztottam a teszteléshez a hello.spl fájlt, ami a megfelelő, itt a portálon emlegetett példaprogram. Ez gyönyörűen létrehozott egy furcsa C nyelvű kódot. A furcsasága egyrészt abban rejlett, hogy bizony tele van címkékkel, másrészt, ami még sokkal furcsábbá tette, hogy ezek a címkék bizony többször definiáltak. "Micsoda?" - néztem. Kettő féle címkenév szerepelt: "act_i" és "act_i_scene_i". De szó szerint! Erre jogosan szólt be a C-fordító, hogy túldefiniált a címkeazonosító. Mindez annak ellenére történt így, hogy a Shakespeare nyelvű kódban tisztán és világosan ott volt a felvonások és jelenetek számozása, igaz, római számokkal. Ezt könnyen sikerült orvosolni. Ami miatt viszont sokkal bosszúsabb volt a fordító, az rögtön a példakód legelső sorában rejlett:

#include <spl.h>

Egyrészt hiányolta az include fájlt, másrészt definiálatlan függvényekre panaszkodott. Rögtön gyanússá vált, hogy ez az egyszerű a rendszerben keresi az spl.h állományt, holott ott figyel mellette. A megoldás immár könnyűvé lett:

#include "spl.h"

Ezzel sikerült mindkét legyet egy csapásra elintézni.

Ezzel persze még mindig nem fordult a kód, mert az sqrt függvényt hiányolta. Valaki egyszer régen még tanította - fogalmam sincs, ki lehetett a sok közül -, hogy a matematikai függvények használatához a fordítót a -lm kapcsolóval kell futtatni. Így a helyes végeredményt produkáló parancs a következő lett:

cc -lm hello.c -o hello

Az így kapott hello program végül a várt eredményt produkálta és kiírta a "Hello world!" szöveget.