Att skriva en egen parser och kompilator i Ruby

I Februari bestämde jag mig för att ta en titt på hur parsing och kompilatorer fungerar, jag valde att imlementera en i Ruby och här kan ni se resultatet.

Det påminner väldigt mycket om tankesättet vi hade när vi gjorde en kalkylator i Java för några år sedan i en kurs jag hade på Uppsala Universitet. Jag implementerade allt fram tills dess att jag skulle generera den slutliga koden. Kunde inte riktigt bestämma mig för vilket språk jag ville generera, ren Rubykod, Assembler eller C.

Exempelprogram

Se online på GitHub

/* PROGRAM NAME: nxx1.txt

nxx is a simple programming language that provides:
 numbers
 strings
 assignment statements
 string concatenation
 simple arithmetic operations
 print capability

comments may be enclosed in slash+asterisk .. asterisk+slash
*/
alpha = 16 ;
beta = 2 ;
resultName = "delta" ;
delta = alpha / beta ;
print "Value of " || resultName || " is: " ;
print delta ;
print "\n" ;

Här är syntaxträdet som produceras av ovanstående kod:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Here is the abstract syntax tree:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ROOT
    =
        alpha
        16
    =
        beta
        2
    =
        resultName
        "delta"
    =
        delta
        alpha
        /
        beta
    print
        "Value of "
        resultName
        " is: "
    print
        delta
    print
        "\n"

Lärdomar

Själva implementeringen av parsern, lexern och scannern gick bra. Dock märkte jag i slutet att jag saknade en del kunskap om teorin bakom, vilket gjorde det svårt att slutföra. Dessutom fick jag annat att göra så det hamnade i skymundan.

I höst kommer jag läsa en kurs i kompilatorteknik, det ska bli roligt eftersom jag har gett mig på en del av begreppen tidigare och kommer förhoppningsvis ha nytta av mina tidigare erfarenheter och på så sätt ha mer nytta av kursen.