Skip to content

Commit

Permalink
instrukce HLEDEJ jede!
Browse files Browse the repository at this point in the history
  • Loading branch information
paulslaby committed Dec 10, 2011
1 parent 37046f5 commit 84ba0c8
Show file tree
Hide file tree
Showing 6 changed files with 154 additions and 48 deletions.
84 changes: 62 additions & 22 deletions interpret.c
Original file line number Diff line number Diff line change
Expand Up @@ -372,10 +372,10 @@ int Interpret(UkTSezInstr list) {
UkTBSPolozka retezec = ((UkTBSPolozka)ukinstr->op2); // kam
UkTBSPolozka ukazatel = ((UkTBSPolozka)ukinstr->op3); // co
UkTSezPar L = ((UkTSezPar)ukinstr->op1);
set_first(L);
L->aktivni = L->prvni;

while(L->aktivni != NULL){
printf("!!!!!!!!!!!!!!!!!! %s\n", retezec->data.dataRet);
//printf("!!!!!!!!!!!!!!!!!! %s\n", retezec->data.dataRet);
if(strcmp(L->aktivni->parametr.klic, retezec->data.dataRet) == 0){

PomUk = L->aktivni;
Expand Down Expand Up @@ -470,27 +470,67 @@ int Interpret(UkTSezInstr list) {
*/
}
break;


// instrukce pro hledani promenne v globalnim zasobniku
case IN_HLEDEJ:
//break; //TODO: pozor, odstranit!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
printf("--------------- kam_priradit ma hodnotu: %s -----------------------\n", ukinstr->op2->data.dataRet);
UkTBSPolozka *pomocna_kralici_polozka;
pomocna_kralici_polozka = (UkTBSPolozka*) ukinstr->op3;
if(najdi_prom((UkTSezPar)ukinstr->op1, ukinstr->op2->data.dataRet, pomocna_kralici_polozka) == TRUE){
//printf("promenna nalezena!! typ %d\n", (*ukinstr->op3).typ);
}else{
printf("promenna nebyla do haje nalezena!!!!!!!!!!!!!!!\n");
}
printf("op3: %d\n", (*((UkTBSPolozka*) ukinstr->op3))->typ);
printf("------------------------------------------------navratova hodnota pred pred %d\n", (int) (*((UkTBSPolozka*) ukinstr->op3)));
break;
//konec interpretu
case IN_KONEC:
return KONEC_OK;

default:
break;
}
case IN_HLEDEJ:;
/*//break; //TODO: pozor, odstranit!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
printf("--------------- kam_priradit ma hodnotu: %s -----------------------\n", ukinstr->op2->data.dataRet);
UkTBSPolozka *pomocna_kralici_polozka;
pomocna_kralici_polozka = (UkTBSPolozka*) ukinstr->op3;
if(najdi_prom((UkTSezPar)ukinstr->op1, ukinstr->op2->data.dataRet, pomocna_kralici_polozka) == TRUE){
//printf("promenna nalezena!! typ %d\n", (*ukinstr->op3).typ);
}else{
printf("promenna nebyla do haje nalezena!!!!!!!!!!!!!!!\n");
}
printf("op3: %d\n", (*((UkTBSPolozka*) ukinstr->op3))->typ);
printf("------------------------------------------------navratova hodnota pred pred %d\n", (int) (*((UkTBSPolozka*) ukinstr->op3)));
break;*/

//op1 = zasobnik;
//op2 = int
//op3 = uktbsplzka s retezcem
UkTPlzkaSez pom_uk;
UkTBSPolozka *pomocna_kralici_polozka=NULL;
pom_uk = list->aktivni; // zapamatuji kam se vratit
pomocna_kralici_polozka = malloc(100);
list->aktivni = list->aktivni->ukdalsi;
while (list->aktivni->instrukce.typInstr == IN_HLEDEJ){
list->aktivni = list->aktivni->ukdalsi;
}
// list aktivni je prvni instrukce za hledej

if(najdi_prom((UkTSezPar)ukinstr->op1, ukinstr->op3->data.dataRet, pomocna_kralici_polozka) == TRUE){
printf("promenna nalezena!!\n");
}else{
printf("promenna nebyla do haje nalezena!!!!!!!!!!!!!!!\n");
}

//priradim vyhledany ukazatek do spravneho operandu spravne instrukce
switch((int) ukinstr->op2->data.dataCis){
case 1:
printf("prepisuji prvni operand\n");
list->aktivni->instrukce.op1 = *pomocna_kralici_polozka;
break;
case 2:
printf("prepisuji druhy operand\n");
list->aktivni->instrukce.op2 = *pomocna_kralici_polozka;
break;
default:
printf("fatal error pri predavani do instrukce IN_HLEDEJ");
}

// navrat aktivity zpet
list->aktivni = pom_uk;

break;
//konec interpretu
case IN_KONEC:
return KONEC_OK;

default:
break;
}

if (ukinstr->typInstr != IN_GOTO && ukinstr->typInstr != IN_PGOTO) {
Sez_dalsi(list); //presuneme se na dalsi instrukci
Expand Down
2 changes: 1 addition & 1 deletion interpret.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ typedef enum nazvyInstrukci {
//STRUKTURY -----------------------------------------------

//struktura pro jednotlive instrukce
//ukazatel na void se pozdeji pretipuje
//ukazatel na void se pozdeji pretypuje
typedef struct {
int typInstr; // typ instrukce
UkTBSPolozka op1; // adresa 1
Expand Down
2 changes: 1 addition & 1 deletion kod
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
function main()
local a=5;
local b;
local b=3;
local c="retezec";

--a=1;
Expand Down
98 changes: 81 additions & 17 deletions parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,8 @@ int preved_z_tokenu(int dalsi_token) {
return MENSI;
case DOLAR:
return DOLAR;
case MYIDKONEC:
return MYIDKONEC;

}

Expand Down Expand Up @@ -2010,14 +2012,15 @@ int syntax_vyrazu() {
BVSVloz(&pom_tab_sym, gen_klic, obsah);
BVSNajdi(pom_tab_sym, gen_klic, &navratova_hodnota);

/*
generuj_klic(0, &gen_klic);
BVSVloz(&pom_tab_sym, gen_klic, NULL);
BVSNajdi(pom_tab_sym, gen_klic, &op3);
Vloz_instrukci(seznam_instrukci, IN_HLEDEJ, zas_zpracovani, navratova_hodnota, &op3);
//printf("U ID: op3->typ: %d\n", op3->typ);
navratova_hodnota = op3;
//pom_prvek->uk_na_prvek_ts = navratova_hodnota;
//pom_prvek->uk_na_prvek_ts = navratova_hodnota;*/
}

// Vlozeni do pomocne tabulky symbolu
Expand Down Expand Up @@ -2128,20 +2131,22 @@ int syntax_vyrazu() {
obsah->typ = TDRETEZEC;
Ret_alokuj(&obsah->data.dataRet, token->delka + 1);
strcpy (obsah->data.dataRet, token->data);
generuj_klic(0, &gen_klic);
BVSVloz(&pom_tab_sym, gen_klic, obsah);
BVSNajdi(pom_tab_sym, gen_klic, &navratova_hodnota);

generuj_klic(0, &gen_klic);
BVSVloz(&pom_tab_sym, gen_klic, obsah);
BVSNajdi(pom_tab_sym, gen_klic, &navratova_hodnota);

generuj_klic(0, &gen_klic);
BVSVloz(&pom_tab_sym, gen_klic, NULL);
BVSNajdi(pom_tab_sym, gen_klic, &op3);
/*
generuj_klic(0, &gen_klic);
BVSVloz(&pom_tab_sym, gen_klic, NULL);
BVSNajdi(pom_tab_sym, gen_klic, &op3);
Vloz_instrukci(seznam_instrukci, IN_HLEDEJ, zas_zpracovani, navratova_hodnota, &op3);
//printf("U ID: op3->typ: %d\n", op3->typ);
navratova_hodnota = op3;
//printf("U ID: navratova_hodnota->typ: %d\n", navratova_hodnota->typ);
//pom_prvek->uk_na_prvek_ts = navratova_hodnota;
printf("------------------------------------------------navratova hodnota pred %d\n", (int) navratova_hodnota);
printf("------------------------------------------------navratova hodnota pred %d\n", (int) navratova_hodnota);*/
}

// Vlozeni do pomocne tabulky symbolu
Expand Down Expand Up @@ -2237,11 +2242,12 @@ int syntax_vyrazu() {
return ERR_INTERNI;
}

prom2 = prom1;
prom1 = preved_z_tokenu(prom1);

// pokud se pri redukci prvek na zasobniku nerovna nicemu z case pod, tak to musim breaknout,
// ptz se neda redukovat podle zadnyho pravidla !!!
if((prom1 != OPIDENTIFIKATOR) && (prom1 != NETERMINAL) && (prom1 != OPPRAVAZAVORKA)) {
if((prom1 != OPIDENTIFIKATOR) && (prom1 != MYIDKONEC) && (prom1 != NETERMINAL) && (prom1 != OPPRAVAZAVORKA)) {
printf("Neodpovida zadnemu pravidlu --> BREAK\n");
return ERR_SYNTAX;
}
Expand Down Expand Up @@ -2287,8 +2293,16 @@ int syntax_vyrazu() {
// return ERR_INTERNI;
//}

if(zasobnik_push(&zas_uk, NETERMINAL, &zas_int, ukprom) == ERR_INTERNI) {
return ERR_INTERNI;
if(prom2 == IDKONEC) {
if(zasobnik_push(&zas_uk, MYIDKONEC, &zas_int, ukprom) == ERR_INTERNI) {
return ERR_INTERNI;
}
}

else {
if(zasobnik_push(&zas_uk, NETERMINAL, &zas_int, ukprom) == ERR_INTERNI) {
return ERR_INTERNI;
}
}

printf("==========\nKolik_neterminalu = %d\n==========\n", kolik_neterminalu);
Expand Down Expand Up @@ -2325,9 +2339,10 @@ int syntax_vyrazu() {
return ERR_INTERNI;
}


prom2 = preved_z_tokenu(prom2);

if((prom1 == NETERMINAL) && (prom2 == OPLEVAZAVORKA) && (prom3 == MENSI)) {
if(((prom1 == NETERMINAL) || (prom1 == MYIDKONEC)) && (prom2 == OPLEVAZAVORKA) && (prom3 == MENSI)) {

if(zasobnik_pristup_uk(&zas_uk, &ukprom, 1)) {
return ERR_INTERNI;
Expand Down Expand Up @@ -2360,8 +2375,16 @@ int syntax_vyrazu() {
// return ERR_INTERNI;
//}

if(zasobnik_push(&zas_uk, NETERMINAL, &zas_int, ukprom) == ERR_INTERNI) {
return ERR_INTERNI;
if(prom1 == MYIDKONEC) {
if(zasobnik_push(&zas_uk, MYIDKONEC, &zas_int, ukprom) == ERR_INTERNI) {
return ERR_INTERNI;
}
}

else {
if(zasobnik_push(&zas_uk, NETERMINAL, &zas_int, ukprom) == ERR_INTERNI) {
return ERR_INTERNI;
}
}

if(kolik_neterminalu == 0) {
Expand All @@ -2382,6 +2405,8 @@ int syntax_vyrazu() {


case NETERMINAL: // redukce podle pravidla E -> E + E atd.
case MYIDKONEC:


zasobnik_pristup_int(&zas_int, &prom1, 1);
prom1 = preved_z_tokenu(prom1);
Expand Down Expand Up @@ -2437,24 +2462,61 @@ int syntax_vyrazu() {
return ERR_INTERNI;
}

if((prom1 == NETERMINAL) && (prom2 == MENSI)) {
if(((prom1 == NETERMINAL) || (prom1 == MYIDKONEC)) && (prom2 == MENSI)) {


ukprom = NULL;

if(zasobnik_pristup_uk(&zas_uk, &ukprom, 0)) {
return ERR_INTERNI;
}

if(zasobnik_pristup_int(&zas_int, &prom3, 0)) {
return ERR_INTERNI;
}

op2 = ukprom;

if(prom3 == MYIDKONEC) {
obnov(&obsah);
obsah->typ=TDCISLO;
obsah->data.dataCis = 2;

generuj_klic(0, &gen_klic);
BVSVloz(&pom_tab_sym, gen_klic, obsah);
BVSNajdi(pom_tab_sym, gen_klic, &navratova_hodnota);

Vloz_instrukci(seznam_instrukci, IN_HLEDEJ, zas_zpracovani, navratova_hodnota, ukprom);
op2 = NULL;
}

ukprom = NULL;

if(zasobnik_pristup_uk(&zas_uk, &ukprom, 2)) {
return ERR_INTERNI;
}

if(zasobnik_pristup_int(&zas_int, &prom4, 2)) {
return ERR_INTERNI;
}

op1 = ukprom;



if(prom4 == MYIDKONEC) {
obnov(&obsah);
obsah->typ=TDCISLO;
obsah->data.dataCis = 1;

generuj_klic(0, &gen_klic);
BVSVloz(&pom_tab_sym, gen_klic, obsah);
BVSNajdi(pom_tab_sym, gen_klic, &navratova_hodnota);
printf("navratova_hodnota: %d\n", navratova_hodnota->typ);
Vloz_instrukci(seznam_instrukci, IN_HLEDEJ, zas_zpracovani, navratova_hodnota, ukprom);
op1 = NULL;
}

generuj_klic(0, &gen_klic);
BVSVloz(&pom_tab_sym, gen_klic, NULL);
BVSNajdi(pom_tab_sym, gen_klic, &op3);
Expand Down Expand Up @@ -2519,7 +2581,7 @@ int syntax_vyrazu() {
zasobnik_pristup_int(&zas_int, &prom1, j);
prom1 = preved_z_tokenu(prom1);

if((prom1 != NETERMINAL) && (prom1 != MENSI)) {
if((prom1 != NETERMINAL) && (prom1 != MYIDKONEC) && (prom1 != MENSI)) {
uk_na_terminal = zas_int.top - j;
break;
}
Expand Down Expand Up @@ -2613,7 +2675,7 @@ int syntax_vyrazu() {

// pokud uz na vstupni pasce nic neni, ale na zasobniku je neco jineho nez $E,
// tak je to synt chyba
if(!((prom1 == NETERMINAL) && (prom2 == DOLAR) && (zas_int.top == 1))) {
if(!(((prom1 == NETERMINAL) || (prom1 == MYIDKONEC)) && (prom2 == DOLAR) && (zas_int.top == 1))) {
//err_chyba = ERR_SYNTAX;
printf("CHYBA\n");
return ERR_SYNTAX;
Expand All @@ -2623,3 +2685,5 @@ int syntax_vyrazu() {
return err_chyba;

} // konec funkce syntax_vyrazu()


7 changes: 4 additions & 3 deletions scaner.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,10 @@ typedef enum {
MENSIROVNO, // <=
MENSITKOKONEC, // <
NEROVNASE, // ~=
IDKONEC, // identifikator
MINUSKONEC, // -
ENDOFFILE, // EOF //23
IDKONEC, // identifikator
MINUSKONEC, // -
MYIDKONEC, // pomocny identifikator pro Martinu
ENDOFFILE, // EOF //24

//klicova slova
TNDO, TNELSE, TNEND, TNFALSE, TNFUNCTION, TNIF, TNLOCAL,
Expand Down
9 changes: 5 additions & 4 deletions seznam.c
Original file line number Diff line number Diff line change
Expand Up @@ -131,12 +131,13 @@ int insert_last(UkTSezPar L, char *ret) {

if (L->prvni == NULL) { //seznam je prazdny
L->prvni = PomUk;
L->aktivni = PomUk;
L->posledni = PomUk;
printf("mozna\n");
}
else {
L->posledni->ukdalsi = PomUk;
L->posledni = L->posledni->ukdalsi;
L->posledni->ukdalsi = PomUk;
L->posledni = L->posledni->ukdalsi;
}

return ERR_OK;
Expand Down Expand Up @@ -281,9 +282,9 @@ int najdi_prom(UkTSezPar L, char *K, UkTBSPolozka *ukazatel){
printf("klic aktivniho je: %s\n", L->aktivni->parametr.klic);
printf("klic hledany je: %s\n", K);
if(strcmp(L->aktivni->parametr.klic, K) == 0){
printf("najdi_prom: prirazuji data: %d, %f\n", L->aktivni->parametr.data->typ, L->aktivni->parametr.data->data.dataCis);
//printf("najdi_prom: prirazuji data: %d, %f\n", L->aktivni->parametr.data->typ, L->aktivni->parametr.data->data.dataCis);
*ukazatel = L->aktivni->parametr.data;
printf("najdi_prom: prirazuji data: %d, %f\n", (*ukazatel)->typ, (*ukazatel)->data.dataCis);
//printf("najdi_prom: prirazuji data: %d, %f\n", (*ukazatel)->typ, (*ukazatel)->data.dataCis);
//printf("ukazatel: %d\n", (int)ukazatel);


Expand Down

0 comments on commit 84ba0c8

Please sign in to comment.