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.