PROGRAMSKI PREVODIOCI 2019-20
Predmetni nastavnik i asistent: Doc. dr Ljubica Kazi
8. ČAS VEŽBI
ZADATAK
Tema: Implementacija PP simulatora za leksičku, sintaksnu i semantičku analizu teksta programskog koda.
Završiti implementaciju:
Za primer segmenta programskog koda:
a) btnSvi_Click
private void btnSvi_Click(object sender, EventArgs e)
{
txbFilterNazivRobe.Text = "";
NapuniGrid(DajSveNarudzbe());
}
b) btnFilter_Click
private void btnFilter_Click(object sender, EventArgs e)
{
if (txbFilterNazivRobe.Text.Equals(""))
{
MessageBox.Show("Niste uneli kriterijum filtriranja!");
txbFilterNazivRobe.Focus();
return;
}
else
{
NapuniGrid(DajNarudzbePremaRobi(txbFilterNazivRobe.Text));
}
}
Realizovati u okviru PP_simulatora deo programa za analizu teksta programskog koda - leksička, sintaksna i semantička provera.
Uzeti u obzir primere tipičnih semantičkih grešaka programiranja, koje su date u prilogu.
REŠENJE
1. FAZA – REKONSTRUKCIJA ULAZNOG TEKSTA PROGRAMSKOG KODA
1.1. KORAK – rekonstrukcija brisanjem nepotrebnih praznina
UNETA VREDNOST
OBRISANE PRAZNINE
1.2. Rekonstrukcija brisanjem “ENTER”, tj. CarriageReturn (simbol za novi red, ASCII karakter 13)
2. LEKSIČKA ANALIZA PROGRAMSKOG KODA
S obzirom na C# programski jezik, treba konsultovati pravila:
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/
Osnove sintakse C# jezika:
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/introduction
Kreiranje tabele dozvoljenih simbola za C# (za podskup karaktera koji su u prvom primeru)
Dodavanje stranice za prikaz karaktera
Klasa clsAnalizatorReci je izmenjena, da bude case sensitive, da bi razlikovao velika i mala slova.
private void FormirajIzlaznuListuSimbolaSaTipovimaKaraktera()
…
// da bi razlikovao velika i mala slova u okviru Select (filtera) ovo je dodato
dsTabelaDozvoljenihSimbola.Tables[0].CaseSensitive = true;
//
DataRow[] drRedoviFiltera = dsTabelaDozvoljenihSimbola.Tables[0].Select("Karakter='" + objStariSimbol.Karakter.ToString() + "'");
Prepoznaje sve, ali neke karaktere ne, a nisu vidljivi. TReba da vidimo koji je njihov ASCII kod, da bismo prilikom rekonstruiranja i njih eliminisali.
OTKLANJANJE NEPREPOZNATIH KARAKTERA, KOJI NISU VIDLJIVI
Dodat je i ASCII kod za karakter u klasu clsSimbol.
Klasa clsAnalizator je prosirena da detektuje ASCII kod za svaki izdvojeni karakter:
Izmenjen deo metode
private void FormirajIzlaznuListuSimbolaSaTipovimaKaraktera()
…
DataRow[] drRedoviFiltera = dsTabelaDozvoljenihSimbola.Tables[0].Select("Karakter='" + objStariSimbol.Karakter.ToString() + "'");
// ovaj deo svakako uradi
objDopunjeniSimbol.Karakter = objStariSimbol.Karakter;
objDopunjeniSimbol.ASCIIKaraktera =Encoding.ASCII.GetBytes(objStariSimbol.Karakter)[0];
// ovaj deo proverava da li je uspesno nasao karakter ili nije
try
{
prepoznatiTipKaraktera = drRedoviFiltera[0].ItemArray[1].ToString();
objDopunjeniSimbol.TipKaraktera = prepoznatiTipKaraktera;
}
catch (Exception greska)
{
objDopunjeniSimbol.TipKaraktera = "nije prepoznat";
}
objSimbolListaIzlaz.DodajElementListe(objDopunjeniSimbol);
U osnovnom programu izmenjeno prikazivanje:
for (int brojacElemenataListe = 0; brojacElemenataListe < ukupanBrojElemenataListe; brojacElemenataListe++)
{
rtbPrepoznavanjeKaraktera.AppendText(objSimbolListaIzlaz.DajElementListe(brojacElemenataListe).Karakter + " - tip:" + objSimbolListaIzlaz.DajElementListe(brojacElemenataListe).TipKaraktera + " ASCII:" + objSimbolListaIzlaz.DajElementListe(brojacElemenataListe).ASCIIKaraktera + System.Environment.NewLine);
}
Treba uključiti u rekonstrukciju i karakter sa ASCII vrednosti 10, da se izbaci.
Dodavanje provere da li su generalno svi karakteri korektni:
PROVERA KLJUCNIH RECI
private void btnSvi_Click(object sender, EventArgs e)
{
txbFilterNazivRobe.Text = "";
NapuniGrid(DajSveNarudzbe());
}
Ime – PRAVILO sastoji se od slova velikih I malih I _, brojeva, ali da ne pocinje brojem…
Imena grafickih kontrola – posebna tabela za to…I onda imaju osobine u skladu sa tipom kontrole.
Kljucne reci:
Private, void, _Click, object, sender, EventArgs, e, .Text
SINTAKSNA PRAVILA
· Svaka procedura mora da ima () sa ili bez parametara, parameter moze biti ime jedno ili vise ili procedura.
· Svaka otvorena zagrada { mora imati svoj par zatvorenu }.
SEMANTICKA PRAVILA
· Procedura mora biti definisana u okviru istog fajla I navodi se samo imenom ili this.ImeProcedure.
· Ako procedura nije definisana u istom fajlu, onda se mora navesti naziv klase.nazivprocedure.
· Procedura treba da je definisane negde u istom fajlu, ali se preporucuje da bude napisana pre mesta koriscenja, gledano odozgo dole.
· Ako procedura ne vraca vrednost, ne mora se pisati promenljiva pre nje s leve strane I znak jednakosti.
· Ako procedura vraca vrednost, mora biti promeljiva I znak jednakosti da primi vrednost I ta promenljiva mora biti istog tipa kao I tip vrednosti koju vraca procedura.
· Ako se procedura navodi kao parameter poziva druge procedure, onda ona svojim pozivom vraca vrednost I to onog tipa kog je I parameter procedure na poziciji na kojoj se nalazi.