-
Notifications
You must be signed in to change notification settings - Fork 0
mirunamariafatu/Abstract-Syntax-Tree
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
//////////////////////////// TEMA 3 - AST \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ Fatu Miruna-Maria 321CA ================================ iocla_atoi ================================= Rol: converteste un sir de caractere in numar -> In registrul edi se retine sirul de caractere ce urmeaza sa fie analizat -> Initial, se verifica primul caracter pentru a determina daca numarul este negativ sau pozitiv - pentru numerele negative, se introduce "1" pe stiva (is_signed) - pentru numerele pozitive, se introduce "0" pe stiva -> Folosind intructiunea loop (cycle), sirul de caractere va fi parcurs byte cu byte ("cifra cu cifra") -> Ebx retine rezultatul temporar obtinut in urma ultimei iteratii (eticheta multiply) -> Pentru a obtine valoarea numerica a caracterului curent se scade 0x30 -> Se adauga valoarea numerica a caracterului curent la rezultatul obtinut in urma inmultirii cu 10 (in ebx) -> Dupa ce toate caracterele au fost analizate, se va verifica daca numarul creat trebuie sa fie negativ sau pozitiv -> Verificarea se face printr-un pop al elementului introdus la inceputul functiei - daca elementul este 0, numarul creat (din ebx) ramane neschimbat - daca elementul este 1, se acceseaza eticheta set_signed_number -> In final, numarul creat va fi stocat in eax Etichete: %%%% is_signed %%%% - daca se acceseaza aceasta eticheta inseamna ca este un numar cu semn - se introduce "1" pe stiva - se incrementeaza edi pentru a trece peste caracterul "-" %%%% multiply %%%% - la fiecare iteratie, rezultatul din ebx, va fi inmultit cu 10 - inmultirea se va realiza prin adunarea repetatata a numarului cu ajutorul intructiunii loop (eticheta addition) %%%% set_signed_number %%%% - daca s-a intrat in aceasta eticheta inseamna ca se doreste valoarea negativa a numarului curent - se efectueaza 0 - numar(stocat in ebx) =================================== create_tree ============================== Rol: creeaza un arbore sintactic folosind sirul de caractere din stiva Pentru crearea arborelui, am utilizat 3 functii: -> create_tree - functia principala -> get_data -> create_new_node ------------------------------------- create_tree ----------------------------- -> Registrul edi va retine sirul de caractere din care se vor extrage elemente (numere sau operanzi) pentru a construi arborele -> Se apeleaza functia create_new_node pentru a crea radacina arborelui -> Dupa apelul functiei, in eax se va afla adresa nodului radacina -> Se retine adresa nodului radacina in root -> Pentru ca mereu primul element din sirul de caractere va fi un operand, se va incepe recursivitatea pe partea stanga a arborelui (recursive_left) Etichete: %%%% recursive_left %%%% - se extrage din stiva adresa nodului precedent- node(nodul cu care se va face linkarea cu un nou nod stang) - se adauga 4 adresei nodului precedent (se obtine adresa la care va fi adaugat nodul stang) - prin apelul functiei create_new_node se va crea nodul stang care urmeaza sa fie adaugat - in urma apelului functiei de creare a nodului, in eax va fi stocata adresa nodului nou creat - se creeaza legatura dintre nodul precedent si nodul curent (node <-> left_node) - se extrage continutul de la char* data pentru a verfica daca este un numar sau operand - daca este operand, se acceseaza eticheta is_operand - daca este numar, se acceseaza eticheta is_number %%%% recursive_right %%%% - se extrage din stiva adresa nodului precedent -node (nodul cu care se va face linkarea cu un nou nod drept) - se adauga 8 adresei nodului precedent intrucat aceea va fi adresa unde se va adauga nodul drept - se creeaza un nou nod prin apelul functiei create_new_node - se verifica daca este libera adresa unde va fi linkat nodul nou creat - daca adresa este deja ocupata cu alt nod, se acceseaza eticheta is_full - dupa ce a fost gasita o adresa valida(libera), se face linkarea (node <-> right_node) - se verifica daca continutul de la char* data din noul nod creat este numar sau operand - daca este operand, se acceseaza eticheta is_operand - daca este numar, se acceseaza eticheta is_number %%%% is_operandL %%%% - se introduce pe stiva adresa nodului nou creat, intrucat adresa sa va mai fi folosita - se continua recursivitatea pe nodul stand %%%% is_numberL %%%% - se continua recursivitatea pe nodul drept %%%% is_full %%%% - daca a fost accesata aceasta eticheta inseamna ca adresa la care ar trebui linkat un nou nod drept este deja ocupata - se extrage din stiva adresa unui nou nod pentru a se reface verificarea - se accseaza aceasta eticheta pana la gasirea unei adrese valide (neocupata) ----------------------------------- get_data ---------------------------------- Rol: -creeaza si aloca memorie pentru char* data -intoarce adresa la care este stocat char* data -> Se extrage succesiv cate un caracter din string-ul din input, fiind inserat si in stiva -> Se repeta extragerea caracterelor pana la intalnirea delimitatorului -> Se aloca memorie pentru char* data -> Se creeza sirul de caractere data (create_string) Etichete: %%%% create_string %%%% - la adresa intoarsa in urma alocarii de memorie se adauga fiecare caracter valid introdus in stiva ----------------------------- create_new_node --------------------------------- Rol: -creeaza un nou nod ce contine char* data si pointeri catre nodul din stanga si nodul din dreapta - intoarce adresa noului nod creat -> Prin apelul functiei get_data se obtine adresa si sirul de caractere char* data -> Se aloca memorie pentru un nou nod (node) -> Se efectueaza linkarea node <-> char *data -------------------------------------------------------------------------------
About
The main objective of the project is specifically to create an AST - abstract syntax tree - by parsing a mathematical expression in a prefixed form.
Topics
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published