Se da limbajul ATM, descris mai jos. Scrieti un program care parcurge limbajul, afiseaza AST-ul, il executa, il transforma intr-un limbaj de asamblare dat si executa limbajul de asamblare.
Numele fisierului vostru va fi atm si va avea parametrii de forma:
$ ./atm nume_fisier actiune actiune: ast - afiseaza AST-ul exe_ast - executa limbajul pe baza AST-ului asm - afiseaza limbajul de asamblare exe_asm - executa limbajul de asamblare primit in nume_fisier
type nume type poate fi integer, string sau float
type nume(lungime) type poate fi integer, string sau float lungimea este o constanta
write expresie in variabila
function nume_functie parametru1@tip continuare_nume_functie parametru2@tip conitnuare_nume_functie parametru3@tip ... returns tip start ... ... ... return (daca e cazul) stop
Tipurile de intoarcere sunt oricare din cele trei tipuri de variabile sau nothing daca nu intoarce nimic.
La return, functia se opreste imediat
Exemple:
function gotox x@integer andy y@integer andWrite text@string andNewFile nl@integer returns nothing start print text if nl = 0 start print '\n' stop end
print expresie
Aplelarea unei functii se face cu run
run nume_functie parametru1 continuare_nume_functie parametru2 ...
Daca apare intr-o expresie o functie (poate fi doar o functie care intoarce ceva, ea apare intre {}
write 10+{run ...} in variabila
if expresie_logica start else stop
Intra in if daca expresia este != 0 si in else daca expresia este 0
Else poate sa liplseasca. If-urile se pot imbrica.
+, -, /, * si % paranteze () ! - not (daca e !=0, ! intoarce 0, si invers) (!4 = 0, !0 = 1) & - si
= - egal != - diferit
print expresie
ADD r2, r1, r0 (r2=r1+r0)
SUB r2, r1, r0 (r2=r1-r0)
MUL r2, r1, r0 (r2=r1*r0)
DIV r3, r2, r1, r0 (r3=r1/r0, r2=r1%r0) impartire intreaga
DIVF r2, r1, r0 (r2=r1/r0) impartire in virgula mobila
PRINT r0 afiseaza r0 pe ecran
TEST r0, r1
JE eticheta - sare daca ultimul test este r0=r1
JNE eticheta - sare daca ultimul test este r0!=r1
JG eticheta - sare daca ultimul test este r0>r1
JL eticheta - sare daca ultimul test este r0<r1
JMP eticheta - sare
RUN eticheta p1, p2, p3, impinge pe stiva parametrii si sare la eticheta
RETURN valoare - scoate de pe stiva parametrii si sare inapoi de unde a venit cu RUN. Impinge pe stiva valoarea de intoarcere.
eticheta: - plaseaza o eticheta
In caz de eroare de parcurgere, afisati:
Error: text erooare
Programul iese cu un code de eroare