YACC/BISON - edasi?

LEX/YACC(BISON) töötati välja 70-nate aastate keskel. Sel ajal oli (peaagu) kõige tähtsam kriteerium translaatori (kompilaatoiri, interpretaatori) töökiirus, sellepärast oli üldkehtiv nõue: translaatori (kompileri, interpretaatori) kõik etapid peavad töötama lineaarses ajas, s.t. ilma tagasipöördumisteta ('backtrackings' - kuid mis on vahepeal juhtunud protsessoritega?).
Sellepärast kasutavad (peaaegu) kõik automaatsed transleerimissüsteemid (compiler-compilers - Yacc, Bison jne) väga piiratud grammatikate klasse, s.t. enne nende kasutamist peab transleeritava keele grammatika teisendama süsteemi poolt nõutud kujule - s.t. süsteemi (YACC, BISON) kasutaja peab aru saama (näiteks) YACC-is (BISON-is) kasutatava LALR(1) grammatikate klassi määratlusest ja oskama oma keele grammatikat teisendada sellele kujule.
Esimene (tingimusteta) nõue grammatikale on ühesus (s.t. semantika peab olema üheselt määratud). Kuid edasi muutub asi üsna segaseks.
oletame, et meil on lihtne toodangujuhtimiskeel (assembly language), kus on võimalik anda järgnevat tüüpi käsklusi (iga käsk eri reale, järgnevad mitteterminalid peaks olema arusaadavad; iga käsurida koosneb MÄRGEND: TEGEVUS OBJEKT, kuid MÄRGEND: ja OBJEKT võivad ka puududa):

MÄRGEND: TEGEVUS OBJEKT
alga: klopsi_kokku kast
TEGEVUS OBJET:
vii_lattu kast
TEGEVUS
lõpeta

Sellise keele (ühese) grammatika võib esitada näiteks sellisena:

statement label opcode operand
label id: |
opcode id
operand id |

- kuid BISON-ile selline vorm ei kõlba ja ta annab teate konfliktidest; (vt vastavad Flex-i fail ja Bison-i fail). BISON-it rahuldav vorm saadakse ühe tühja parema poole nihutamisega allapoole:

statement label opcode operand | opcode operand
label id:
opcode id
operand id |

Sellistest peensustest arusaamine muudab YACC/BISONI kasutamise küllaltki raskeks; palju probleeme tekib ka (näiteks) mitteterminalide/lekseemide tüüpide määramisel, nimedetabeli/attribuutide kontrueerimisel jne jne.

On ka "paremaid" töövahendeid (kuid ka nende kasutamisel peab olema üsna hea formaalsete/grammatiliste süsteemide arusaamine). Samadel 70-ndatel aastatel töötati välja translaatorite ehitamise süsteemid, mis kasutasid (peaagu) kitsendusteta grammatikaid:
- Accent - "modern compiler compiler that can process all grammars without any restriction" (tegelikult võimatu, kui grammatika on mitmene ;-) )
- Spark - programmeerimiskeelele Python põhinev samuti (peaagu) kõigi kontekstivabade grammatikate jaoks) töövahendite (tools) kogu
- ASF+SDF - analoogiline

Translaator pole võrreldav tavalise programmiga, mis saab kusagilt sisendeid ja arvutab nende põhjal mingeid väljundeid. Translaatori on funktsioon, mis teisendab ühe stringi (sisenteksti) teiseks (väljundtekstiks). Kuna sisend ja väljund on (peaagu) fikseeritud (interpretaaatori (näit kalkulaatori) korral peab väljundil olema oma sisend/väljund), muutub kogu translaatori konstrueerimise ülesanne (antud spetsifikatsiooni teisendamine teiseks) nn metaprogrameerimise ülesandeks. Selleks on välja töötatud palju nn funktsionaalseid Metakeeli (ML); praegu tunduvad neist huvitavamad näiteks Ocaml, (open source!; erinevate versioonid/tutoriaalide jms jaoks vt INRIA ) mille ka näiteks ( paha paha küll, aga 'ce la vie') Microsoft on lubanud võtta oma järgmise ML aluseks.


Küsimused, probleemid:
jaak@cc.ttu.ee

Tagasi loengute sisukorra juurde