13
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 BIĆE REALIZOVAN NAKNADNO 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

REŠENJE - TFZR Zadaci za 8...Naziv – KORISTIMO PRAVILO sastoji se od velikih slova, slova malih slova, brojeva, ali da ne pocinje brojem… Dopunjuje se tabela dozvoljenih simbola

  • Upload
    others

  • View
    8

  • Download
    0

Embed Size (px)

Citation preview

  • 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 – BIĆE REALIZOVAN NAKNADNO

    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

    https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/introduction

  • 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()); }

    Kljucne reci: Private, void, Click, object, sender, EventArgs e, Text

    NAPOMENA: slovo e ne možemo smatrati ključnom reči i dodeliti je token, jer bi napravilo problem prilikom zamene, zato priključujemo Event Args da budu zajedno.

  • IMENA (NAZIV procedura, funkcija, promenljivih) u C# Pogledati sa zvanicnog sajta:

    https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/naming-guidelines?redirectedfrom=MSDN

    General Naming Conventions

    This section describes general naming conventions that relate to word choice, guidelines on using abbreviations and acronyms, and recommendations

    on how to avoid using language-specific names.

    Word Choice

    ✔ ️DO choose easily readable identifier names.

    For example, a property named HorizontalAlignment is more English-readable than AlignmentHorizontal.

    ✔ ️DO favor readability over brevity.

    The property name CanScrollHorizontally is better than ScrollableX (an obscure reference to the X-axis).

    ❌ DO NOT use underscores, hyphens, or any other nonalphanumeric characters.

    ❌ DO NOT use Hungarian notation.

    ❌ AVOID using identifiers that conflict with keywords of widely used programming languages.

    According to Rule 4 of the Common Language Specification (CLS), all compliant languages must provide a mechanism that allows access to named items

    that use a keyword of that language as an identifier. C#, for example, uses the @ sign as an escape mechanism in this case. However, it is still a good

    idea to avoid common keywords because it is much more difficult to use a method with the escape sequence than one without it.

    Using Abbreviations and Acronyms

    ❌ DO NOT use abbreviations or contractions as part of identifier names.

    For example, use GetWindow rather than GetWin.

    ❌ DO NOT use any acronyms that are not widely accepted, and even if they are, only when necessary.

    Avoiding Language-Specific Names

    ✔ ️DO use semantically interesting names rather than language-specific keywords for type names.

    For example, GetLength is a better name than GetInt.

    ✔ ️DO use a generic CLR type name, rather than a language-specific name, in the rare cases when an identifier has no semantic meaning beyond its

    type.

    Jos jedno jednostavnije objasnjenje:

    C# Variable Naming and the @ Symbol by Richard Carr, published at http://www.blackwasp.co.uk/CSharpAtNaming.aspx

    C# allows very flexible naming of variables and other symbols. This includes the use of alphanumeric characters, a mixture of upper and lower case letters and the underscore symbol. It is even possible to use a variable name that is a reserved word. Variable Naming The C# programming language is very flexible when it comes to the naming of variables. In some cases one could argue that it is too flexible, as it allows names that cannot be used by other .NET languages with which you may want to interoperate. However, it is the ability to write classes and structures in multiple languages that requires that unusual naming is permitted. Most C# variables are named using a mixture of alphanumeric characters, where the letters may be upper case, lower case or a combination of the two. You can also include underscore characters in a name. Some developers use these when a variable name is a combination of several words, placing underscores to represent spaces. Other programmers may use camel case or Pascal case to show the position of new words. Some developers, myself included, like to use an underscore at the start of a private field's name. The only limitations when combining underscores, letters and numeric digits are that a name cannot start with a number and the name must not be a reserved word. To ensure that items can be accessed from other languages, you should also avoid public members that can only be distinguished by their capitalisation. All of the following are valid names: int myVariable;

    https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/naming-guidelines?redirectedfrom=MSDNhttps://profiles.google.com/113882985360066691734http://www.blackwasp.co.uk/CSharpAtNaming.aspxhttp://www.blackwasp.co.uk/CSharpFundamentals.aspxhttp://www.blackwasp.co.uk/CSharpSimpleClass.aspxhttp://www.blackwasp.co.uk/CSharpStructures.aspxhttp://en.wikipedia.org/wiki/CamelCase

  • int myVariable2; int _myVariable; int my_variable; int _;

    The four variables below are invalid: int 123; int 1Variable; int _myVariable$; int foreach;

    The @ Symbol A less commonly used symbol for naming variables is the @ character. This can be positioned at the start of a variable's name. It does not change the name of a variable, which is why if you try to build the following code you see a compiler error indicating that myVariable is defined twice. int myVariable; int @myVariable;

    The benefit of the @ symbol is that the name it precedes can be a reserved word. This means that we can reference names that are the same as keywords or standard data types. The following two declarations are, therefore, valid. Removing the @ symbol in either case would cause build errors. int @foreach; int @int;

    Naziv – KORISTIMO PRAVILO sastoji se od velikih slova, slova malih slova, brojeva, ali da ne pocinje brojem… Dopunjuje se tabela dozvoljenih simbola da svaki karakter ima token značenja.

    Dodata klasa koja nasledjuje opstu klasu clsSimbol, koja ima token (znacenje simbola) kao dodatni atribut.

  • KONAČNO, REŠENJE REKONSTRUKCIJE I LEKSIČKE ANALIZE:

    KADA BISMO NAMERNO DODALI ?!^$ tj. karaktere koji nisu u spisku specijalnih karaktera koji se mogu prepoznati (ovo je hipoteticki primer gde namerno ih nismo uvrstili u tabelu specijalnih karaktera) KAKO BISMO PROVERILI

    KAKO REAGUJE U TAKVOJ SITUACIJI:

  • Nakon kompletne leksičke analize, provereni su svi karakteri, provereni I zamenjeni tokenima: specijalni karakteri sa značenjem, ključne reči I nazivi, tako da je ceo tekst tokenizovan. Ulazni tekst je zamenjen tokenima, a svi inicijalni elementi I prateći tokeni se nalaze u ureĎenoj listi objekata koji sadrže podatke leksemama (početnim rečima u tekstu) I njihovim odgovarajućim tokenima. Da bismo sačuvali ovu listu, možemo podatke sačuvati u bazu podataka

    ili u neku datoteku. Trajno snimanje sadržaja memorijskih kolekcija u datoteke ili u neki drugi oblik trajnog cuvanja zove se serijalizacija. U ovom primeru sačuvan je sadržaj u XML datoteku. Iz nje se lako kasnije može ponovo učitati radi dalje analize I transformacija.

    // 3.14.4. SERIJALIZACIJA LISTE OBJEKATA tj. liste svih LEKSEMA I NJIHOVIH TOKENA koji su detektovani u tekstu - snimanje sadržaja memorijske kolekcije u datoteku DataSet dsPodaciZaSerijalizaciju = new DataSet(); clsSimbolSaTokenom elementListeZaSerijalizaciju = new clsSimbolSaTokenom(); DataRow objRedPodataka; dsPodaciZaSerijalizaciju.ReadXml("SablonXMLSerijalizacijeSvihLeksickihTokena.XML"); // ucitavanje XML sheme, ali ima bolji nacin: XSD fajl koji tome sluzi. for (int brojacListeTokena = 0; brojacListeTokena < ukupanBrojSvihTokena; brojacListeTokena++) { objRedPodataka = dsPodaciZaSerijalizaciju.Tables[0].NewRow(); // svaki put se instancira novi objekat tipa DataRow i to po strukturi koju ima dataset koji je prethodno definisao strukturu ucitavanjem sablona XML elementListeZaSerijalizaciju = objListaSvihTokena.DajElementListe(brojacListeTokena); objRedPodataka[0] = elementListeZaSerijalizaciju.Karakter; objRedPodataka[1] = elementListeZaSerijalizaciju.ASCIIKaraktera; objRedPodataka[2] = elementListeZaSerijalizaciju.TipKaraktera; objRedPodataka[3] = elementListeZaSerijalizaciju.TokenSimbola; dsPodaciZaSerijalizaciju.Tables[0].Rows.Add(objRedPodataka); } dsPodaciZaSerijalizaciju.WriteXml("SerijalizacijaListeLeksemaITokena.XML"); // 3.14.5. prikaz serijalizovanih podataka u gridu dgvSveLeksemeITokeni.DataSource = dsPodaciZaSerijalizaciju.Tables[0]; dgvSveLeksemeITokeni.Refresh();

  • ######################################################## PREOSTALI DEO ZA IMPLEMENTACIJU:

    Imena grafickih kontrola – posebna tabela za to…I onda imaju osobine u skladu sa tipom kontrole. Sintaksno ispravno:

    Naziv_Click

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