Documente Academic
Documente Profesional
Documente Cultură
4 – Decizie: if Conditie
Instructiuni
else
Instructiuni
end
, unde:
Conditie este o expresie ce poate sa contina variabile sau valori numerice si operatorii relationali
(><=) si operatorul logic (&),iar Instructiuni e orice succesiune (inclusiv vida) de instructiuni (dintre
acestea pe care le recunoaste limbajul).
Variabilele din program (atat cele scalare, cat si elementele din vectori) vor fi de tipul (F). Toti
operatorii vor avea asociativitate la stanga, iar operatorii relationali vor avea precedenta mai mare
decat operatorul logic.
Tema va cuprinde arhiva (in format .ZIP a) dosarului ce contine fisierele sursa ale programului si un
document (in format .DOCX) ce va avea urmatoarea structura:
0. Cerinta temei (particularizata cu datele fiecaruia)
1. Descrierea generala a programului – modul de realizare, blocurile principale si rolul acestora, etc.
2. Analiza lexicala – descrierea detaliata a analizorului lexical, identificarea atomilor lexicali ai
limbajului, expresiile regulate pentru acestia, construirea automatului finit pentru gasirea atomilor
lexicali, generarea listei de atomi lexicali, etc.
3. Analiza sintactica – descrierea detaliata a analizorului sintactic, realizarea gramaticii (in format
LL(1)), scrierea functiilor parserului, generarea arborelui sintactic abstract, etc.
4. Parcurgerea arborelui sintactic – descrierea modului de parcurgere a arborelui sintactic abstract
pentru interpretarea sau traducerea codului sursa initial, descrierea modului de utilizare a tabelei de
simboluri pentru operarea cu variabilele intalnite, etc.
5. Codul sursa integral al programului.
Programul rezultat va trebui sa fie capabil sa interpreteze/traduca un cod sursa de genul urmator:
var v[10] # Numarul elementelor poate fi doar o valoare numerica (intreaga, pozitiva).
var i
# Citire vector:
i=0
while i < 10
print ”v[” print i print ”]=?”
read v[i]
i = i+1
end
# Sortare vector (prin Bubble Sort):
var gata
gata = 0 - 1 # Caci nu-mi permite limbajul sa scriu gata = -1
while gata < 0
gata = 1
i=0
while i < 9
if v[i] > v[i+1]
var x x = v[i] # Da, pot sa scriu mai multe instructiuni pe linie.
v[i] = v[i+1] v[i+1] = x # Ca si aici – doua instructiuni pe linie.
gata = 0 - 1
end
i = i+1
end
end
Analiza lexicala face referire la următorul aspect: textul de baza este preluat sub
forma unei insiruiri de caractere grupate în entitati numite atomi.Fiecarui atom i se
atribuie câte un cod lexical astfel, programul sursa va fi reprezentat ca o secvența
de coduri.
Analizorul lexical considera textul primit la intrare ca fiind format din unitati
lexicale(simboluri de baza) pe care le recunoaste producand atomi lexicali (token-
uri). Un atom lexical poate sa fie de exemplu, un cuvant cheie al limbajului (for,
while, etc) dar si un numar sau un nume.
Un atom lexical, token, este reprezentat printr-un cod numeric care specifica clasa
din care acesta face parte cât și alte caracteristici specifice fiecarei clase.Astfel,
poate sa existe clasa operatorilor relationali pentru care un atribut trebuie sa se
specifice tipul concret al operatorului. Tipul atomului lexical este necesar pentru
analiza sintactica in timp ce valoarea atributului este semnificativa pentru analiza
semantica si generarea de cod. Pentru un atom lexical de tip numar atributele vor
descrie tipul numarului si valoarea acestuia.
Aceasta parcurgere, atât pentru a afisa continutul arborelui cât și pentru a traduce
nodurile acestuia în instrucțiuni echivalente este implementata în doua metode ale
clasei arborelui.
5.Cod sursa
import java.util.ArrayList;
public class tema {
public Nod head;
private static final int HASHTAG=1;
private static final int VAR=2;
private static final int NUMEVAR=3;
private static final int PARDR=4;
private static final int PARST=5;
private static final int NUMAR=6;
private static final int EGAL=7;
private static final int PLUS=8;
private static final int MINUS=9;
private static final int STEA=10;
private static final int IMP=11;
private static final int DACA=12;
private static final int MAIMARE=13;
private static final int MAIMIC=14;
private static final int NEGATIE=15;
private static final int OR=16;
private static final int ALTFEL=17;
private static final int SFARSIT=18;
private static final int CATTIMP=19;
private static final int PRINTEAZA=20;
private static final int CITESTE=21;
private static final int GHILIMELE=22;
private static final int ENDLINE=23;
private static final int SIR=24;
public class Nod {
public int tip;
public String val;
public Nod st, dr;
}
public static class Token{
public int tip;
public String val;
Token()
{
this.tip= 0;
this.val= "";
}
}
public static ArrayList<Token> AnalizatorLexical (String c)
{
int i=0;
int q=0;
ArrayList<Token> atomi = new ArrayList<Token>();
String val = "";
while (i < c.length())
{
if(q==0) {
char s = c.charAt(i);
i++;
if(s=='#') q=1;
else if(s == 'var')q=2;
else if((s>='a' && s<='z') || (s>='A' && s<='Z'))q=3;
else if((s>='a' && s<='z') || (s>='A' && s<='Z'))q=4;
else if(s == '[')q=5;
else if(s == ']')q=6;
else if((s>='0' && s<='9'))q=7;
else if(s == '+')q=8;
else if(s == '=')q=9;
else if (s=='-')q=10;
else if (s=='(')q=11;
else if (s==')')q=12;
else if (s=='>')q=13;
else if (s=='if')q=14;
else if (s=='<')q=15;
else if (s=='=')q=16;
else if (s=='|')q=17;
else if (s=='else')q=18;
else if (s=='end')q=19;
else if (s=='while')q=20;
else if (s=='print')q=21;
else if (s=='read')q=22;
else if (s=='"')q=23;
else if (s=='/n')q=24;
else if (s=='string')q=25;
}
else if (q==1) {
char s = c.charAt(i);
if (s=='#')
i++;
else
q=0;
}
else if (q==2)
{
char s=c.charAt(i);
i++;
if (s== 'var')q=3;
else q=2;
}
else if(q==3) {
char s = c.charAt(i);
if(((s>='a') && (s <= 'z'))||
((s>='A') && (s <= 'Z')))
{
i++; val+=s;
}
}
else if (q==4) {
char s = c.charAt(i);
i++;
if(s=='[') q=6;
else {val+=s;q=5;
}
}
else if (q==5) {
char s = c.charAt(i);
i++;
if(s==']') q=6;
else {val+=s;q=5;
}
}
else if(q==6) {
char s = c.charAt(i);
if(((s>='0') && (s <= '9'))
{
i++; val+=s;
}
}
else if (q==7) {
Token atom = new Token();
atom.tip = EGAL;
atom.val = "=";
atomi.add(atom);
q=0;
}
else if (q==8) {
Token atom = new Token();
atom.tip = PLUS;
atom.val = "+";
atomi.add(atom);
q=0;
}
else if (q==9) {
Token atom = new Token();
atom.tip = MINUS;
atom.val = "-";
atomi.add(atom);
q=0;
}
else if (q==10) {
Token atom = new Token();
atom.tip = PARST;
atom.val = "(";
atomi.add(atom);
q=0;
}
else if (q==11) {
Token atom = new Token();
atom.tip = PARDR;
atom.val = ")";
atomi.add(atom);
q=0;
}
else if (q==12) {
Token atom = new Token();
atom.tip = DACA;
atom.val = "if";
atomi.add(atom);
q=0;
}
else if (q==13) {
Token atom = new Token();
atom.tip = MAIMARE;
atom.val = ">";
atomi.add(atom);
q=0;
}
else if (q==14) {
Token atom = new Token();
atom.tip = MAIMIC;
atom.val = "<";
atomi.add(atom);
q=0;
}
else if (q==15) {
Token atom = new Token();
atom.tip = EGAL;
atom.val = "=";
atomi.add(atom);
q=0;
}
else if (q==16) {
Token atom = new Token();
atom.tip = OR;
atom.val = "|";
atomi.add(atom);
q=0;
}
else if (q==17) {
Token atom = new Token();
atom.tip = ALTFEL;
atom.val = "else";
atomi.add(atom);
q=0;
}
else if (q==18) {
Token atom = new Token();
atom.tip = SFARSIT;
atom.val = "end";
atomi.add(atom);
q=0;
}
else if (q==19) {
Token atom = new Token();
atom.tip = CATTIMP;
atom.val = "while";
atomi.add(atom);
q=0;
}
else if (q==20) {
Token atom = new Token();
atom.tip = PRINTEAZA;
atom.val = "print";
atomi.add(atom);
q=0;
}
else if (q==21) {
Token atom = new Token();
atom.tip = CITESTE;
atom.val = "read";
atomi.add(atom);
q=0;
}
else if (q==22) {
Token atom = new Token();
atom.tip = GHILIMELE;
atom.val = """;
atomi.add(atom);
q=0;
}
else if (q==23) {
Token atom = new Token();
atom.tip = ENDLINE;
atom.val = "/n";
atomi.add(atom);
q=0;
}
else if (q==24) {
Token atom = new Token();
atom.tip = SIR;
atom.val = "string";
atomi.add(atom);
q=0;
}
return atomi;
}
public static void main (String[]args) {}
}