Scrieți gramatica (parser + lexer) și generați AST-ul pentru următorul limbaj:
Numele unei variabile poate contine litere mici, litere mari, cifre si caracterul _
si trebuie sa inceapa neaparat cu o litera. Variabilele se declara folosind o constructie de tipul:
VAR <nume_var1>[:=<val1>][, <nume_var2>[:=<val2>], ..., <nume_varn>[:=<valn> ]];
exemplu:
VAR a, b:=7;
Vor fi acceptate expresii aritmetice simple, formate din doi termeni. Termenii unei expresii pot fi constante (numere intregi) sau variabile. O valoare intreaga sau o variabila reprezinta ea insasi o expresie. Vor fi suportati urmatorii operatori binari: +, , *, /, <, >, ⇐, >=, !=, ==. Semantica operatorilor este similara cu cea din limbajul C.
<nume_var>: = <expresie>;
Partea stanga a unei instructiuni de atribuire poate fi doar o variabila (intrepretorul va da o eroare in caz contrar). Partea dreapta a atribuirii este o expresie aritmetica.
IF <expresie_compusa> THEN <lista_de_instructiuni1> ELSE <lista_de_instructiuni2> ENDIF;
Expresie_compusa reprezinta o expresie conditionala simpla sau mai multe expresii separate de operatorii && sau ||. Termenii care se compara pot sa fie expresii aritmetice. NU trebuie tesatata precedenta operatorilor, evaluarea se va face in ordinea in care apar. Expresiile NU sunt separate prin paranteze. Lista de instructiuni contine una sau mai multe instructiuni separate prin ';'. Daca apar mai mult de o instructiune, instructiunile NU vor fi cuprinse intre acolade. Separarea este facuta de cuvintele cheie then, else si endif. NU trebuie tratat cazul cu instructiuni if imbricate.
WHILE <expresie_compusa> DO <lista_de_instructiuni> ENDWHILE;
Expresie_compusa reprezinta o expresie conditionala simpla sau mai multe expresii separate de operatorii && sau ||. Termenii care se compara pot sa fie expresii aritmetice. NU trebuie tesatata precedenta operatorilor, evaluarea se va face in ordinea in care apar. Expresiile NU sunt separate prin paranteze. Lista de instructiuni contine una sau mai multe instructiuni separate prin ';'. Daca apar mai mult de o instructiune, instructiunile NU vor fi cuprinse intre acolade. Instructiunile pot sa fie instructiuni if.
Afiseaza la consola rezultatul evaluarii unei expresii.
PRINT <expresie>;
Afiseaza un sir de caractere la consola. Sirul de caractere NU contine secvente escape si este incadrat de ghilimele.
PRINTS "sir de caractere";