vilniaus universitetas - ims.mii.ltims.mii.lt/valentina/publ/progrkalb.pdf · 2 mokymo priemon÷je...

Download Vilniaus universitetas - ims.mii.ltims.mii.lt/valentina/publ/Progrkalb.pdf · 2 Mokymo priemon÷je ... studijų programos „Matematikos ir informatikos mokymas“ III kurso studentams

If you can't read please download the document

Upload: buidat

Post on 06-Feb-2018

237 views

Category:

Documents


12 download

TRANSCRIPT

  • 1

    PROGRAMAVIMO KALB TEORINIAI PAGRINDAI

    Mokymo priemon bakalauro studij programos

    Matematikos ir informatikos mokymas studentams

    Valentina Dagien

    Gintautas Grigas

    Vilniaus universitetas Matematikos ir informatikos fakultetas

    Matematikos ir informatikos metodikos katedra

    El. patas: [email protected]

    [email protected]

    Vilnius, 2007

  • 2

    Mokymo priemonje pateikiamos pagrindins procedrinio programavimo konstrukcijos, parodoma, kaip jos realizuojamos programavimo kalbose. Tikslas padti studentams susiformuoti sisteming poir vairias programavimo kalbas ir geriau orientuotis j vairovje. Akcentuojamos esmins semantins kalb struktros, irykinami bendri vairi kalb semantikos bruoai, kurie danai bna umaskuoti skirtingomis sintaksinmis struktromis.

    Mokymo priemon skiriama informatikos ir su ja susijusi specialybi pedagogini studij studentams. Mediaga dstoma taip, kad j pajgt suprasti skaitytojas, mokantys bent vien procedrinio programavimo kalb (pvz., Paskal, C).

    i mokymo priemon daugel met taikoma Matematikos ir informatikos fakulteto bakalauro studij programos Matematikos ir informatikos mokymas III kurso studentams dstant informatikos didaktik. Priemon numatyta kurso daliai.

  • 3

    vadas

    Programavimo kalb gyvavimo amius gana solidus engta penktj deimtmet: Dono Bekaus (John Backus) vadovaujama grup 1954 metais sukr pirmj programavimo kalb Fortran (Fortran) ir jos transliatori. Nuo to laiko iki iol pasaulyje sukurta keli tkstaniai programavimo kalb bei j transliatori.

    Vienos kalbos paplitusios daugelyje ali, vartojamos vairiausiems udaviniams sprsti, kitos egzistuoja tik vienoje ar kitoje alyje, ar net vienoje staigoje, dar kitos taikomos tik specialiems, kartais net labai siauros srities udaviniams sprsti. Taiau daugelis programuotoj paprastai moka tik kelet programavimo kalb, o daniausiai netgi vien arba dvi. Tuomet natraliai kyla klausimas, ar verta nagrinti, lyginti programavimo kalbas, jeigu daugumai programuotoj su daugeliu kalb praktikai neteks susidurti.

    Jei programavimo kalbas aptartume pavirutinikai, tik apvelgtume j konstrukcij vairov, tai i tokios painties nebt didels naudos nenaudojam kalb smulkius ypatumus greitai pamirtume.

    Visai kas kita, jeigu programavimo kalbas velgtume sistemingai, klasifikuotume jas, aptartume pagrindinius kiekvienos paradigmos realizavimo kelius, ianalizuotume juos tose kalbose, kurios turi konstrukcijas su bdingiausiomis savybmis. Tuomet gautume gili samprat apie programavimo kalbos sandar, konstrukcij savybes ir galtume tai panaudoti visikai nepriklausomai nuo to, kuri kalb mokame.

    Pateiksime kelet prieasi, kad programavimo kalb analiz yra gana svarbi kiekvienam programuotojui.

    Pirmiausia tokia analiz pagerina kiekvienos konkreiai naudojamos programavimo kalbos samprat. Daugelis programavimo kalb turi vairiausi konstrukcij, kurios yra tikrai naudingos tuomet, jei sugebame jas tinkamai panaudoti. Netinkamas konstrukcij taikymas gali padaryti algoritm sunkiai suprantam, turti neigiamos takos algoritmo efektyvumui ar net tapti vairi netikslum ir klaid altiniu. Kartais net profesionals programuotojai, daugel met kurdami programas kuria nors kalba, gali neturti gilesnio kai kuri konstrukcij supratimo. Prieastys paprastai gldi tame, kad dauguma programavimo kalb apra yra pernelyg pavirutiniki, nepadedantys suprasti esms.

    Paprastai programuotojas ino tam tikr kiek programavimo konstrukcij, su kuriomis jis susiduria programuodamas konkreia programavimo kalba. Programavimo kalb analiz suteikia galimyb gerokai iplsti suvokiam konstrukcij aib.

    Moksliniuose darbuose, kurie nagrinja mogaus mstym, danai sutinkama mintis, kad kalba tiek padeda mstymui, tiek j riboja. I tikrj, mogus naudoja kalb, kad ireikt tai k jis galvoja. Taiau i kitos puss teisinga ir tai, kad kalba struktrizuoja, nusako mogaus mstym ir netgi iki tokio laipsnio, kad mogui sunku mstyti be odi. Vienos programavimo kalbos inojimas sukelia tok pat stipr ribojimo efekt. Sprsdamas vien ar kit udavin ir parinkdamas jam btinas konstrukcijas, programuotojas neivengiamai msto tik tos vienintels inomos kalbos svokomis.

    Susipainus su pagrindinmis programavimo kalb koncepcijomis, ymiai aikiau nustatyti, kuri kalba tinkamiausia konkreios klass udaviniams sprsti. Teisingai pasirinkta ir taisyklingai vartojama programavimo kalba gali gerokai paspartinti program raym ir pailginti j gyvavimo trukm.

  • 4

    Dar viena svarbi programavimo kalb teorijos mokymosi prieasi bt ta, kad inant bendruosius kalb darybos principus galima kur kas greiiau imokti nauj kalb. Vis daugiau ir daugiau atsiranda smulki specializuot kalb, kuri prireikia vairiems profesiniams darbams atlikti. Paprastai tos smulkios kalbos turi bendriausias programavimo kalb svokas bei konstrukcijas. Be to, jei inosime bendriausius programavimo kalb principus ir koncepcijas, lengvai suvoksime ir naujas kalbas. Dar daugiau, programuotojas, lengvai suvokdamas kalb esm, gali i karto matyti, kaip kiekvienoje situacijoje tinkamai panaudoti naujos kalbos konstrukcijas.

    Programavimo kalb teorijos inojimas ne tik padeda greitai ir kokybikai suvokti naujas kalbas, bet ir suteikia galimyb patiems kurti naujas kalbas. inoma, nedaug programuotoj ketina kurti naujas kalbas. Taiau daugeliui tenka kurti uduoi valdymo kalbas arba kalb poaibius specialiems tikslams.

    Pateiksime pagrindines procedrinio programavimo svokas ir aptarsime jas realizuojanias konstrukcijas. Daniausiai minsime tokias plaiai paplitusias kalbas, kurios yra vertingos programavimo kalb teorijos bei algoritmavimo ir programavimo mokymo metodikos poiriu. Pirmiausia tai bt Paskalis (ir jo pagrindu sukurtos kalbos Modula-2, Oberonas-2), Algolas-68 ir Ada. iek tiek uuomin bus apie istoriniu poiriu vertingas kalbas Fortran ir Algol-60, o taip pat sisteminio programavimo kalbas C, C++, bei iuo metu itin populiari Javos kalb.

    Daugiausia vietos skirsime vairi programavimo kalb konstrukcij semantikos analizei. Po to trumpai pailiustruosime, kaip tos konstrukcijos realizuojamos programavimo kalbose. Mindami kalb visada tursime omeny jos standart. Kalbdami apie konkrei kalbos realizacij, visada j vardinsime.

    Skaitytojo neturt gsdinti daugyb ia pamint kalb. Mediaga dstoma taip, kad j pajgt suprasti studentas, mokantis bent vien iuolaikin procedrin kalb (pvz., Paskal arba C).

  • 5

    Turinys

    vadas 3

    Turinys 5

    1. PROGRAMAVIMO KALB KLASIFIKACIJA IR RAIDA

    1.1. Programavimo kalb klasifikacija 8

    1.2. Kalb vertinimo kriterijai 10

    1.3. Programavimo kalb raida 13

    2. FORMALS KALB APRAYMO METODAI

    2.1. Leksika, sintaks, semantika 17

    2.2. Kalba ir jos gramatika 18

    2.3. Formalios gramatikos 22

    2.4. Gramatik klasifikacija 27

    2.5. Kalb klasifikacija 28

    2.6. Kontekstins kalbos 30

    2.7 Laisvojo konteksto kalbos 31

    2.8. Reguliariosios kalbos 32

    2.9. Baigtinio automato samprata 34

    2.10. Gramatik ir kalb vienareikmikumas 40

    2.11. Kaip praktikai nustatyti gramatikos tip 46

    2.12. Bekaus ir Nauro forma 48

    2.13. Bekaus ir Nauro formos modifikacijos 54

    2.14. Sintakss diagramos 56

    3. LEKSIKA

    3.1. Kompiuterio abcl 62

    3.2. Programavimo kalbos abcl 62

    3.3. Terminalini simboli pavaizdavimas kompiuterio abcls simboliais 63

    3.4. Vardai 66

    3.4. Konstantos 68

    3.5. Programos teksto idstymas ir komentarai 71

  • 6

    4. DUOMENYS

    4.1. Duomen klasifikacija 73

    4.2. Duomen rys: konstant, kintamj ir rodykli modelis 78

    4.3. Konstantos ir j vardai 83

    4.4. Kintamieji, programos bsena 84

    4.5. Operacijos, reikiniai ir reikmi priskyrimas 86

    5. DUOMEN TIPAI IR STRUKTROS

    5.1. Paprastieji duomen tipai 90

    5.1.1. Vardiniai tipai 90

    5.1.2. Loginis tipas 92

    5.1.3. Simboli tipas 94

    5.1.4. Atkarpos tipai ir potipiai 95

    5.1.5. Sveikieji skaiiai 96

    5.1.6. Realieji skaiiai 98

    5.1.7. Trivials duomen tipai 100

    5.2. Rodykls 101

    5.3. Struktriniai duomen tipai 101

    5.3.1. Rinkinys 103

    5.3.2. Variantinis rinkinys 106

    5.3.3. Masyvas 108

    5.3.4. Kiti duomen tipai 111

    5.3.5. Struktrini duomen tip suderinamumas 112

    5.4. Objektai 113

    5.4.1. Objektinio programavimo samprata 113

    5.4.2. Realizacija procedrinse programavimo kalbose 119

    6. VALDYMO STRUKTROS

    6.1. Valdymo struktr samprata 123

    6.2. Struktrins schemos 124

    6.3. Sakini seka ir sudtinis sakinys 129

    6.4. Irinkimas 129

    6.4.1. Irinkimo sakinio samprata 129

    6.4.2. Irinkimas i dviej variant 130

  • 7

    6.4.3. Irinkimas irinkime 133

    6.4.4. Variantinis irinkimas 134

    6.4.5. Tiesioginis irinkimas 136

    6.5. Kartojimas 137

    6.5.1. Kartojimo sakinio samprata 137

    6.5.2. Neinomo kartojim skaiiaus ciklas 138

    6.5.3. inomo kartojim skaiiaus ciklas 141

    6.6. Nukreipimo sakinys 144

    7. PROCEDROS IR FUNKCIJOS

    7.1. Valdymo struktr abstrakcijos samprata 147

    7.2. Parametrai 149

    7.2.1. Formalieji ir faktiniai parametrai 149

    7.2.2. Perdavimas reikme 152

    7.2.3. Perdavimas rezultatu 152

    7.2.4. Perdavimas reikme ir rezultatu 154

    7.2.5. Perdavimas adresu 155

    7.2.6. Perdavimas vardu 157

    7.2.7. Funkcij ir procedr perdavimas parametrais 161

    7.2.8. Parametr perdavimo bdai programavimo kalbose 163

    8. PROGRAMAVIMO KALB STANDARTAI IR REALIZACIJOS

    8.1. Oficials kalb apraymai 168

    8.2. Kalb dialektai 168

    8.3. Interpretatoriai, transliatoriai ir kompiliatoriai 169

    8.4. Programavimo terp 170

    8.5. Programavimo kalb suderinamumas 171

    Literatra 172

  • 8

    1. PROGRAMAVIMO KALB KLASIFIKACIJA IR RAIDA

    1.1. Programavimo kalb klasifikacija

    Programavimo kalbas galima klasifikuoti taikant vairius kriterijus: pagal j iraikos priemones, taikymo sritis, naudojamus metodus, sukrimo laikotarp ir pan. Kiekvienas klasifikavimo bdas irykina tam tikras kalbos savybes.

    Pirmiausia panagrinsime kalb klasifikacij pagal j taikymo sritis. Tai elementariausia ir danai pateikiama klasifikacija. Rykiau skiriasi keturios kalb grups, tinkamos iems udaviniams:

    1) mokslini tyrim,

    2) komercini,

    3) kompiuterins intelektikos,

    4) sisteminio programavimo.

    Mokslini tyrim udaviniams bdingas didelis operacij kiekis su nedideliu duomen kiekiu. Pirmieji kompiuteriai buvo skirti tokiems udaviniams sprsti. Todl ir programavimo kalb projektavimas prasidjo nuo i udavini programavimo. Pirmoji programavimo kalba Fortranas ir buvo skirta tokiems udaviniams programuoti. Kuriant Algol-60 buvo galvojama taip pat apie jos taikym moksliniams skaiiavimams, taiau i kalba paplito ir kitose srityse.

    Vliau atjo eil komercins informacijos apdorojimui. ios srities udaviniams bdingi dideli duomen kiekiai, o operacij su jais nedaug ir jos nesudtingos. Geriausiai iam tikslui tinkama buvo Kobolo (Cobol) kalba [ANSI74], sukurta 1960 metais.

    iuo metu programavimo kalbos komercinei veiklai pasidar neaktualios. Atsirado kitos kompiuterins priemons duomen bazs, skaiiuokls, o taip pat daugyb program paket tam tikriems udaviniams arba j grupms. ios priemons pakeiia programavimo kalb poreik komercinje veikloje, nes atlieka beveik visus reikalingus veiksmus. Bet atsirado didesnis poreikis sisteminio programavimo kalboms, kuriomis mintos priemons programuojamos.

    Kompiuterine intelektika domimasi nuo pat pirmj kompiuterio ingsni. Bet ir dabar nepraranda aktualumo problema, kaip suprojektuoti mogaus mstym atitinkani sistem.

    ios srities udaviniams bdingas simbolins informacijos apdorojimas ir srains struktros. Operuojama ryiais tarp objekt. Reikia kalbos, kurioje bt patogu aprayti sudtingos ir dinamikai besikeiianios struktros duomenis bei veiksmus su tais duomenimis. Daugelis vairi valstybi mokslinink iekojo bd, kaip toki informacij apdoroti. 1959 metais iam tikslui buvo sukurta funkcin kalba Lispas (Lisp). Ir iki iol kompiuterins intelektikos srityje tebenaudojamos kalbos, artimos Lispo kalbai. Vliau, 8-ajame deimtmetyje pasirod loginio programavimo kalba Prologas (Prolog), kuris dar geriau tiko kompiuterins intelektikos srities udaviniams sprsti.

    Mint trij grupi udaviniuose operuojama su mogaus veiklai bdingais duomenimis skaiiais, tekstais, paveikslais ir pan. Juos kompiuteris tik apdoroja. Jie atsiranda ir naudojami kompiuterio iorje. Todl kompiuterio poiriu jie yra ioriniai.

    Kartu su kompiuteriu atsirado dar viena duomen ris vidiniai kompiuterio duomenys, egzistuojantys tik kompiuterio viduje ir bdingi tik paiam kompiuteriui. Tai kodai vidinis

  • 9

    iorini duomen pavaizdavimas, j adresai, komand kodai ir pan. Su iais duomenis tenka operuoti raant programas, tvarkanias vidin kompiuterio k, pavyzdiui operacines sistemas. Tai sisteminio programavimo udaviniai. ios ries udaviniams programuoti skiriamos sisteminio programavimo kalbos. ios kalbos yra labiau susijusios su kompiuterio, daniausiai tam tikros jo dalies, architektra negu kitos aukto lygio kalbos.Todl jose yra nemaai mainini ar asemblerini konstrukcij, leidiani atlikti veiksmus su kompiuterio atmintimi, registrais ir pan.

    Viena populiariausi sistemini kalb yra C. Pavyzdiui, gerai inoma operacin sistema UNIX buvo parayta C kalba. C kalb galime laikyti tarpine tarp aukto ir emo lygio kalb.

    Kartais iskiriamos ir daugiau specializuotos (siauresns) udavini klass, kurioms sudaromos siauresns specializacijos programavimo kalbos.

    Programavimas nra vienalytis. T pat udavin galima programuoti vairiais metodais. Ir atvirkiai vairius, netgi skirting ri udavinius programuoto tuo paiu metodu. Programavimo pairiu netgi natraliau programavimo kalbas klasifikuoti pagal programavimo metodik kalboje esanias (dominuojanias) konstrukcijas. Daniausiai kalbos skirstomos keturias grups pagal toje kalboje realizuot programavimo paradigm (gr. paradigma kryptis, pavyzdys):

    1) imperatyvios arba procedrins,

    2) funkcins,

    3) objektins,

    4) logins.

    Imperatyvi kalb grupei priklauso kalbos, kurios udavinio sprendimas ireikiamas veiksmais komandomis (paliepimais) kompiuteriui vykdyti vien ar kit veiksm. Tai viena seniausi, gausiausia ir daniausiai naudojam kalb grup. Jai priklauso Algolas-60, Algolas-68, Ada, C, Fortranas, Modula, Paskalis ir daugelis kit kalb.

    Imperatyvioji paradigma geriausia derinasi su tradicine algoritmo samprata.

    Funkcini kalb paradigmos pavadinimas sako, kad svarbiausia konstrukcija yra funkcija. Veiksmai ireikiami funkcij apraais ir kreipiniais funkcijas. Funkcijos apraas tiesiogiai (matematikai) apibria funkcijos rezultato priklausomyb nuo argument. Grynose funkcinse kalbose nra nei kintamojo, nei priskyrimo svok, todl rezultat priklausomyb nuo pradini duomen ireikiama tiesiogiai, nenaudojant tarpini duomen.

    Funkcin kalba pateikia primityvi funkcij aib, galimyb aprainti sudtingesnes funkcijas, panaudojant primityvisias, o taip pat kai kurias struktras duomenims laikyti. Tobulai sukurta funkcin kalba turi gana daug primityvi funkcij. Apraant primityvias funkcijas, danai naudojama rekursija.

    Funkcini kalb pavyzdiai: Lispas, Scheme, Miranda.

    Objektins kalbos atsirado tik prie ger deimt met. Jos iaugo i abstrakij duomen tip teorijos, perimdamos duomen abstrakcijos mechanizm. Pagrindin duomen struktra objektas. Vieni objektai gali bti kuriami i kit objekt pritaikant paveldjimo mechanizm. Operacijos su duomenimis yra montuotos objektus. Taigi operacijas atlieka objektai, o jie sveikauja sisdami vienas kitam praneimus.

    Pirmoji objektin kalba buvo Smalltalk. Nesenai tapo populiari Eiffell. Kalbose Oberon-2 ir Java yra gerai suderintos procedrinio ir objektinio programavimo paradigmos. Dabar objektinis programavimas yra labai populiarus. Daugelis procedrinio programavimo kalb (Paskalis, C) papildomos objektinio programavimo elementais.

  • 10

    Loginio programavimo kalbose apraomi faktai ir j sryiai. Vieni j inomi prie atliekant program (pradiniai duomenys), kiti gaunami j atlikus (rezultatai). Geriausiai inoma ios grups kalba yra Prologas.

    Kartais programavimo kalbos klasifikuojamos pagal lygius. Kuo emesnis lygis, tuo kalbos duomen tipai ir operacijos yra artimesni kompiuterio kodams ir komandoms. Kuo kalbos lygis auktesnis, tuo kalba abstraktesn, t. y. daugiau nutolusi nuo kompiuterio komand ir priartjusi prie mogaus kalbos. prasta kalbas skirstyti tris lygius:

    1) emo,

    2) aukto,

    3) labai aukto.

    Suprantame, kad emo lygio programavimo kalbomis laikomos visos mainins ir joms artimos kalbos.

    Aukto lygio programavimo kalboms priklauso beveik visos mums inomos kalbos.

    Kalb lygis nuolat auktja. Tam, kad galima bt iskirti kalbas, kuri lygis dar auktesnis u t kalb lyg, kurios jau buvo vadinamos aukto lygio kalbomis, tokios kalbos imamos vadinti labai aukto lygio programavimo kalbomis. J pavyzdiai login kalba Prologas, funkcin kalba Miranda, aibmis operuojanti kalba Setlas (Setl).

    1.2. Kalb vertinimo kriterijai

    Norint apibdinti programavimo kalbas, reikia i anksto susitarti dl j vertinimo kriterij. Suprantama, kad gali bti labai daug savybi, kuri tiktumms i programavimo kalb. Reikia atsirinkti svarbiausias, ir dar, pasirenkant konkrei programavimo kalb, pagalvoti apie srit, kurioje bus taikoma i kalba.

    Pateiksime keturias pagrindines programavimo kalb savybes, kurias nurodo R. W. Sebesta [Sebesta93], laikytinas kalb vertinimo kriterijais:

    1) program skaitomumas,

    2) program raymo patogumas,

    3) patikimumas (program, parayt ta kalba),

    4) ilaidos (programoms kurti, programuotojams mokytis ir t. t.).

    Tai iorins (galutins) kalbos savybs. Kiekviena j priklauso nuo vidini kalbos savybi, vardijam specialiais programavimo terminais ir taip pat laikytin (vidiniais) kalbos vertinimo kriterijais. Ryiai tarp vairi savybi (vertinimo kriterij) pateikti 1.1 paveiksle.

  • 11

    1.1 pav. Programavimo kalb vertinimo kriterijai

    Svarbesnius kriterijus aptarsime isamiau.

    Program skaitomumas. Kuo lengviau ir greiiau galima suvokti program, tuo geriau. Kuo programa ilgiau gyvuoja, tuo svarbesnis jos skaitomumas, nes j ilgiau reikia priirti, taisyti, papildyti, pritaikyti prie nauj slyg, ir, vadinasi daniau skaityti. Programos skaitomumas turt bti ger program krj pagrindinis devizas program rao vienas mogus, o skaito daugelis.

    Programos skaitomumas glaudiai susijs su jos paprastumu. Jei programavimo kalba turi pernelyg daug konstrukcij, j sunku imokti. Todl vertingesns paprastesns kalbos, turinios nedaug motyvuotai parinkt konstrukcij. Fortrano autorius D. Bekus kakada yra pasaks, kad bt laimingas, jeigu jam pavykt sukurti programavimo kalb, kurios apraymas tilpt ant vieno lapo!

    Kalb daro sudtinga taip pat savybi persidengimas, t. y. kai kelios konstrukcijos turi tas paias savybes. Pavyzdiui, vienetu padidinti kintamojo reikm C kalba galima vartojant net keturis bdus:

    kiek := kiek + 1

    kiek += 1

    ++kiek

    kiek++

    Kalba pasidaro paini (sudtinga) ir prieingu atveju kai viena ir ta pati konstrukcija (operacijos enklas, odis ir pan.) gali bti vartojama keliose skirting prasmi vietose. Sakoma, kad vienai svokai ymti turi bti vartojamas vienas simbolis, skirtingoms skirtingi.

    Ortogonalumas tai galimyb gauti naujas kalbos konstrukcijas visais duotais bdais kombinuojant turimas konstrukcijas. Kuo didesnis kalbos ortogonalumas, tuo maiau iimi joje. Kai kalba ortogonali, tai i nedidelio elementari (pradini) konstrukcij su nedaugeliu kombinacij galime gauti visas valdymo ir duomen struktras. Kiekviena kombinacija yra teista ir prasminga.

  • 12

    Labiausiai ortogonali kalba yra Algolas-68. Joje, pavyzdiui nra skirtumo tarp reikinio ir sakinio. J funkcijas atlieka viena ir ta pati konstrukcija, turinti reikm ir tip (kaip sakinys) ir galinti atlikti priskyrimo veiksm arba kreiptis procedr (kaip sakinys).

    Nors Paskalio kalba yra gana moderni ir aukto lygio, taiau ji nra ortogonali. Vos ne kiekvienai konstrukcijai esama ribojim. Pavyzdiui, cikle while negalima rayti sakini sekos, j turime paversti sudtiniu sakiniu, o cikle repeat galima, ne visi faktiniai parametrai gali bti perduodami procedrai reikme (pvz., reikme negalima perduoti byl), funkcijos reikm gali bti tik paprastojo tipo ir t. t.

    Ortogonalumas turi bti gerai subalansuotas. Kuo ortogonalesn kalba, tuo paprastesn. I kitos puss, pernelyg didelis ortogonalumas teikia didel laisv naujoms konstrukcijoms kurti, j gali atsirasti per daug, kai kuri paskirtis gali pasidaryti miglota. Taip pat sumaja kalbos perteklikumas ir atsiranda didesnis klaid pavojus (sumaja program patikimumas).

    Kalbos skaitomumui didel reikm turi jos konstrukcij forma (sintaks). Pamintini trys formos komponentai:

    1) vard forma,

    2) bazini odi prasmingumas, bendrumas, grupavimas, patogumas,

    3) konstrukcij formos ryys su j semantika.

    Kuo labiau odiai ir konstrukcijos ireikia bei primena j semantik, tuo lengviau imokti kalb, tuo ji paprastesn ir ja paraytos programos lengviau skaitomos.

    Programos raymo patogumas susijs su kalbos paprastumu, ortogonalumu, abstrakcija ir iraikingumu.

    Abstrakcija tai galimyb aprayti ir valdyti sudtingas struktras arba operacijas taip, kad galima bt ignoruoti daugel smulkmen (detali). Tai viena esmini programavimo kalb savybi: jos ir kuriamos tam, kad bt galima atsiriboti nuo smulkmen technini detali.

    Iraikingumas siejasi su daugeliu kalbos savybi. Pavyzdiui, Paskalio kalbos ciklas for iraikingesnis negu ciklas while.

    Programos patikimumas suprantamas kiek kitaip, negu aparatros patikimumas. Aparatra fizikai dvisi, genda. Kuo patikimesn aparatra, tuo reiau ji genda. Vienas tos paios aparatros egzempliorius esant absoliuiai toms paioms slygoms gali veikti gerai, kitas sugesti. Programa nedyla. Kiekvienas jos egzempliorius esant toms paioms slygoms veikia absoliuiai vienodai. Programos patikimumas suprantamas kaip jos gebjimas teisingai veikti esant bet kokioms ir retai pasitaikanioms slygoms (pradini duomen kombinacijoms). Tai klaidos, o ne atsitiktiniai gedimai. Kadangi ia turima omeny retai pasitaikanios klaidos, tai ia daroma analogija su aparatros gedimais ir jos patikimumu.

    Sakoma, kad tam tikra kalba paraytos programos yra patikimesns, jei kalboje yra priemons, padedanios geriau numatyti ir apriboti klaidas esant neprastoms, daniausiai neleistinoms pradini duomen kombinacijoms. Vienas i toki program patikimum didinani mechanizm yra duomen tip kontrol.

    Ilaidos susijusios su programavimo kalbos projektavimu, platinimu, prieira nesunkiai suvokiamos i 1.1 paveiksle pateikt ssaj.

  • 13

    1.3. Programavimo kalb raida

    Trumpai pervelgsime svarbesnes programavimo kalbas j atsiradimo chronologine tvarka. Daugiau dmesio kreipsime tai, kuo tos kalbos prisidjo kuriant teorinius programavimo kalb pagrindus, k jos dav programavimo kalb teorij.

    1.2 paveiksle pavaizduota aukto lygio programavimo kalb genealogija ir j tarpusavio ryiai: kurios kalbos kurias takojo.

    1.2 pav. Programavimo kalb raida

  • 14

    Reikt paminti pirmj programavimo kalb Plankalkl. J sukr vokiei mokslininkas Konradas Ciuz (Konrad Zuse) 1945 m. raydamas daktaro disertacij. Kalba turjo paius primityviausius duomen tipus ir nedaug valdymo struktr. Kalba nebuvo realizuota tais laikais dar tik pradjo atsirasti pirmieji, labai primityvs kompiuteriai. Taiau kalba turjo neabejotin svarb: parodytas kelias, kaip kurti programavimo kalbas. Kaip istorin reikm turintis dokumentas, jos apraas buvo ispausdintas tik 1972 m. [Bauer72].

    Programavime daniausiai minimi 1954 metai. T met lapkrit D. Bekus ir jo grup paruo projekt apie matematini formuli transliavimo sistem Fortran (angl. FORTRAN = FORmula TRANslating System). Tai buvo pirmoji realizuota aukto lygio (ne mainin) programavimo kalba.

    Nors ioje kalboje duomen ir valdymo struktros buvo labai menkos, taiau kelios pagrindins programavimo kalb teorins idjos buvo perteiktos. ia buvo vartojami loginiai kintamieji suprasta j reikm programavime. Buvo gyvendinta irinkimo sakinio idja, nors dar gana netobulai, labai neaikiai. Apskritai pirmosios kalbos vis dar tebebuvo labiau skiriamos kompiuteriui, o ne mogui.

    Fortranas jau turjo inomo kartojim skaiiaus cikl ir masyv.

    Fortrano kalba buvo nuolat tobulinama, kuriamos vis naujos jos versijos. Daugiausia inomos Fortranas-4, Fortranas-77, Fortranas-90.

    Funkcini kalb krypties pradininkai yra Donas Makkartis (John MacCarthy) ir Marvinas Minskis (Marvin Minsky), kurie 1958 m. sukr Lispo (Lisp) kalb.

    Lispas turi labai paprastas, taiau tvirtai teorikai pagrstas duomen struktras atomus ir sraus. Sraai apibriami labai paprastai, j gylis nurodomas skliaustais, pavyzdiui,

    (A B C D)

    (A (BC) D (E (FG)))

    Skaiiavimai atliekami taikant argumentams funkcines programas (funkcijas). Iteratyvs procesai modeliuojami rekursiniais kreipiniais. Tai aikiai ireikta funkcinio programavimo koncepcija.

    Lispas dav pradi ir simbolins informacijos apdorojimui.

    1958 metais dvi didels tarptautins organizacijos ACM (angl. Association for Computing Machinery) ir GAMM (vok. Gesellschaft fr Angewandte Mathematik und Mechanik) msi projektuoti toki programavimo kalb, kuri bt tinkama sudtingiems udaviniams sprsti ir bt teorikai pagrsta. Met pradioje ios abi grups, susitikusios Ciriche, ikl pagrindinius tikslus:

    1. Kalba turi bti kiek galima artimesn standartiniams matematikos ymenims ir ja paraytos programos turi bti lengvai skaitomos be papildom paaikinim.

    2. Kalba turi bti tokia, kad ja galima bt aprayti skaiiavimus, publikuojamus spaudoje bt lengva suprasti juos.

    3. ios kalbos programos turi bti mechanikai iveriamos maininius kodus.

    Buvo parengtas projektas pirmoji Algolo-58 kalba (pavadinimas sudarytas i anglik odi ALGOrithmic Language pirmj raidi). 1960 m. buvo pateikta nauja, i esms patobulinta ios kalbos versija Algolas-60 [Naur61, Naur63].

    Svarbiausios konstrukcijos, suprojektuotos Algole-60 ir vliau vartojamos daugelyje programavimo kalb, buvo ios:

    1. Blokin programos struktra. Tai leido programuotojams apriboti vard galiojim. Pavyzdiui,

  • 15

    begin

    integer suma, kiekis;

    ...

    end;

    ia odiniais skliaustais begin ir end nurodoma bloko pradia ir pabaiga; bloke aprayti vardai suma ir kiekis galioja (kitaip sakant, matomi) tik bloko viduje, o iorje jie neegzistuoja, taigi ir neinomi.

    2. Du procedr parametr perdavimo bdai: reikme ir vardu.

    3. Rekursini proces samprata.

    4. Pusiau dinaminiai masyvai. Tai masyvai, kuri riai nusakomi kintamaisiais ir dl to masyvo dydis gali bti nustatomas programos vykdymo metu, kai tik atliekama apra dalis. Pavyzdiui,

    procedure terpk (ilgis, nauja);

    value ilgis;

    integer ilgis, nauja;

    begin

    integer array [1: ilgis] sraas;

    ...

    end terpk;

    ioje programoje sraas yra sveikj skaii masyvas, kurio virutinis ris ilgis yra procedros parametras. Taigi, kol procedra neatliekama, nra inomas. Taiau kai masyvas jau sukurtas, jo ri pakeisti nebegalima.

    Algolas-60 turjo takos daugelio programavimo kalb projektavimui. Vlesns kalbos arba perm Algolo-60 konstrukcijas, arba jas patobulino.

    Su Algolu-60 glaudiau susijusi Bekaus ir Nauro forma (BNF) formalus bdas programavimo kalbos sintaksei aprayti. Btent, projektuojant Algol-60 kalb ir buvo ikeltas udavinys: surasti formal bd kalbos sintaksei aprayti. Bd pateik Donas Bekus, o patobulino Peteris Nauras (Peter Naur).

    Pasirodius asmeniniams kompiuteriams buvo suprojektuota Beisiko (Basic) kalba. Ji neturjo jokios takos kalb moksliniams tyrimams, mokslininkai kompiuterininkai ignoravo i kalb. Taiau daugumai programuotoj praktik i kalba turjo nema reikm, buvo pirmoji j kalba.

    Pagrindinis reikalavimas, ikeltas projektuojant i kalb naudoti kuo maiau kompiuterio atmintins, nes tai buvo itin svarbu pirmiesiems asmeniniams kompiuteriams.

    Pervelgiant ios programavimo kalbos ikeltus tikslus, vienas j buvo gana revoliucingas ir turjs takos tolesni kalb raidai: mogaus laikas, sugaitamas programos raymui, yra svarbesnis dalykas negu kompiuterio laikas, skirtas programos vykdymui.

    1967 metais buvo suprojektuota kalba Simula-67 [Dahl68]. Ji perm Algolo-60 blokin struktr bei valdymo sakini konstrukcijas, taiau turjo ir naujovi. Svarbiausia naujov duomen abstrakcijos samprata, ireikta ios kalbos konstrukcija klase. Klass idja dav

  • 16

    impuls abstraktiems duomen tipams atsirasti, o vliau i t pai idj isirutuliojo objektinis programavimas.

    1968 metais buvo suprojektuotas Algolas-68 [Wijngaarden75]. Tai buvo ne vien tik Algolo-60 tobulinimas ar ipltimas, o i esms nauja kalba, su daugeliu nauj konstrukcij ir samprat.

    Viena domiausi Algolo-68 savybi yra jos ortogonalumas. Su ortogonalumu susijusi kalb raidai itin reikmingas rezultatas programuotojo apraomi duomen tipai. Algolo-68 kalboje leidiama programuotojui paiam, panaudojant standartinius tipus ir kelet j komponavimo bd konstruoti naujus duomen tipus. i savyb perm vlesns kalbos: Paskalis, C, Modula2. Ada.

    Algolas-68 jau turjo dinaminius masyvus. Tokio masyvo dydis gali kisti atliekant program.

    Algolas-68 turjo didel tak programavimo kalb teorijai. Taiau praktikoje nepaplito, nes kalba gana sudtinga, pernelyg formalus ir kandamas jos apraymas.

    Kaip prieingyb Algolo-68 sudtingumui 1970 metais buvo sukurta Paskalio kalba. Jos devizas paprastumas. Projektuojant Paskal buvo ikeltas tikslas: sukonstruoti toki kalb, kad ji tikt programavimui mokyti. Kalba buvo tiek paprasta ir iraikinga, be to turjo tokias geras aukto lygio duomen ir valdymo struktras, kad greitai paplito tarp programuotoj ne tik kaip mokymosi kalba.

    Madaug tuo paiu metu buvo suprojektuota ir kita kalba C. Jos konstrukcijos buvo perimtos i Paskalio, Algolo-68 ir netipizuotos emo lygio programavimo kalbos BCPL. Todl C kalba turi nemaai emo lygio programavimo kalboms bding bruo. Pavyzdiui, beveik nra duomen tip kontrols. Daugelis programuotoj mgsta kalb C dl jos lankstumo, didesni galimybi tiesiogiai prieiti prie kompiuterio vidaus. Taiau visa tai yra klaid altinis.

    Kalbos C++ pagrindu buvo suprojektuota kalba Java. Tai galima sakyti modernizuota C++ i jos paalinus daugel nelabai tobul emo lygio konstrukcij. Taiau Javos sintaks yra labai artima C++ sintaksei. Taip padaryta populistiniais tikslais, kad kalba nebt svetima dabar populiarios kalbos C++ programuotojams. Spart Javos plitim lemia jos naudojimas internete.

    1974 m. buvo pradta Ados (ji pavadinta pirmosios pasaulyje programuotojos, Bairono dukters Ados Lavelais vardu) kalbos projektas. J finansavo JAV gynybos departamentas, nordamas turti universali programavimo kalb procesori, montuot karinius taisus, programoms rayti. Projektui buvo skiriama daug l. Dirbo didels moni grups. Buvo parengti keli kalbos variantai. kalb buvo traukti svarbiausi tiek program ininerijos, tiek programavimo kalb projektavimo teoriniai principai lygiagrets procesai, ypating situacij valdymas, isams realij skaii apraai, abstraktieji duomen tipai ir pan. Todl i kalba danai naudojama profesionaliam programavimui dstyti.

  • 17

    2. FORMALS KALB APRAYMO METODAI

    2.1. Sintaks ir semantika

    Kalba yra bendravimo priemon. mons bendrauja natraliomis kalbomis, pavyzdiui, lietuvi, latvi, angl, vokiei.

    Programavimo kalba skirta mogaus ir kompiuterio bendravimui. Ja bendravimui naudojasi ir mons, kai vienas programuotojas skaito kito programuotojo parayt program.

    Tam, kad bendravimas bt skmingas, reikia, kad visi tos paios kalbos vartotojai vienodai j suprast visi programuotojai, raantys programas ta paia kalba ir kompiuteriai, analizuojantys ir atliekantys j paraytas programas. ia u kompiuterio vl slypi mogus dabar jau programuotojas, paras transliatori.

    Aukto lygio programavimo kalbos yra gana sudtingos. Retai kas gali pasigirti, kad tobulai moka vis kuri nors programavimo kalb nuo pradios iki galo. Todl programavimo kalb apraymui skiriama nemaai dmesio. Siekiama, kad programavimo kalbos apraas bt trumpas, aikus ir svarbiausia vis vienareikmikai suprantamas.

    Pirmas ingsnis programavimo kalbos apraymui susisteminti yra jo skirstymas lygius. Iskirtini du lygiai: sintaks ir semantika. Sintaks apibria programos teksto sandar. Semantika nusako sintaksikai teisingos programos prasm. Pavyzdiui, Paskalio kalbos slyginio sakinio sintaks galt bti aprayta itaip:

    Slyginis sakinys turi tok pavidal:

    if b then S1 else S2

    ia b loginis reikinys,

    S1 ir S2 sakiniai.

    Slyginio sakinio dalis else S2 gali bti praleista.

    Slyginio sakinio semantika gali bti aprayta itaip:

    Apskaiiuojama loginio reikinio b reikm. Jeigu ji yra teisinga (true), tai atliekamas sakinys, S1, jei neteisinga (false) sakinys S2 . Jeigu slyginis sakinys neturi dalies else S2 , tai antruoju atveju neatliekamas joks sakinys.

    ia sintaks ir semantik aprame lietuvi kalba, panaudodami matematikos ymenis. Natraliomis kalbomis ireikti apraai danai bna ilgoki, o svarbiausia kai kurios vietos nevienareikms, kitos ivis sunkiai paaikinamos. Tai susij su natrali kalb svok daugiareikmikumu, vartojimo laisve.

    Abu lygiai sintaks ir semantika vartojami ne tik dirbtinms kalboms aprayti, bet ir lingvistikoje, kai nagrinjamos natraliosios (gyvosios) kalbos.

    Ir sintaks, ir semantika gali bti apraytos formaliai, vartojant griet matematin formalizm. Pirmuosius darbus apie natrali kalb sintakss formalizavim para JAV kalbininkas N. Chomskis (Naam Chomsky) 20 am. 6ojo deimtmeio pabaigoje 7ojo deimtmeio pradioje.

  • 18

    Tuoj pat po N. Chomskio paskelbt darb, Donas Bekus ir Peteris Nauras sukr formalizuot form algoritmins kalbos Algolo-60 kalbos sintaksei aprayti. is metodas pavadintas Bekaus ir Nauro forma (sutrumpintai BNF).

    Programavimo kalb sintaks nra sudtinga (toki stengiamasi padaryti jau kuriant kalb), todl j aprayti formaliai nesunku ir beveik visada vartojami formals bdai. ie formals bdai, apraantys programavimo kalb sintaks, vadinami formaliosiomis gramatikomis.

    Programavimo kalb semantika sudtingesn. Nra gero matematinio formalizmo, galinanio trumpai ir aikiai j aprayti. Programavimo kalb semantikai aprayti daugiausiai inomi trys bdai: operacinis, aksiomatinis ir denotacinis. Taiau bet kuriuo j parengti semantikos apraai gana griozdiki ir sunkiai skaitomi. Todl programavimo kalb semantika daniausiai apraoma neformaliai, natralia, kartais iek tiek matematizuota kalba.

    Riba tarp programavimo kalbos sintakss ir semantikos ne visada vienareikmikai nubriama. Nesutariama, pavyzdiui, ar vard galiojimo bei duomen tip suderinimo taisykls priklauso sintaksei, ar semantikai. Kadangi ios taisykls reglamentuoja programos teksto taisyklingum, tai jas tikt priskirti kalbos sintaksei. Taiau beveik niekada i dalyk neapibria kalbos sintakss taisykls, nes beveik visada naudojami sintakss apraymo metodai, kurie programavimo kalbos konstrukcijas aprao autonomikai, t. y. neatsivelgiant kontekst. Pavyzdiui, sakinio, kuriame panaudotas kintamasis, sintaks nesiejama su to paties kintamojo aprao sintakse.

    Nors sintaks ir semantika daniausiai tyrinjamos atskirai, taiau jos yra glaudiai susijusios. I gerai apraytos programavimo kalbos sintakss galt iplaukti ir semantikos dalyk.

    2.2. Kalba ir jos gramatika

    Kas yra kalba ir i ko ji sudaryta?

    Pradsime nuo abcls. Kiekviena kalba turi sav abcl.

    Apibrtis. Terminalini simboli abcl tai netuia simboli aib. J ymsime T. Simboliai vadinami terminaliniais dl to, kad juos bt galima atskirti nuo kit gramatikose vartojam neterminalini simboli, apie kuriuos kalbsime toliau.

    Abcls simbolius reikia suprasti abstrakiau, negu mums prastas 32 lietuvi kalbos abcls raides. Abcl gali sudaryti bet kokie simboliai, kurie rate gali bti vaizduojami vairiais enklais (pvz., skaitmenimis, skyrybos enklais) arba ireikiami keliais spausdintais enklais.

    Sintaks nagrinja natralios kalbos sakin, sudaryt i odi. Taigi sintakss poiriu odis yra pats maiausias, toliau nebeskaidomas sakinio elementas. Vadinasi, j reikia laikyti terminalins abcls simboliu.

    Jeigu kalb tirtume morfologiniu poiriu, tai tada reikt nagrinti, kaip i raidi sudaromi odiai ar j dalys.

    Programavimo kalbos abcl sudaro skaitmenys, raids, operacij ir skyrybos simboliai (kai kurie j danai ymimi rato enkl poromis, pvz., :=,

  • 19

    simbolius. Daniausiai abclei naudosime pirmsias masias lotynikos abcls raides, pavyzdiui,

    T = {a, b},

    T = {a, b, c}.

    Apibrtis. Seka s = t1t2...tn, sudaryta i abcls T simboli, vadinama eilute. Eiluts ilgiu laikomas j sudarani simboli skaiius. Eiluts u ilg ymsime |u|.

    Apibrtis. Eilut, kurios ilgis 0, vadinama tuia eilute ir ymsime j ; || = 0.

    Apibrtis. Dviej eilui u ir v sjunga vadinama operacija, kurios rezultatas uv gaunamas vien eilut v = b1b2 ...bm priraius po kitos u = a1a2...an:

    uv = a1a2...anb1...bm.

    |uv| = |u| + |v|.

    Tuia eilut turi savyb:

    u = u = u

    Apibrtis. T* vadinsime aib vis eilui, sudaryt i abcls T simboli, skaitant ir tui eilut. Vis abcls T eilui, iskyrus tui, aib ymsime T+.

    Vadinasi, T+ + {} = T*.

    3 pavyzdys.

    T = a, b

    T* = , a, b, aa, ab, ba, bb, aaa, ...

    T+ = a, b, aa, ab, ba, bb, aaa, ...

    Apibrtis. Kalba L (turinti abcl T) yra eilui aibs T* poaibis.

    Kalb sudaro eilui, sudaryt i jos abcls simboli, rinkinys, t. y. kalba yra eilui aib. Taiau ne vis galim eilui, o tik tam tikr. Pavyzdiui, ne visi lietuvi kalbos abcls raidi rinkiniai yra lietuviki odiai.

    Taigi kalba L yra eilui aibs T* poaibis: L T*.

    4 pavyzdys.

    Tegu T = {a, b}.

    Panaudodami i abcl galime apibrti daugyb kalb:

    L1 = T* = {, a, b, aa, ab, ba, bb, aaa ...}

    L2 = {aa, ab, ba, bb}

    L3 = {bap p pirminis skaiius}

    L4 = {anbn n 1}

    ia vertikaliu brkniu atskiriami ribojimai kalbos eilutms. ymjimu an suprantame n ilgio eilut, sudaryt i a simboli, a0 tuia eilut.

    Kalb L1 sudaro abcls {a, b} bet kokios eiluts: , a, b, aa, ab, ba, bb, aaa ...

    Kalb L2 sudaro keturios eiluts.

  • 20

    Kalbai L3 priklauso eiluts, prasidedanios raide b, o po jos einani raidi a skaiius, lygus bet kuriam pirminiam skaiiui: baa, baaa, baaaaa.

    Kalbai L4 priklauso eiluts, sudarytos i vienodo raidi a ir b skaiiaus, be to raids b eina po raidi a: ab, aabb, aaabbb.

    Kalba L2 yra baigtin, kitos trys nebaigtins

    Kalb apibrti kaip aib nesunku. Taiau itaip apibrti galima tik labai paprastas kalbas, kurias patogu naudoti tyrinjant gramatikas kitokius kalb apibrimo bdus. Deja, praktikai vartojamoms kalboms, net ir paprasiausioms programavimo kalboms, tokios aibi teorijos apibrimo priemons yra per silpnos. Naudojami sudtingesni apibrimo bdai, vadinami formaliomis gramatikomis. Apie jas kalbsime kitame skyrelyje.

    Gramatikos bna dviej ri: generuojanios ir atpastanios. Generuojanios gramatikos turi taisykles, pagal kurias kuriamos (generuojamos) kalbai priklausanios simboli eiluts. Atpastanios gramatikos turi taisykles, nustatanias, ar duotoji eilut priklauso kalbai.

    Programavimo kalb aprauose prasta pateikti generuojanias gramatikas. Jos pritaikytos programuotojui, raaniam (kurianiam) program. Tuo tarpu kompiuteriui tenka analizuoti mogaus parayt program, t. y. tikrinti, ar ji taisyklinga. Todl ia geriau tinka atpastanios gramatikos.

    I karto sugeneruoti (apibrti) vis sudtingesns kalbos eilut (pvz., program) arba j atpainti (inagrinti) bt sunku. Dl to darbas atliekamas palaipsniui, dalimis. Natralios kalbos sakinys skaidomas sakinio dalis: veiksn, tarin, papildin ir pan. (2.1 pav.). Programa skaidoma programavimo kalbos konstrukcijas: apraus, sakinius ir t. t. tol, kol nusileidiama iki kalbai priklausanios terminalini simboli eiluts (2.2 pav.).

    2.1 pav. Lietuvi kalbos sakinio mogus eina plaiu keliu struktra, ireikta mediu

  • 21

    2.2 pav. Supaprastinta priskyrimo sakinio a := b+2 struktra, ireikta mediu

    Mediu pavaizduotas eiluts generavimas atspindi eiluts struktr. Tai svarbi gramatikos savyb. Gramatika, kurioje naudojami neterminaliniai simboliai ir eiluts generavim galima ireikti mediu, vadinama struktrine gramatika.

    Gramatikos svok vardai (veiksnys, tarinys ir t. t.) yra vadinami neterminaliniais simboliais ir jie sudaro neterminalini simboli abcl N. iuo atveju

    N = veiksnys, tarinys, ...

    i abcl skiriasi nuo anksiau apibrtos terminalini simboli abcls T. Neterminaliniai simboliai yra vartojami paiai kalbai nagrinti ir jie priklauso gramatikai arba metakalbai, kuria kalbama apie kit kalb. Pati kalba sudaroma tik i terminalini simboli abcls. Taigi N T = .

    2.1 paveiksle pateiktas simboli (odi) skirstymas terminalinius ir neterminalinius gali pasirodyti dirbtinas, kadangi neterminaliniai simboliai (veiksnys, tarinys... ) taip pat yra lietuviki odiai. Skirstymas bt aikesnis, jeigu lietuvikai apraytume kit, ne lietuvi kalb. Tada aikiai matytsi, kad lietuviki sakinio dali pavadinimai ir nagrinjamas sakinys priklauso skirtingoms kalboms (2.3 pav.). Tokiu atveju lietuvi kalb ir ja parayt gramatik bt galima laikyti metakalba tos, kitos, kalbos atvilgiu.

  • 22

    2.3 pav. Latvi kalbos sakinio Cilvk iet platu ceu struktra, ireikta mediu

    Skirtumas tarp terminalini ir neterminalini simboli yra aikesnis programavimo kalbose (2.2 pav.). Akivaizdu, kad sakinys a := b + 2 priklauso programavimo kalbai. Tuo tarpu tos kalbos konstrukcij pavadinimai (kintamasis, priskyrimo enklas ir t. t.) yra neterminaliniai simboliai ir tarnauja pagalbiniams tikslams paios kalbos apraymui.

    Gramatika, kurioje kalba apibriama naudojant tarpinius simbolius, o konkreios eiluts ireikiamos mediu, vadinama struktrine kalba.

    2.3. Formalios gramatikos

    Formaliomis gramatikomis apie 20 am. 6j deimtmet susidomjo kalbotyrininkai, kai atsirado realios technins galimybs automatikai, kompiuteriu, versti tekstus i vienos kalbos kit. Buvo bandoma sudaryti matematin kalbos model. Matematika nagrinja grietai apibrtus objektus. Taigi reikjo mechanizmo formaliam kalbos apibrimui. Taip gim formalios gramatikos idja.

    Pirmuosius darbus atliko JAV Masasetso universiteto lingvistas, profesorius N. Chomskis, kuris pateik gramatik klasifikacij.

    Gramatik prireik ir dirbtini kalb programavimo kalb krjams.

    Pirm kart praktikai formali gramatik teorija buvo pritaikyta Algolo-60 kalbai apibrti. Programuotojas D. Bekus ir lingvistas P. Nauras sukr specialiai iam tikslui pritaikyt gramatik, kuri buvo pavadinta j vardu Bekaus ir Nauro forma (BNF).

    Kompiuterijoje imta domtis gramatikomis netgi daugiau, negu lingvistikoje. Mat lingvistikoje tekst i vienos kalbos kit skmingai veria mogus, nesinaudodamas formaliu matematiniu modeliu. Pasaulis nesugrius, jeigu is darbas bus neautomatizuotas arba nepakankamai automatizuotas. Tuo tarpu programavimo kalba, kurios kompiuteris negali iversti sav kompiuterin kalb, yra bevert. Ir dar formalizm lengviau taikyti dirbtiniam daiktui (t. y. programavimo kalbai), nes j galima kurti pagal gramatikos taisykles. Matyt ios prieastys ir lm, kad dabar formali kalb teorija beveik visai persikl i lingvistikos kompiuterij.

  • 23

    Paprasiausias bdas apibrti kalb, kaip aib, yra ivardyti visus jos elementus, pvz., sakinius. Bet realios kalbos yra nebaigtins aibs. Todl einama kitu keliu sudaromos taisykls, kuri pagalba galima generuoti kalbos elementus. Taisykles galima sudaryti taip, kad baigtinis j skaiius galt generuoti nebaigtin kalbos element skaii.

    Kadangi kalbos elementai yra eiluts, tai j generavimui natralu taikyti eilui operacijas. Programuotojams gerai inomos eilui (ar j dali) keitimo komandos, vartojamos tekst tvarkymo sistemose. Operacija

    u v

    reikia, kad simboli sek u, rast pradinje eilutje, reikia pakeisti seka v. itaip gaunama nauja eilut.

    Pavyzdys. Tarkime, kad turime eilut aab.

    Taikydami operacij ab bac i ios eiluts galime gauti dvi naujas eilutes:

    aab abac bacac

    Taikydami operacij b bb i pradins eiluts galime gauti be galo daug nauj eilui:

    aab aabb aabbb aabbbb

    Formalij gramatik taisyklms ir buvo pasirinkta i operacija.

    Apibrtis. Formali gramatik sudaro keturios dalys:

    1) neterminalini simboli baigtin aib N;

    2) terminalini simboli baigtin aib (kalbos abcl) T;

    3) gramatikos taisykli baigtin aib P; bendru atveju taisykl ireikiama u v, ia u (NT)+, v (NT)*;

    4) pradinis neterminalinis simbolis S (S N), nuo kurio pradedamas eilui generavimas.

    Sutrumpintai gramatika G gali bti uraoma:

    G = (N, T, P, S).

    Ankstesniuose pavyzdiuose pradiniai simboliai buvo sakinys (2.1 ir 2.3 pav.) ir priskyrimo sakinys (2.2 pav.).

    Taigi, pradioje turime vienintel eilut, sudaryt tik i vieno neterminalinio simbolio S. Taikydami generavimo taisykles gauname naujas eilutes. itaip taisykli pagalba i pradinio simbolio S gaunamos visos kalbai priklausanios eiluts.

    1 pavyzdys. Sudarysime kalbos L1

    L1 = anbn | n 1

    gramatik (j galima ymti G(L1)):

    G(L1) = (S, a, b, S aSb, S ab, S)

    Gramatika G(L1) turi dvi taisykles. Taisykl S aSb sako, kad eilut (arba jos dal) S galima keisti eilute aSb, o taisykl S ab sako, kad simbol S galima pakeisti eilute ab. Taikydami ias taisykles gausime eilutes:

    S ab

  • 24

    S aSb aabb

    S aSb aaSbb aaabbb

    S aSb aaSbb aaaSbbb aaaabbbb

    ...

    itaip galima gauti bet kuri kalbai L1 priklausani eilut ir tik jas joki kit eilui. Kuri i dviej taisykli taikyti, pasirenkame patys. Jeigu taikome taisykl S aSb, tai eilut prapleiame vienu simboliu abi puses, o viduryje paliekame simbol S tolesnio pltimo galimyb. Kai norime ubaigti eiluts generavim, taikome taisykl S ab. Tada eilutje nebelieka neterminalinio simbolio S. Ji tampa sudaryta vien i terminalini simboli.

    Apibrtis. Eilut, sudaryta vien i terminalini simboli, vadinama terminaline eilute.

    Terminalin eilut priklauso kalbai. Tuo tarpu eilut, kurioje dar yra neterminalini simboli, kalbai nepriklauso, nes neterminaliniai simboliai nra kalbos simboliai (jie yra gramatikos simboliai).

    2 pavyzdys.

    Tarkime, kad duota L2 kalbos gramatika:

    G(L2) = (B, C, S, a, b, c, P, S)

    Generavimo taisykli yra keletas, todl jas uraome atskirai:

    P = S BC

    B aBb

    B abb

    C Ccc

    C c

    Pateikiame kelet eilui, kurios priklauso kalbai L2:

    abbc

    aabbbc

    aaabbbbc

    abbccc

    abbccccc

    aabbbccccc

    Kalbos L2 eilui aib galima ireikti itokia formule:

    L2 = anbn+1 c m , n > 0, m > 0, m \ 2 = 1

    enklu / ymsime sveikj skaii dalyb, o enklu \ dalybos liekan. Taigi slyga m \ 2 = 1 reikia, kad skaiius m yra nelyginis.

    Taisykles, kuri kairs puss vienodos, apjungsime panaudodami alternatyvos simbol | (vadinam arba):

    B aBb | abb

    C Ccc | c

  • 25

    3 pavyzdys.

    G(L3) = ({D, E}, {a}, P, D}

    ia taisykls P apraomos:

    D a aE

    E aD

    Nordami nustatyti, kokios eiluts priklauso gramatika G(L3) apraytai kalbai, imkime nuosekliai taikyti taisykles:

    D a, taigi a L3.

    D aE aaD aaa, taigi aaa L3.

    D aE aaD aaaE aaaaD aaaaa, taigi aaaaa L3.

    ...

    Toliau galime velgti dsningum, todl uraome kalbai L3 priklausani eilui bendr pavidal:

    L3 = {a2n+1 n 0}.

    Seka

    u1 u2 u3 ... un

    vadinama generavimo seka.

    4 pavyzdys.

    Pateiksime sudtingesns gramatikos pavyzd:

    G(L4) = ({A, B, C}, {a, b, c}, P, A).

    Jos taisykli aib P sudaro

    A abc | aBbc

    Bb bB

    Bc Cbcc

    bC Cb

    aC aaB | aa

    Norint suvokti kalb L4, reikia pabandyti sugeneruoti pagal duotas taisykles bent kelet jai priklausani eilui. Kadangi taisykli nemaai ir jos painokos, uraysime ne tik generavimo sek, bet ir taisykles, kurias taikme. tai kokios eiluts priklauso kalbai L4:

    1) abc L4, nes

    A abc

    2) aabbcc L4, nes A aBbc Bb bB

    abBc Bc Cbcc abCbcc bC Cb aCbbcc aC aa aabbcc

  • 26

    3) aaabbbccc L4, nes A aBbc Bb bB abBc Bc Cbcc abCbcc bC Cb aCbbcc aC aaB aaBbbcc Bb bB aabBbcc Bb bB aabbBcc Bc Cbcc aabbCbccc bC Cb aabCbbccc bC Cb aaCbbbccc aC aa aaabbbccc

    Dabar jau galime urayti ir kalbai priklausani eilui bendr pavidal:

    L4 = {anbncn | n 1}

    I tikrj, it teigin turtume pirmiausia rodyti. rodymas susidt i dviej dali: reikt rodyti, kad

    {anbncn | n 1} L4

    ir kad

    {anbncn | n 1} L4

    rodymas remiasi matematiniais samprotavimais ir indukcija. J galima rasti knygoje [Backhouse79??].

    Formalias gramatikas ir kalbos eilui generavim galima sugretinti su loginmis teorem rodymo sistemomis ir teorem rodymu. Pradioje turime aksiom sistem ir teorem rodymo taisykles. Taikydami taisykles i aksiom, gauname naujus teiginius teoremas, kuri skaiius gali bti nebaigtinis. Panaiu keliu einama ir formali gramatik teorijoje. ia aksioma laikomas pradinis neterminalinis simbolis S. Taikydami gramatikos taisykles i jo gauname naujas eilutes, prilygstanias naujoms teoremoms.

    Pratimas

    2.1 lentels eiluts vardintos simboli eilutmis, o stulpeliai gramatikomis (tiksliau j taisyklmis). Paymkite pliusais tuos lentels langelius, kuri eilutse paraytas simboli eilutes galima sugeneruoti panaudojant j stulpeli gramatikas.

  • 27

    2.1 lentel

    Eilut S aSb S aBb B bB B b

    S aSb S aBb B bB B bb

    S aaS S aT S aaB B bbB B bb T bB

    S aaS S aaB B bbB B bbb

    S aaS S aB B bB B bbB B bb

    aaaaaabbb

    aaaabbbb

    aaabbbb

    abbbbbbbbb

    2.4. Gramatik klasifikacija

    Bendru atveju gramatikos taisykls pavidalas yra itoks:

    u v

    u (N T)+; v (N T)*

    u vadinama kairija taisykls puse, v deinija.

    itokiomis taisyklmis galima aprayti bet koki programavimo kalb. Taiau taisykli pavidalas yra toks bendras, kad i j maa naudos. Naudojant itokias bendro pavidalo taisykles, galima apibrti labai daug pai vairiausi kalb. Taiau toks universalumas sukuria toki didel kalb aib, kad sunku rasti nauding (ypa realizacijai) savybi, kurias turt visos kalbos. Kalb aibes galima sumainti vedant ribojimus taisyklms. Tokius ribojimus pasil N. Chomskis ir pagal juos suklasifikavo gramatikas ir kalbas. Jo pateikta klasifikacija tapo visuotinai priimta. Klasifikacija remiasi itokiais gramatikos taisykli ribojimais:

    1. uAv uwv

    2. A w

    3. A a | A aB

    ia u, v, w (N T)*

    a T

    A, B N

    Jeigu gramatikos taisyklms netaikomi jokie ribojimai, tai tokios gramatikos tipas yra 0. Jei tik pirmasis ribojimas tipas 1, jei antrasis tipas 2, jei treiasis tipas 3.

    Kiekvienas ribojimas su didesniu numeriu apima ribojimus su maesniais numeriais. Pavyzdiui, jeigu pirmj ribojim papildysime slyga u = v = , tai gausime antrj ribojim. Taip pat akivaizdu, kad treiojo ribojimo deinje rodykls pusje esanios dalys yra atskiri antrojo ribojimo taisykls deins puss atvejai.

  • 28

    Nulinio tipo gramatikos yra paios bendriausios. Jos eilui keitimo galia ekvivalenti Tiuringo mainai (2.1 lentel).

    Pirmojo tipo gramatikos vadinamos kontekstinmis gramatikomis. Tap vadinama dl to, kad eiluts pakeitim A w galima atlikti tiktai tada, kai keiiama dalis A yra tam tikrame kontekste: jos kairje yra eilut u, o deinje v. Pats kontekstas lieka toks pat ir po taisykls taikymo, tiktai jis gaubia jau nauj eilut w.

    Antrojo tipo gramatikos vadinamos laisvojo konteksto gramatikomis. Kadangi neterminalin simbol A galima keisti deinija taisykls dalimi nepriklausomai nuo to, kurioje eiluts vietoje jis bebt, t. y. nepriklausomai nuo kaimynini jo simboli.

    Beveik visos programavimo kalbos yra apraomos laisvojo konteksto gramatikomis.

    Treiojo tipo gramatikos vadinamos reguliariosiomis arba automatinmis, kadangi jos yra ekvivalenios reguliariesiems reikiniams, vartojamiems aibi teorijoje bei baigtiniams automatams. Jeigu gramatikas irsime kaip j taisykli aibes, tai galios tokia priklausomyb:

    G0 G1 G2 G3

    2.2 lentel Gramatik tipai

    Tipas Pavadinimas Generavimo taisykli

    pavidalas

    Atitikmuo algoritm

    teorijoje

    0

    Rekursin Tiuringo maina

    1

    Kontekstin uAv uwv

    2

    Laisvojo konteksto A w Dklas

    3

    Reguliarioji A t | tB arba

    A t | Bt

    Baigtinis automatas

    2.5. Kalb klasifikacija

    Kalbos skirstomos tokius pat tipus, kaip ir jas apraanios gramatikos. Taigi turime rekursines, kontekstines, laisvo konteksto ir reguliarisias kalbas. Taiau klasifikuojant kalbas esama ir ioki toki neaikum. J atsiranda dl to, kad tai paiai kalbai apibrti galima parayti daug skirting gramatik.

    Apibrtis. Dvi gramatikos, apibrianios t pai kalb, vadinamos ekvivaleniomis gramatikomis.

    Pavyzdys. Duotos dvi gramatikos, turinias tas paias simboli aibes, bet skirtingas generavimo taisykles:

    G1 = ({S}, {a, b}, P1, S), G2 = ({S}, {a, b}, P2, S),

    P1 = {S aS, S b} P2 = {S Ab, A aA | a}

  • 29

    Paanalizav gautas eilutes, galime nustatyti, kad abi gramatikos G1 ir G2 apibria t pai kalb:

    L = anb | n > 0

    Tai paiai kalbai galima parayti daug ekvivaleni gramatik. Gali bti ekvivalenios ir skirting tip gramatikos. Tokiu atveju kalbos tipu laikomas j apraanios gramatikos su didiausiu numeriu tipas.

    Jeigu mokame parayti kalbos L gramatik i tipo, tai galime tvirtinti, kad kalbos tipas yra nemaesnis kaip i.

    Norint pasakyti, kad kalba yra i tipo, reikia rodyti, kad neegzistuoja jos gramatika, kurios tipo numeris yra didesnis u i. O tai padaryti sunkiau.

    Formali kalb tyrintojai yra rod, kokio tipo yra tam tikro pavidalo eilui, ireikt aibi ymenimis, kalbos. Jeigu tokias eilui formas (trafaretus) atrasime ir nagrinjamoje kalboje, tada galsime pasiremti rodymais i formali kalb teorijos.

    Nustatyti kalbos tip yra svarbus praktinis udavinys, kadangi kuo didesnis tipo numeris, tuo paprastesnius tos kalbos transliatori raymo metodus galima taikyti.

    Tarp skirting tip kalb aibi galioja tokios pat priklausomybs, kaip ir tarp j gramatik:

    L0 L1 L2 L3.

    Tiek ios priklausomybs, tiek anksiau pateiktos priklausomybs tarp vairi tip gramatik aibi, iplaukia i pai gramatik tip apibrim (ribojim augimo). Taiau domu, ar galioja grietesns priklausomybs:

    G0 G1 G2 G3

    L0 L1 L2 L3

    Tam reikia rodyti, kad egzistuoja bent viena 0 tipo kalba (t. y. neegzistuoja tos kalbos 1 tipo, o tuo paiu 2 ir 3 tipo gramatika), egzistuoja bent viena 1 tipo ir bent viena 2 tipo kalba. Kiekvienam atvejui yra suformuluota ir rodyta teorema. Taigi egzistuoja ir grietos priklausomybs tarp gramatik ir kalb tip aibi.

    2.4 pav. Kalb tip hierarchija

  • 30

    2.6. Kontekstins kalbos

    Kontekstins kalbos programavimo kalboms apibrti beveik nenaudojamos, kadangi j realizacija sudtinga. Todl apie jas daug nekalbsime, tik pateiksime pavyzdi, kad moktume ias kalbas atpainti ir taip galtume j ivengti.

    Formali gramatik teorijoje rodyta, kad kalbos

    L1 = anbncn | n > 0

    L2 = anbncj | n > 0, n j 2n

    L3 = aibjaibj | i, j > 0

    L4 = anbnan | n > 0

    yra kontekstins. Pirmosios kalbos L1 gramatikos taisykles nagrinjome 2.3 skyr. 4 pavyzdyje. Ten pateikme ios kalbos nulinio tipo gramatik. Taiau egzistuoja ir jai ekvivalenti pirmojo tipo gramatika. Pateiksime jos taisykles.

    S aSBC | aBC

    CB BC

    aB ab

    bB bb

    bC bc

    cC cc

    Taisykl CB BC netenkina pirmojo ribojimo. Todl ji yra nulinio tipo. Taiau i taisykl galima ireikti keletu pirmojo tipo taisykli. Pabandykime jas parayti. Du neterminalinius simbolius reikia sukeisti vietomis. Kadangi pirmojo tipo gramatikos taisyklje galima keisti nauja eilute tik vien kairje pusje esant neterminalin simbol (j supantys simboliai tarnauja tik kaip kontekstas ir nra keiiami), todl kiekvieno simbolio keitim uraysime atskiromis taisyklmis.

    CB DB

    DB DE

    DE BE

    BE BC.

    I plaiau inom programavimo kalb tik Algolo-68 sintaks buvo aprayta dviej pakop gramatika, kuri yra ekvivalenti kontekstinei gramatikai. i gramatika vadinama Vijngardeno gramatika jos autoriaus A. van Wijngaarden vardu.

    Pratimai

    1. Naudodamiesi iame skyrelyje pateikta kalbos anbncn pirmojo tipo gramatika uraykite eiluts a2b2c2 generavim.

    2. Nulinio tipo gramatikos taisykl AB BA pakeiskite trimis pirmojo tipo gramatikos taisyklmis.

  • 31

    2.7. Laisvojo konteksto kalbos

    Beveik vis programavimo kalb sintaks yra aprayta laisvojo konteksto (2 tipo) gramatikomis. Taigi beveik visos programavimo kalbos yra laisvojo konteksto.

    Bdingas laisvojo konteksto kalbos pavyzdys yra

    L = anbn | n > 0

    ios kalbos gramatikos taisykles jau aptarme 2.3 skyr. 1 pavyzdyje:

    S = aSb | ab

    2.5 paveiksle pavaizduotas ios kalbos eiluts aaabbb generavimo medis. Galime pastebti, kad bet kokios iai kalbai priklausanios eiluts medis visuomet bus simetrinis: kiek yra raidi a, tiek pat ir raidi b.

    2.5 pav. Eiluts aaabbb gavimas, pavaizduotas mediu

    Laisvo konteksto gramatikos taisykli kairje pusje gali bti tik vienas neterminalinis simbolis. Taigi, kiekvien laisvo konteksto gramatikos generuojam eilut galima pavaizduoti mediu. I to galima daryti ivad, kad laisvo konteksto gramatika yra struktrin gramatika.

    1 pavyzdys.

    Panagrinsime kalb, kurios gramatik aprao taisykls:

    S AB

    A aA | a

    B bB | b

    iai kalbai priklausanios eiluts a3b2 generavimo medis pateiktas 2.6 paveiksle.

  • 32

    2.6 pav. Eiluts aaabb gavimas, pavaizduotas mediu

    Verta sidmti, kad jeigu dviej terminalini simboli skaiius yra susietas nebaigtine priklausomybe, tai kalba yra antrojo tipo, jeigu trij pirmojo tipo.

    Jeigu priklausomyb baigtin, pavyzdiui,

    L1 = anbn | 0 < n < 5

    L1 = ambn | m > 0, n > 0, m \ 2 = n \ 2

    tai, kaip vliau matysime, kalba yra treiojo tipo.

    Pratimas

    1. Paraykite laisvo konteksto gramatikas eilutms, sudarytoms i 0 ir 1, t. y. T = 0, 1, tokias, kad:

    a) kiekvieno 0 deinje bt 1;

    b) atvirkiai urayta eilut sutapt su originalia;

    c) simboli 0 bt dvigubai daugiau, negu 1.

    2.8. Reguliariosios kalbos

    Treiojo tipo gramatikos ir kalbos vadinamos reguliariosiomis dl to, kad j kalbas galima urayti reguliariaisiais reikiniais. Reguliarij reikini nenagrinsime.

    Reguliarisias kalbas taip pat galima apibrti kaip baigtinius automatus, kurie gali atlikti ir kalbos generatori (nedeterminuoti baigtiniai automatai) ir analizatori (determinuoti baigtiniai automatai) vaidmen. Dl to kartais treiojo tipo gramatikos ir kalbos dar vadinamos automatinmis.

    Baigtinius automatus prasta urayti grafikai. Tai gana vaizdus kalbos apraymo bdas. Apie baigtinius automatus kalbsime kitame skyrelyje.

    Reguliarioji gramatika, kurios taisykls uraytos aukiau pateiktu pavidalu:

  • 33

    A a

    A aB

    yra vadinama kairine gramatika, kadangi eilut generuojama i kairs dein. Pavyzdiui, jeigu turime taisykles:

    S b

    S aS

    tai eilut aaaab gaunama itaip:

    S aS aaS aaaS aaaaS aaaab.

    Reguliarioji gramatika, kurios taisykls uraytos itokiu pavidalu:

    A a

    A Ba

    yra vadinama deinine gramatika, kadangi eilut generuojama i deins kair. Tik k nagrintos kalbos deinins gramatikos taisykls bt uraomos itaip:

    S Ab

    A Aa

    A a

    Nesunku rodyti, kad abiej pavidal A aB ir A Ba taisykls generuoja tas paias kalb aibes.

    Mes skaitome ir raome i kairs dein. Todl mums prastesns yra kairins gramatikos. Jas toliau ir naudosime.

    Tai pat nesunku rodyti, kad taisykles:

    A x

    A xB

    A Bx

    ia x T+

    galima ireikti bendro pavidalo reguliarij gramatik taisyklmis. Pabandykite rodyti.

    Treiojo tipo kalbos yra paios paprasiausios. Jose negali bti ssaj tarp bet kuri dviej simboli skaiiaus, ireikto nebaigtine priklausomybe. Pavyzdiui, dl tos prieasties kalbos

    anbn | n > 0

    ambn | n > 0, m > 0, m = n + 1

    ambn | n > 0, m > 0, m = n / 5

    ambn | n > 0, m > 0, n > m

    negali bti apibriamos reguliariosiomis gramatikomis.

    Bet kuri kalba, turinti baigtin eilui skaii, gali bti aprayta reguliarija gramatika. rodymas paprastas. Taisykl, turinti pavidal A x, yra 3 tipo. Taigi kiekvienai terminalinei eilutei galima parayti po taisykl ir tursime pai paprasiausi, nors ir nepatogi su ilgu (bet baigtiniu) taisykli srau, gramatik. Pavyzdiui, kalba

  • 34

    anbn | 0 < n 100

    yra treiojo tipo. Taiau tokios kalbos gramatika bt labai griozdika turt 100 taisykli:

    S ab

    | aabb

    | aaabbb

    | aaaabbbb

    . .

    Treiojo tipo gramatikomis galima aprayti tik paias paprasiausias programavimo kalbos konstrukcijas: vardus, skaiius ir pan. Taiau ir tai svarbu, nes treiojo tipo kalb analiz labai paprasta. Transliatoriuose ji netgi atskiriama nuo sintakss analizs ir vadinama leksikos analize (r. 3 skyr).

    Pratimas

    1. Gramatik, kurios taisykls apraytos

    A aA | A aB

    B bB | B bC

    C cC | C c

    pakeiskite jai ekvivalenia gramatika, tokia, kad visos taisykls bt pavidalo

    S a | S Sa

    2.9. Baigtinio automato samprata

    Kiekviena reguliari gramatika gali bti pavaizduota orientuotu grafu, kurio virns paymtos neterminaliniais simboliais, o rodykls terminaliniais. Taisykls vaizduojamos rodyklmis. Jeigu gramatika turi taisykl A aB, tai i virns A eina rodykl, paymta terminaliniu simboliu a, virn B. Jeigu gramatika turi taisykl A a, tai i virns A eina rodykl a virn, nebeturini ssajos su neterminaliniu simboliu. Tai vienintel virn, i kurios neieina jokia rodykl. Tai pabaigos virn. J ymsime simboliu Z, o jos figr pieime storesne linija.

    Eilut pradedama generuoti nuo virns, paymtos pradiniu neterminaliniu simboliu S (ir ateinania rodykle). Einama rodykli kryptimi, kol pasiekiama virn Z. Eilut gaunama i kelyje pasitaikiusi rodykles ymini terminalini simboli.

    Pavyzdys. 2.7 paveiksle pateiktas grafas gramatikos:

    S aB | aC

    B bB | b

    C cC | c

  • 35

    2.7 pav. Nedeterminuotas automatas

    Vaikiojimas grafu prilygsta gramatikos taisykli taikymui. Vienas ingsnis atitinka vien taisykls taikym.

    Tokio pat pavidalo grafu vaizduojamas ir baigtinis automatas. Tai matematins baigtini automat teorijos objektas. i teorija taikoma kompiuterio schem (procesori) projektavime. Jos rezultatais galima pasinaudoti ir nagrinjant treiojo tipo gramatikas.

    Baigtinis automatas turi tam tikr, baigtin, bsen skaii (dl to ir vadinamas baigtiniu). Bsenos vaizduojamos grafo virnmis. Kiekvienu diskretaus laiko momentu automatas yra vienoje bsenoje. Su kiekvienu nauju laiko momentu (taktu) automatas pereina kit bsen. Jis pradeda darb nuo pradins bsenos. Automato elgsena priklauso nuo to, kokioje bsenoje jis yra: gali pereiti tik t bsen, kuri eina rodykl ir prie kalbos eiluts pridti t simbol, kuriuo paymta rodykl. Pavyzdiui, jei 2.7 paveiksle pavaizduotas automatas yra bsenoje B, tai jis gali pereiti tik t pai bsen arba galin bsen Z. Abi rodykls paymtos ta paia raide b. Vadinasi.abiem atvejais automatas generuojamos eiluts pabaigoje prirao raid b, bet vienu atveju eiluts generavimo jis dar nebaigia, o kitu baigia.

    Baigtiniai automatai skirstomi determinuotus ir nedeterminuotus. Jeigu visos rodykls, ieinanios i kiekvienos grafo virns yra paymtos skirtingomis raidmis, tai toks automatas vadinamas determinuotu, o prieingu atveju nedeterminuotu. Automatas, pavaizduotas 2.7 paveiksle yra nedeterminuotas. T pai kalb atitinkantis kitas automatas, pavaizduotas 2.8 paveiksle, yra determinuotas.

  • 36

    2.8 pav. Determinuotas automatas, apraantis t pai kalb, kaip ir 2.7 pav. pateiktas nedeterminuotas automatas

    Determinuotas automatas gali ne tik generuoti kalbai priklausanias eilutes, bet ir atpainti, ar nagrinjama eilut priklauso duotai kalbai. T. y., determinuotas automatas gali atlikti atpastanios gramatikos vaidmen. O tai labai svarbi jo savyb, lemianti jo panaudojim formali kalb teorijoje.

    Dabar sivaizduokime eiluts generavimui atvirki veiksm eiluts atpainim. Automatas skaito simboli eilut po vien simbol per laiko vienet (takt) ir priklausomai nuo perskaityto simbolio bei bsenos, kurioje jis yra tuo laiko momentu, pereina nauj bsen (t. y. pakeiia savo esam bsen).

    Turdami bet koki eilut galime lengvai patikrinti, ar ji priklauso kalbai, kuri apibria duotas automatas. Reikia paeiliui imti eiluts simbolius ir jais vadovaujantis vaikioti automato bsenomis. Jeigu automatas, perskaits paskutin eiluts simbol, atsiras galinje bsenoje, tai reik, kad eilut priklauso kalbai. Jeigu paskutinis eiluts simbolis neatves galin bsen arba vaikiojimas bsenomis ulu dar nebaigus analizuoti eiluts (automatas atsidurs bsenoje, i kurios neieina rodykl, paymta reikiamu simboliu), tai reik, kad eilut kalbai nepriklauso.

    Baigtinio determinuoto automato galin bsena turi kiek kitok status, negu nedeterminuoto: i jos gali eiti rodykls kitas bsenas. Tai galima (bet nebtina) automato darbo, o kartu ir eiluts analizs pabaiga. Jeigu pasibaig eiluts analiz galinje bsenoje, tai eilutje nebra daugiau simboli ir tada savaime nebra kur toliau eiti. Be to determinuotas automatas gali turti kelias galines bsenas.

    Automato darb paaikinsime pavyzdiu, pateiktu 2.9 paveiksle.

  • 37

    2.9 pav.

    Pradin automato bsena paymta b1.

    Pateiktas automatas atpasta itokias eilutes:

    b ab bc abc aabc aabcc aaabcc ir t. t.

    Pateiksime automato bsen kait, kai jam pateikiama eilut aaabcc. Perskaityt eiluts dal nuo neperskaitytos skirsime tarpu

    aaabcc b1 a aabcc b1 aa abcc b1 aaa bcc b1 aaab cc b2 aaabc c b2 aaabcc b2

    Nesunku sitikinti, kad kalb, kuriai priklauso i eilut, galima urayti aibe {ambcn | m 0, n 0}.

    Jeigu automatui pateiksime eilut, nepriklausani kalbai, tai kurioje nors bsenoje jis ustrigs nebus rodykls, paymtos perskaitytu simboliu, ieinanios i tos bsenos. Pavyzdiui, jeigu nagrintam automatui pateiksime eilut

    aacc

    tai jis, bdamas b1 bsenoje, perskaitys simbol c ir nebeinos, k toliau daryti (kur eiti), nes nra rodykls, paymtos simboliu c, ieinanios i bsenos b1.

    Taigi itaip pavaizduotas baigtinis automatas atitinka dalinai apibrt funkcij. Norint, kad automatas atitikt visur apibrt funkcij, reikt papildyti j dar viena bsena b, kuri jis patekt visais atvejais, kai aptinka, jog eilut nepriklauso kalbai. bsen b turi bti rodykls i vis bsen, i kuri neieina rodykls paymtos visais terminaliniais simboliais. I bsenos b

  • 38

    neturi eiti rodykls kitas bsenas. Tokio automato pavyzdys pateiktas 2.10 paveiksle. Raide b paymjome bsen, kuri automatas patekt perskaits eilut, nepriklausani kalbai.

    2.10 pav.

    Skyrelio pradioje aprame, kaip i treiojo tipo gramatikos gauti baigtin nedeterminuot automat. Vadinasi, galime tvirtinti, kad kiekvienai treiojo tipo gramatikai egzistuoja nedeterminuotas automatas. Ar tas pats galioja ir determinuotam, t. y. ar galima tvirtinti, kad kiekvienai treiojo tipo gramatikai egzistuoja determinuotas automatas?

    Taip, egzistuoja. Automat teorijoje rodoma, kad kiekvienam nedeterminuotam automatui egzistuoja j atitinkantis determinuotas automatas.

    rodymo idja labai paprasta. Nedeterminuotumo prieastis yra kelios tuo paiu simboliu paymtos rodykls, einanios i tos paios bsenos kelias skirtingas bsenas. Nedeterminuotum galima paalinti automato bsenas pakeitus visomis galimomis bsen aibmis. Jeigu nedeterminuotas turi n bsen, tai gausime 2n bsen aibi, o atmetus tui aib bus 2n-1. Tada kelios rodykls, paymtos ta paia raide ir einanios kelias skirtingas bsenas, pakeiiamos viena rodykle, einania nauj bsen, vaizduojani t bsen aib. Pailiustruosime tai ankstesniu pavyzdiu, nedeterminuot automat (2.7 pav.) pakeisdami determinuotu (2.8 pav.).

    Nedeterminuotas automatas (2.7 pav.) turi 4 bsenas. Vadinasi, determinuotas automatas turs 24-1= 15 bsen. Belieka sutvarkyti rodykles. Pradedame nuo pradins bsenos S. I jos ieinanias dvi rodykles, paymtas raide a, einanias bsenas B ir C, pakeiiame viena rodykle, einania bsen BC. Bsena BC tapo bendra dviej bsen bsena. I buvusios bsenos B, dabar jau priklausanios jungtinei bsenai BC, ieina dvi rodykls b bsenas B ir Z. Vadinasi, rodykl b turi eiti i BC BZ. Analogikai rodykl c vedama i BC CZ.

    Nepanaudotas bsenas galima paalinti ir gauname determinuot automat, pavaizduot 2.11 paveiksle, analogik pavaizduotam 2.5 paveiksle. Skiriasi tik bsen pavadinimai, kuriuos galima pakeisti.

  • 39

    2.11 pav. Determinuotas, gautas i nedeterminuoto automato, pavaizduoto 2.7 pav.

    Einant tokiu keliu kiekvienai treiojo tipo gramatikai galima sukonstruoti baigtin determinuot automat. Taiau is kelias ilgas ir danai automatas konstruojamas nesudarius gramatikos taisykli.

    Baigtin automat nesunku modeliuoti programa ir tuo paiu gauti treiojo tipo kalbos analizatori.

    Pratimai

    1. Nubraiykite schem baigtinio automato, atpastanio itokios gramatikos generuojamas eilutes:

    a) S aS | aB | aC B bB | b C cC | c

    b) S Ab | Ac | Bb | Cc A Aa | a B Bb | Aa |a C Cc | Aa | a

    2. Nubraiykite schem baigtinio automato, atpastanio Paskalio kalbos slankaus kablelio skaiius.

    3. Nubraiykite schem baigtinio automato, atpastanio visas eilutes, sudarytas i nuli ir vienet, kuriose

    a) nra greta nei trij nuli, nei trij vienet;

    b) greta esani nuli skaiius gali bti tik lyginis.

    4 Nubraiykite schem baigtinio automato, atpastanio i kalb eilutes:

    a) L1 = {anbm | n > 0, m > 0, n \ 2 = m \ 2},

  • 40

    b) L2 = {ab2n+1c | n 0},

    c) L3 = {(ab)* {bc, a}* b}.

    2.10. Gramatik ir kalb vienareikmikumas

    Labai svarbus reikalavimas programavimo kalboms kad jos bt vienareikms arba, jei kitaip nemanoma, bet kuris nevienareikmikumas bt aikus ir lengvai ivengiamas.

    Pirmiausia isiaikinsime vienareikmikumo svok. Tam atidiau panagrinkime laisvo konteksto gramatikos pavyzd (2.7 skyr. 1 pavyzdys):

    S AB A aA | a B bB | b

    Imkime eilut a3b2 ir uraykime jos generavimo sek:

    S AB aAB aaAB aaaB aaabB aaabb

    i eilut gavome taikydami taisykles sistemingai: visada keisdami pirmj i kairs neterminalin simbol. Kai eilutje yra daugiau negu vienas neterminalinis simbolis, tai galima pasirinkti, kur keisti. Jeigu eilutje AB keitimui pasirinktume antrj simbol B ir toliau keistume pirmj i deins simbol, tai gautume itoki generavimo sek:

    S AB AbB Abb aAbb aaAbb aaabb.

    Kaitaliodami pasirenkamus neterminalinius simbolius, galime gauti daugiau generavimo sek.

    Taiau jei kiekvienai iai sek konstruotume generavimo med, tai kaskart gautume t pat med (r. 2.7 skyr. 2.5 pav.). Skirtsi tik medio gavimo kelias: kuri ak: kairij ar deinij pirmiau pieiame.

    Apibrtis. Gramatika, kurios kiekvienai generuojamai eilutei galima sudaryti tik vien generavimo med, vadinama vienareikme. Prieingu atveju (t. y, jeigu generuojama bent viena eilut, kuriai galima sudaryti du ar daugiau medi) nevienareikme.

    1 pavyzdys.

    Kalbos L ={an | n 1} gramatika

    G1(L) = ({S}, {a}, {S a | aS}, {S})

    yra vienareikm, o gramatika

    G2(L) = ({S}, {a}, {S a | aS | Sa}, {S})

    nevienareikm.

    Jos eilui generavimo medi pavyzdiai pateikti 2.12 ir 2.13 paveiksluose.

  • 41

    2.12 pav. Kalbos L = {an | n 1} eilui a, aa ir aaa vienareikms gramatikos G1(L) = ({S}, {a}, {S a | aS}, {S}) generavimo mediai

    2.13 pav. Kalbos L = {an | n 1} eilui aa ir aaa generavimo mediai, gauti taikant nevienareikm gramatik G2(L) = ({S}, {a}, {S a | aS | Sa}, {S})

    Kai gramatika vienareikm, tai kiekvienai eilutei galima nubraiyti vienintel generavimo med (2.12 pav.), o kai nevienareikm, tai yra eilui, kurioms galima nubraiyti daugiau medi. iuo atveju eilutei aa du medius (2.13a pav.), o eilutei aaa keturis (2.13b pav.).

    Vienareikmikumas yra labai svarbi gramatik savyb raantiems transliatorius ir apskritai bet kokius kalbos analizatorius. Mat transliatorius i programos teksto atkuria jo generavimo med ir su kiekvienu medio mazgu (t. y. gramatikos taisykls taikymu) susieja tam tikrus veiksmus (pvz., generuoja kompiuterio komandas). Jeigu gramatika nevienareikm, tai tie veiksmai priklausys nuo to, kok med pasirinks transliatorius (kokiu keliu jis nueis analizuodamas eilut). Dl to

  • 42

    stengiamasi ivengti nevienareikmi gramatik. Kaip i ankstesnio pavyzdio galima pastebti, nevienareikmikumas atsiranda, kai gramatika turi per daug taisykli, t. y., kai t pat darb atlieka ne viena taisykl. Taigi sudarant gramatik reikia taisykles rayti sistemingai ir taip, kad j bt kuo maiau.

    Kaip nustatyti, ar gramatika vienareikm?

    Nevienareikmikum galima rodyti konstruktyviai surasti bent vien eilut, gaunam dviem skirtingais generavimo mediais. Nustatyti, ar gramatika vienareikm, sunkiau reikia rodyti, kad neegzistuoja eiluts, turinios daugiau negu vien generavimo med. Bendru atveju i problema algoritmikai neisprendiama, t. y. neegzistuoja algoritmas, kuris nustatyt, ar duota gramatika vienareikm. Taiau atskiroms gramatik grupms, o juo labiau atskiroms gramatikoms i problema isprendiama vienareikmikum galima rodyti.

    Nevienareikmikum pasitaiko ir klasikini programavimo kalb gramatikose. Buvo daug kalbama apie aptikt nevienareikmikum Algolo-60 gramatikoje. Jo prieastis yra viena i taip vadinamos simboli atvirosios eiluts E gavimo taisykli:

    E E E

    Beje, is nevienareikmikumas neturi praktins reikms (matyt todl jis ir prasmuko kalb). Mat Algole-60 simboli eiluts tik spausdinamos. Jokie kitokie veiksmai su jomis neatliekami. Dl to ne taip svarbu kokia tvarka sudedami simboliai spausdinimui ruoiam eilut. Taiau yra atvej, kur vienareikmikumas vaidina svarb vaidmen. Panagrinsime aritmetinio reikinio sintaks.

    2 pavyzdys.

    Pateiksime aritmetinio reikinio, kuriame vartojamos keturios aritmetins operacijos su kintamaisiais a, b, c, d, vienareikm gramatik G1:

    G1 = ({R, T, D}, {a, b, c, d, +, , *, /, (, )}, P, {R}), ia P sudaro taisykls

    R T | R + T | R T

    T D | T * D | T / D

    D a | b | c | d | (R)

    Neterminaliniai simboliai taisyklse turi itoki prasm:

    R reikinys,

    T termas,

    D daugiklis.

    Reikinio a + b * c / a d generavimo medis pateiktas 2.14 paveiksle.

  • 43

    2.14 pav. Reikinio a + b * c / a d generavimo medis, gautas taikant 2 pavyzdio vienareikm gramatik

    Transliatorius formuot io reikinio reikm skaiiuojanias operacijas kildamas mediu i apaios vir, t. y. pirmiausiai suformuot daugybos b * c operacij, po to formuot dalybos, sudties ir atimties operacijas. Atidiau panagrinj gramatik G1, galime sitikinti, kad pagal j bus sudaromas medis, vienareikmikai nusakantis operacij atlikimo tvark. Pirmiau atliekamos operacijos skliaustuose. Jeigu skliaust nra, tai pirmiau atliekama daugyba ir dalyba, po to sudtis ir atimtis. Greta esanios vienodo prioriteto operacijos atliekamos i kairs dein.

    Tokiems patiems reikiniams apibrti galima sudaryti nevienareikm gramatik. Pateiksime tokios gramatikos (G2) pavyzd.

    3 pavyzdys.

    G2 = ({R}, {a, b, c, d, +, , *, /, (, )}, P, {R}), ia P yra taisykl

    R a | b | c | d | (R) | R + R | R R | R * R | R / R

    Naudojantis ia gramatika aukiau nagrintam reikiniui a + b * c / a d galima sudaryti daugel medi.

    Pateikiame du skirtingus medius (2.15 ir 2.16 pav.).

    2.15 pav. Reikinio a + b * c / a d generavimo medis, gautas taikant 3 pavyzdio nevienareikm gramatik

  • 44

    2.16 pav. Kitas reikinio a + b * c / a d generavimo medis, gautas taikant 3 pavyzdio nevienareikm gramatik

    tai dl ko programavimo kalb sintakss aprauose pateikiamos reikini gramatikos i pirmo vilgsnio atrodo sudtingos ir kartais norisi jas suprastinti. Mat sudtingumas ir papildomi neterminaliniai simboliai (termas, daugiklis) reikalingi tam, kad gramatika vienareikmikai nustatyt operacij atlikimo tvark ir toki, kokios mes norime.

    Iki iol nevienareikmikumo svok taikme tik gramatikoms. Tai paiai kalbai rame ir vienareikmes, ir daugiareikmes gramatikas.

    Paprastai kalb apibdina j apraanios gramatikos savybs. Jeigu kalb apraanti gramatika yra vienareikm, tai sakoma, kad ir kalba vienareikm, prieingu atveju nevienareikm.

    Gal yra toki kalb, kuri visos gramatikos nevienareikms, t. y. kurioms negalima parayti vienareikmi gramatik?

    Taip, yra.

    Apibrtis. Kalbos, kurioms neegzistuoja vienareikm gramatika, vadinamos esminiai nevienareikmmis kalbomis.

    Pateiksime tokios kalbos pavyzd.

    {aibi cj | i 1, j 1} {aibjcj | i, j 1}

    i kalb sudaro dviej aibi sjunga.

    Pratimai

    1. Duotos gramatikos taisykls:

    R S R S R S T S T + S S T * S T U T U / T U 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

  • 45

    Aritmetini operacij semantika prasta (+ sudtis, atimtis, * daugyba, / dalyba). J atlikimo tvark apibria sintaks.

    Apskaiiuokite i reikini reikmes:

    a) 8 * 4 / 2 / 2

    b) 8 7 4 + 3 * 2 + 6 5 4

    c) 8 7 4 + 3 * 2 + 6 7 4

    d) 12 * 4 / 2 / 2

    e) 18 * 4 / 2 / 2

    f) 8 6 4 + 3 * 2 + 6 5 4

    g) 16 * 4 / 4 / 2

    h) 10 7 4 + 3 * 2 + 6 5 4

    2. Aritmetin reikin apibria gramatikos, kuri taisykls pateiktos emiau:

    a) R T | R + T | R T | R * T | R / T T a | b | c

    b) R T | T + R | T R | T * R | T / R T a | b | c

    c) R T | R F T T a | b | c F + | | * | /

    Nustatykite, kurios gramatikos vienareikms.

    Ar ios gramatikos ekvivalenios? Jei taip, kurios?

    3. Paraykite vienareikms antrojo tipo gramatikos taisykles reikiniui generuoti. Generavimo medis turi atspindti operacij atlikimo tvark. Reikinyje vartojamos dvinars operacijos ymimos iais enklais:

    * /

    +

    ia operacijos idstytos pagal prioritetus. Vienoje eilutje vienodo prioriteto operacijos. Aukiausi prioritet (pirmiausia atliekama) turi virutins eiluts operacija, emiausi apatins.

    Daugybos ir dalybos operacijos yra vienodo prioriteto, o sudties prioritetas yra auktesnis (ji atliekama pirmiau) negu atimties. Vienodo prioriteto operacijos atliekamos i kairs dein.

    Visus kintamuosius ymkite raide a.

    4. Paraykite vienareikm gramatik reikinio, kuriame operacij prioritetai yra tokie:

    * /

    +

    < >

    Greta esanios operacijos * ir (arba) / atliekamos i deins kair. Kitos vienodo prioriteto i kairs dein. Kitokia operacij atlikimo tvarka nurodoma skliaustais ( ).

  • 46

    Visus kintamuosius ymkite raide a.

    5. Nubraiykite reikinio a < a * a * a / a / a generavimo med pagal 4 udavinyje sudaryt gramatik.

    6. Paraykite vienareikm gramatik, ekvivaleni iai gramatikai

    S ABC; A aA | a | Aa; B bBb | bC | Cb | bb; C Cc | c;

    7. Vienareikm reikinio gramatik G1 (r. 2 pavyzd) papildykite klimo laipsniu operacija, ymima **. Klimo laipsniu operacija yra aukiausio prioriteto (ji atliekama pirmiausiai), o kelios greta esanios klimo laipsniu operacijos atliekamos i deins kair, t. y. reikinys

    a** b** c

    skaiiuojamos taip, lyg bt itaip sudti skliaustai

    a** (b** c)

    2.11. Kaip praktikai nustatyti kalbos tip

    Jeigu kalbai galime parayti i tipo gramatik, tai galime tvirtinti, kad kalbos tipo numeris yra nemaesnis u i. O norint tvirtinti, kad kalbos tipo numeris lygus i, reikia sitikinti, kad negalima sudaryti gramatikos, kurios tipo numeris didesnis u i. Taigi reikia pradti bandyti nuo didiausio i.

    Treio tipo kalboms nagrinjome bent dvi gramatikas generuojani (klasikin) ir atpastani (baigtin automat). Danai lengviau konstruoti automat, nes jis vaizdesnis. Pailiustruosime pavyzdiais.

    1 pavyzdys. Tegu turime kalb

    L1= {ambn | m 1, n 1}.

    Raidi a ir b skaiiai vienas nuo kito nepriklauso. Svarbu, kad visos raids a eit prie raides b. Taigi ia lengva sukonstruoti baigtin automat, kadangi bsen skaiius nepriklauso nuo m ir n. Vadinasi, kalba L1 yra treiojo tipo. J atpastanio automato schema pateikta 2.17 paveiksle.

    2.17 pav.

  • 47

    2 pavyzdys. Turime kalb

    L2 = {anbn | 1 n 4}.

    Raidi a turi bti tiek pat, kiek ir raidi b. Eilui skaiius baigtinis, vadinasi tokiai kalbai galima sukonstruoti baigtin automat. Reikia siminti raidi a skaii n. Kiekvienam skaiiui n reikia automato bsenos (2.18 pav.). Vadinasi, kalba L2 taip pat treiojo tipo.

    2.18 pav.

    3 pavyzdys. Turime kalb

    L3 = {anbn | n 1}.

    Skaiius n neribojamas. Jis gali bti kiek norima didelis. Jeigu nubraiysime automat, turint N bsen skaiiui n siminti (N = n), tai visada galima parayti eilut, turini n = N + 1 raidi, ir jos automatas neatpains. Taigi negalima sukonstruoti automato, atpastanio visas kalbos L3 eilutes. Vadinasi, kalba L3 nra 3 tipo.

    Dabar reikia bandyti kalbai L3 sudaryti antrojo tipo gramatik. Tai lengvai galima padaryti, kadangi pagal antrojo tipo gramatikos taisykles eilut galima generuoti nuo vidurio pleiant abi puses ir tuo paiu ilaikant vienod raidi a ir b skaii.

    Uraome antrojo tipo gramatikos taisykles:

    S aSb | ab

    4 pavyzdys. Nagrinkime kalb L4 = {anbncn | n 1}.

    Treio tipo gramatikos nra ko ir bandyti rayti, kadangi inome, kad jau ir eiluts daliai, pavyzdiui, anbn, tokios gramatikos negalima parayti.

    Antrojo tipo gramatikos kalbai L4 taip pat nepavyks parayti, kadangi ia turi bti vienodas trij raidi skaiius, o eilut yra tiesin figra, ir pagal antrojo tipo gramatik taisykles j galima plsti tik dvi puses, o treiai raidei (pusei) nebra priemoni.Taigi kalba L4 nra antrojo tipo. Belieka bandyti parayti jai pirmojo tipo gramatik. T jau esame padar anksiau (2.3 skyr. 4 pavyzdys, 2.6 skyr.).

    Pratimas

  • 48

    1. Nustatykite i kalb tip (visur m, n, p, s, k natralieji skaiiai).

    1) ambncm;

    2) abcn;

    3) abcn, n < 100;

    4) anbm, n \ 2 = 1, m \ 2 = 1;

    5) anbm, n \ 2 = m \ 2;

    6) anbn+1cn-1;

    7) ambncpdsek;

    8) akbmcndp k m, m n, n p;

    9) akbmcndp k = m = n = p;

    10) akbmcndp k < m < n < p

    11) akbmcndp k + m + n + p < 100;

    12) anbncndn n \ 10 = 1.

    2.12. Bekaus ir Nauro forma

    Tuo metu, kai N. Chomskis klasifikavo gramatikas, D. Bekus, dirbdamas grupje, kurianioje kalb Algol-58 (tai buvo Algolo-60 pirmtakas), gavo uduot aprayti i kalb. Tarptautinje konferencijoje 1959 m. D. Bekus perskait praneim, kuriame pristat formalizuot ymen sistem Algolo-58 kalbos sintaksei aprayti.

    1960 metais buvo parengtas naujas Algolo variantas Algolas-60. Jo sintaks apra P. Nauras, iek tiek modifikavs D. Bekaus pateiktj schem. Nuo to laiko is metodas programavimo kalb sintaksei aprayti vadinamas Bekaus ir Nauro forma, sutrumpintai BNF.

    BNF yra laisvo konteksto gramatikos taisykli rinkinys. Taisykls pateikiamos iek tiek kitokiu pavidalu, negu priimta gramatikose:

    * vietoj rodykls raomas simbolis: := (panaus priskyrimo simbol),

    * neterminaliniai simboliai raomi tarp enkl < > (kartais vadinam kampiniais skliaustais).

    Pavyzdiui, antrojo tipo gramatikos taisykl

    S aSb | ab

    bt uraoma itaip:

    : := a b | a b

    Kampiniai skliaustai parodo pavadinimo pradi ir pabaig. Jais apskliaustas pavadinimas, neirint i kiek raidi arba odi bt sudarytas, laikomas vienu neterminaliniu simboliu, pavyzdiui,

  • 49

    Tai patogu apraant programavimo kalbas, nes neterminalinius simbolius galima vadinti prasmingais jais ymim svok vardais.

    1 pavyzdys. Neneigiamas skaiius.

    : := 0 1 2 3 4 5 6 7 8 9

    : := |

    2 pavyzdys. Vardas. Sudaromas i raidi ir skaitmen, prasideda raide.

    : :=

    Kampiniai skliaustai padeda atskirti terminalinius simbolius nuo neterminalini. Pavyzdiui, uraas

    yra terminalinis simbolis, o tas pats nesuskliaustas odis

    funkcija

    bt suprantamas kaip terminalinis simbolis (pvz., bazinis odis), arba terminalini simboli seka (pvz., raidi seka, sudaranti vard).

    Dl to nereikia atskirai ivardyti neterminalini ir terminalini simboli abcli prireikus juos galima irinkti i taisykli. Pradin simbol taip pat galima vienareikmikai nustatyti i taisykli susitarus, kad jis nebus panaudotas n vienos taisykls deinje pusje. Taigi kalbos gramatikai apibrti pakanka vien BNF taisykli (nereikia nurodyti pradinio neterminalinio simbolio, neterminalini simboli abcls ir terminalini simboli abcls).

    Pai BNF taip pat galima laikyti kalba. Kadangi ji vartojama kitai programavimo kalbai apibrti, tai j reikt vadinti metakalba. Taisyklse vartojami simboliai

    : := | < >

    priklauso metakalbai, todl jie vadinami metasimboliais. Metasimboliais taip pat laikomi neterminaliniai simboliai, nes jie taip pat nepriklauso BNF apibriamai kalbai.

    3 pavyzdys. 1 lentelje pateiktas nedidels programavimo kalbos (pavadinkime j LP labai paprasta) sintakss apraas Bekaus ir Nauro forma.

    2.3 lentel. LP kalbos sintaks

    1. : := program ; ;

    begin

    end.

    2. : := var : integer

    3. :=

    | ,

  • 50

    4. : :=

    | ;

    5. : :=

    |

    |

    |

    |

    |

    6. : := :=

    7. : :=

    8. := if

    then

    | if

    then

    else

    9. : := while do

    10. : := read ()

    11. : := write ()

    12. : := begin

    end

    13. : :=

    14. : :=

    | +

    | -

    15. : :=

    | *

    16. : :=

    |

    | ()

    17. : := < | | >=

    18. : :=

    |

  • 51

    |

    19. : :=

    |

    20. : := a | | b | c | d | e | | | f | g | h | i | | y| j | k | l

    | m | n | o | p | q | r | s | | t | u | | | v | w | x | z |

    21. : := 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

    Pastaba.Taisykli numeriai nepriklauso BNF. Sunumeravome tam, kad taisykles bt patogiau vardyti.

    Tai labai paprasta kalba, turinti tik 21 taisykl. Reali programavimo kalb (pvz., Paskalio, Modulos) sintaksei aprayti reikia apie imt du imtus taisykli.

    Programavimo kalbos konstrukcij, kurias priimta idstyti kelias eilutes (visos programos, sudtinio sakinio, ciklo sakinio, slyginio sakinio) taisykli deinisias puses dstme eilutes ir lygiavome taip, kaip priimta programose.

    7 taisykl yra neproduktyvi, kadangi jos dein pus sudaro tik vienas neterminalinis simbolis, o vieno neterminalinio simbolio keitimas kitu nieko naujo neduoda. Jeigu 6, 10 ir 16 taisyklse vietoj simbolio raytume simbol , 7 taisykl bt galima paalinti. Sintakss poiriu neterminaliniai simboliai ir yra sinonimai. Taiau jie turi skirting prasm (semantik). Dl to jie duoda papildomos informacijos skaitytojui: tuo pasakoma, kad, pavyzdiui, priskyrimo sakinio kairje pusje gali bti tik kintamojo, o ne kokio nors kito objekto (pvz., programos) vardas. i informacija naudinga ir raant transliatori (r. skyr).

    Aprae (2 ir 3 taisykls) apraomi kintamieji. Taiau ia vartojome netermi