Sunteți pe pagina 1din 16

Proiect LFA

Student : Duinea Radu Andrei


Specializarea : Calculatoare
Grupa : 311
An universitar : 2021-2022
Cerinta:

Sa se implementeze in limbajul (C++) un program care sa realizeze operatia (INTERPRETARE)


pentru un limbaj de programare minimalist ce poate contine urmatoarele elemente:

0 – Comentarii: # Acesta e un comentariu (mono-linie). Tot ce e


# de la simbolul '#' pana la finalul liniei e ignorat.
1 – Definire de variabila: var nume_variabila
2 – Definire de vector: var nume_vector[numar_elemente]
3 – Atribuire: Variabila = Expresie
, unde:

Variabila poate fi nume_variabila sau nume_vector[index_element]


iar Expresie e orice expresie aritmetica valida ce poate contine operatorii aritmetici (+,-,(,)) si drept
operanzi poate contine variabile (nume_variabila sau nume_vector[index_element]) sau valori
numerice (reprezentand numere intregi pozitive scrise in baza 10).

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).

5 – Repetitie: while Conditie


Instructiuni
end
6 – Afisare: print Variabila
sau: print ”orice sir de caractere inclus
intre ghilimele, inclusiv \n pentru 'linie noua'...”
7 – Citire: read Variabila

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

# Afisare vector sortat:


print ”v sortat:\n”
i=0
while i < 9 print v[i] print ”, ” i = i+1 end # Un while intr-o singura linie.
print v[9]
print ”.”

1.Descrierea generala a programului

Blocurile principale ale programului sunt reprezentate de către analiza lexicala și


analiza sintactica.

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.

Exemple de atomi lexicali:


-cuvinte cheie
-identificatori
-semne de punctuatie
-operanzi

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.

Prin analiza sintactica înțelegem gruparea atomilor rezultati in urma analizei


lexicale in structuri sintactice. Exemple de structuri sintactice: expresii,
instructiuni, declaratii etc.

Rolul analizei sintactice(parsarea) este acela de a transforma un sir de atomi


lexicali într-o descriere structurala a acestora, verificand dacă sirul este sau nu
corect.

Expresii regulate corespunzatoare atomilor lexicali enumerati:


#-#
var – var
nume_variabila – [a-z]+
nume_vector – [a-z]+
[-[
]-]
numar_elemente – [0-9]+
= - =
+-+
- - -IMP
*-*
/-/
if – if
>->
<-<
~-~
&-&
else – else
end – end
while – while
print – print
read – read
”-”
\n - \n
string – [!-~]|[!-~]*
2.Analiza lexicala

Analizorul lexical reprezinta un program complex care realizeaza traducerea unui


program sursa intr-un program obiect. De obicei programul sursa este scris intr-un
limbaj de nivel superior celui in care este scris programul obiect.

Identificarea atomilor lexicali ai limbajului

#, var, nume_variabila, nume_vector, [, numar_elemente, ], =, +, -, *, /, if, >, <, ~,


&, else, end, while, print, read, ”, \n, string.

Clasele de atomi intalnite in majoritatea limbajelor de programare sunt:


identificatori, cuvinte cheie, constante numerice (intregi, reale, eventual
reprezentate în diferite baze de numeratie), operatori (aritmetici, logici,
relationali), semne de punctuatie, delimitatori, constante de tip caracter, respectiv
sir de caractere, comentarii.
Schema finala AFD :
3.Analiza sintactica

Analizatorul sintactic are rolul de a prelua lista de atomi și sa genereze arborele


sintactic la final.

4.Parcurgerea arborelui sintactic

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) {}
}

S-ar putea să vă placă și