Buna ziua,
MASINA VIRTUALA
Azi ne intalnim cu semigrupa a II-a care are de implementat
masina virtuala din Cap 6 al cartii despre constructia compilatoarelor.
Voi lucra simultan cu voi la implementare.
Planul este sa vedem masina virtuala ruland, desi acest lucru nu este impresionant.
Pentru indicatii va rog sa consultati pagina anterioara de blog, referitoare la masina virtuala.
Spor la lucru !
Indicatii de lucru suplimentare:
1) Pentru a putea reconstrui mai repede compilatorul puteti folosi un script, care include toate comenzile:
#!/bin/bash
echo "Se proceseaza fisierul \"simple.y\"... " &&
bison -vd simple.y &&
echo "OK." &&
echo -n "Se compileaza fisierul \"simple.tab.c\"... " &&
gcc -c simple.tab.c &&
echo "OK." &&
echo -n "Se proceseaza fisierul \"simple.lex\"... " &&
flex simple.lex &&
echo "OK."
echo -n "Se compileaza fisierul \"lex.yy.c\"... " &&
gcc -c lex.yy.c &&
echo "OK." &&
echo -n "Se creaza executabilul \"simple\"... " &&
gcc -o simple simple.tab.o lex.yy.o -lm -lfl &&
echo "OK."
exit 0
In cazul in care obtineti aparente erori care sunt de fapt Warning-uri, includeti intre optiunile de compilare optiunea care va este recomandata.
2) Aveti nevoie de alti specificatori de format in C, atunci cand treceti de la 16 la 32 de biti.
Deci in codul masinii virtuale s-ar putea sa aveti nevoie doar de:
%d - numere zecimale in loc de
%ld - numere "long decimals"
Modificarea este aceasta:
"scanf ( "%ld", & stack [ ar + ir.arg ] );" -->
"scanf ( "%d", & stack [ ar + ir.arg ] );";
3) Functia de ridicare la putere nu este implementata in carte si este lasta ca un fel de exercitiu. Folositi functia pow() din biblioteca matematica math.h.
In final in cazul case PWR veti avea:
"stack [ top - 1 ] = pow ( stack [ top - 1 ], stack [ top ] );"
Functia pow este din biblioteca math.h.
Treceti va rog la pagina urmatoare de blog.
Niciun comentariu:
Trimiteți un comentariu