Számítástechnika – eszperantó igeragozó program

Számítástechnika – eszperantó igeragozó program

– 

Bevezetés

Az első számítógépem még a PC előtti korszakból az Enterprise 128 volt, amit 1985-ben dobtak piacra, és egy Z80-as processzor a lelke. Hobbiból írogattam és írogatok ma is néha erre a gépre BASIC programozási nyelven programokat.

A kép a www.ep128.hu oldalról származik.


Legújabb ötletem olyan program volt, amibe beírunk egy igét és kiírja a ragozását. Ilyen programok, internetes oldalak már szinte minden nyelvre léteznek, mégis érdekes kihívás megpróbálni egy ilyen programot elkészíteni. Ez a program a beírt igealakból meghatározza az ige tövét, majd ehhez hozzáilleszti az igeragokat, és ha olyan nyelvről van szó, a ragozott igealakok elé a személyes névmást is kiteszi. Ez önmagában egyáltalán nem tűnik nehéznek. A gond a rendhagyó igéknél kezdődik, a programnak fel kell tudnia ismerni az összes rendhagyó igét és azt is be kell programozni, hogy ezekkel a rendhagyó igékkel mit is kezdjen. Nyilván célszerű valami logikát keresni a rendhagyó igék között is, hogy lehetőség szerint ne kelljen az összes rendhagyó igét külön-külön beprogramozni, hanem bizonyos ismérvek alapján a gép felismerje, hogy az adott ige ragozása milyen is lesz, illetve, ha külön meg is kell adni néhány rendhagyó igét, azok ragozására valamiféle szabályt meg tudjunk adni, ami több rendhagyó igére is alkalmazható. Persze így is lesznek teljesen rendhagyó igék, melyek ragozását egyáltalán nem lehet szabályba foglalni, de ezeket ki kell szűrni, hogy a program ne legyen nagyon hosszú.

A legegyszerűbb nyelv, amiben egyáltalán nincsenek rendhagyó igék, az eszperantó. Bemelegítésként célszerű legelőször erre a nyelvre írni igeragozó programot. (Eszperantó igeragozási táblázat itt található.)
A következőkben bemutatom azt a BASIC nyelven írt programomat, amely tetszőleges eszperantó igét elragoz minden igeidőben. Ennek megértéséhez nem árt, ha tisztában vagyunk bizonyos BASIC programozási ismeretekkel, de igyekszem a programot úgy mutatni be, hogy aki nem ért a programozáshoz, az is tudja követni. A program az Enterprise 128 számítógép IS-BASIC-jéhez íródott, de az elv más programozási nyelvbe is könnyen átültethető, így pl. minimális változtatásokkal Visual basic-ben is futtathatóvá lehet tenni és pl. windowsos alkalmazás is fordítható belőle. Itt csak a program nyelvtani szempontból érdekes részeit ismertetem, így a lentebb idézett programsorok önmagukban nem elegendőek a program működéséhez.

Először is, nem feltétlen szükséges, de nem árt, ha definiálunk eszperantó karaktereket, ezek elegánsabban néznek ki. A számítógépek ilyeneket alapból nem tartalmaznak, talán még a mai PC-ken sincs alapból eszperantó karakterkészlet. Ez szorosan nem kapcsolódik az igeragozáshoz, sem a nyelvészethez, ezért erre itt nem térnék ki.

1. lépés: az igető meghatározása a beírt igealakból

1.0.
Elvárhatnánk, hogy a felhasználó mindig az ige főnévi igenév alakját adja meg, így a legegyszerűbb megvalósítani az első lépést. De tegyük fel, hogy nem a főnévi igenevet írja be, hanem egy ragozott igealakot, ami akár összetett igeidőben, akár szenvedő alakban is állhat, és ha olyan kedve van a felhasználónak, még a személyes névmást is kiteszi elé, és ebből kell az igetőt meghatározni, és nem árt, ha azt is kiírja a program, hogy a felhasználó által beírt igealak milyen igeidőben, igemódban stb. áll.

Először is egy szöveges változóban (VERB$) letároljuk azt a szót, amit a felhasználó beírt:

10 INPUT PROMPT “Esperanta verbo:”:VERB$

Ennek hatására a képernyőn megjelenik az Esperanta verbo felirat, utána a kurzorral, ide beírhatunk lényegében bármit, jobb esetben eszperantó igét írunk be ide, de ha valami mást írnánk be, a programnak azt is tudnia kell kezelnie és ki kell írnia, hogy ez bizony nem eszperantó ige volt.
Definiáljuk a program elején a VOCO$ változót is, amibe az igenem kerül (cselekvő vagy szenvedő)!

15 LET VOCO$=”aktivo”

Az igenemet cselekvőnek határoztuk meg ezzel. A későbbiekben a program tüzetesebben megvizsgálja a beírt igealakot, és ha szenvedő igealaknak találja, akkor majd a VOCO$ változó tartalmát átírja “pasivo”-ra. Az aktív igealakokból több van, így külön nem kell majd minden egyes esetben beállítani, hogy “aktivo” legyen a VOCO$ tartalma, mert ez eleve adott lesz, ha most a program elején definiáljuk, a későbbiekben csak akkor kell ezt “pasivo”-ra megváltoztatni, ha passzív alakot észlel a program, különben nem változtatja a változó tartalmát és marad “aktivo”.

1.1.
Legelőször azt kell megvizsgálni, hogy a bekért VERB$ változó elején található-e személyes névmás, mert ha igen, akkor az igető előállításához ezt el kell hagyni, ill. a névmás alapján meghatározni, hogy az ige milyen számban és személyben áll. Ha a VERB$ elején a mi, vi, li, sxi, gxi, ni, ili betűcsoportok egyike áll, utána egy szóközzel, akkor a VERB$ változó elején egyértelműen egy személyes névmással van dolgunk. Azért fontos, hogy az említett betűcsoportok után szóköz is legyen, mert ha nincs, akkor maga az igealak (lexéma) is kezdődhetne akár ezekkel a betűcsoportokkal (pl. a miskompreni – félreért, minaci fenyeget elején a “mi” nem személyes névmás, hanem az igetőhöz tartozik). Tehát ha az említett betűcsoportok szerepelnek a változó elején egy szóközzel, akkor ezeket el kell a változó elejéről hagynunk és egy másik változóba, pl. a PERSONO$-ba beleírnunk, hogy a személyes névmások alapján az ige milyen számban és személyben áll. A gyakorlatban ez a következőképpen néz ki (a szóközök helyett a _ karaktert használom, hogy egyértelműbb legyen):

20 L=LEN(VERB$)
25 LET PERSONO$=” “
30 IF VERB$(1:3)=”mi_” THEN LET VERB$=VERB$(4:L):LET PERSONO$=”unua persono singularo”
40 IF VERB$(1:3)=”vi_” THEN LET VERB$=VERB$(4:L):LET PERSONO$=”dua persono singularo au pluralo”
50 IF VERB$(1:3)=”li_” THEN LET VERB$=VERB$(4:L):LET PERSONO$=”tria persono singularo”
60 IF VERB$(1:4)=”sxi_” THEN LET VERB$=VERB$(5:L):LET PERSONO$=”tria persono singularo” *
70 IF VERB$(1:4)=”gxi_” THEN LET VERB$=VERB$(5:L):LET PERSONO$=”tria persono singularo” *
80 IF VERB$(1:3)=”ni_” THEN LET VERB$=VERB$(4:L):LET PERSONO$=”unua persono pluralo”
90 IF VERB$(1:4)=”ili_” THEN LET VERB$=VERB$(5:L):LET PERSONO$=”tria persono pluralo”

A 20-as sorban az L változóba beolvastuk a VERB$ sztring hosszát (tehát annak a szövegnek a hosszát, amit a felhasználó beírt eszperantó ige gyanánt), ezt az L változót a következő sorokban fogjuk használni. A 30-90-es sorokban a VERB$ mellett a zárójelbe tett két szám azt jelenti, hogy a VERB$ változót hányadik betűjétől hányadik betűjéig vizsgáljuk éppen. Ha a szóban forgó betűk a személyes névmások végükön egy szóközzel (ezt a pirossal kijelölt részek vizsgálják meg a sorokban), akkor a piros rész után következő utasításokat hajtja végre a gép a sor végéig, azaz először egy definiáló egyenlőséggel (LET utasítás) újradefiniálja a VERB$ változó tartalmát úgy, hogy a névmások már nincsenek ott az elején, tehát a 4. vagy az 5. betűtől számítva a sztring végéig fog tartani az új VERB$ sztring hossza. A sorok végén pedig a PERSONO$ sztringet definiáljuk, attól függően, hogy mi volt a személyes névmás. Problémát okozhatnak az eszperantó karakterek, én a 60-as és 70-es sorban ezek alternatíváját alkalmaztam (ezért vannak *-gal megjelölve), de az eszperantó karakterekhez is lehetne igazítani ezt a programrészt, ekkor a VERB$ sztring melletti zárójelbe tett második szám 4 helyett 3 lenne, hiszen az eszperantó karaktert tartalmazó névmás egy karakterrel rövidebb. Az igazi programban persze meg kell adni mind az eszperantó karakter, mint annak helyettesítésének lehetőségét, hogy akárhogy is írja be a felhasználó, a program felismerje az igealak elején az esetleges személyes névmást.
A 25-ös sorban egy üres PERSONO$ változót definiáltunk. Erre azért volt szükség, hogy ha a következő sorokon végigmegy a program, és egyik feltételnek sem felel meg a VERB$ változó tartalma (tehát a felhasználó nem írt személyes névmást az igealak elé), akkor is legyen valami a PERSONO$ változóban, amit kiír majd a program. Ha nem így lenne, hibaüzenetet kapnánk, mert a PERSONO$ változó nincs definiálva.
Ha pedig a felhasználó nem adott meg személyes névmást, a 20-90-es soroknak nincs hatása, nem történik semmi a VERB$ változóval.
Ha személyes névmás állt az elején, akkor az onnan lekerül, és egy lépéssel közelebb kerültünk az igetőhöz, aminek segítségével majd az adott ige minden alakját kiírja a program minden igemódban és igeidőben, erre  azonban majd a második lépésben fog sor kerülni.

1.2.1.
Az előző lépésben a beírt igealak elejéről az esetleges személyes névmást eltávolítottuk, így most egy személyes névmás nélküli ragozott igealakkal vagy valamilyen igenévvel kell elbánnunk.
Most azt kell megvizsgálni, hogy a felhasználó egyszerű vagy összetett igealakot írt-e be. Mivel az összetett igealak első tagja csakis estas, estis, estos, estus, estu vagy esti betűcsoport lehet, meg kell vizsgálni, hogy a VERB$ első betűi ezek valamelyike-e, utánuk egy szóközzel. Ha igen, és a VERB$ még az említett betűcsoportok után további karaktereket is tartalmaz, akkor egyértelműen összetett igealakkal van dolgunk (kivéve persze, ha a beírt igealak második részének végződése nem felel meg semmilyen eszperantó igealaknak sem, hamarosan erre is kitérünk). Először azt tárgyaljuk és azt vizsgálja meg a program, hogy összetett igealakot írt-e be a felhasználó, és ha igen, akkor mit kezdjünk vele. Az 1.2.2. pontban lesz szó arról, mi a helyzet, ha egyszerű igealakot írt be a felhasználó.
Ha a VERB$ eleje estas, és utána még további karakterek is állnak, akkor a VERB$ elejéről ezt az estas szót el kell hagyni az utána álló szóközzel együtt, és le kell tárolni újabb változókban, hogy kijelentő mód jelen idővel (Indikativo prezenco) van dolgunk. Ez a következőképpen néz ki a gyakorlatban:

95    LET TEMPO$=” “:LET MODO$=” “:LET L=LEN(VERB$)

100 IF VERB$(1:5)=”estas_” AND L>6 THEN
110     LET TEMPO$=”prezenco”:LET MODO$=”indikativo”:LET VERB$=VERB$(7:L)
120     CALL KOMPLEKSA1
130 END IF

A 100-as sorban a gép megvizsgálja, hogy a VERB$ változó első 6 karaktere az estas -e a végén egy szóközzel, és hogy a VERB$ változó hossza (amit a 95-ös sorban az L változóban tároltunk le) nagyobb-e 6 karakternél. Ha ezeknek a feltételeknek megfelel a VERB$, akkor a következő 2 sort végrehajtja a program, ha pedig nem, akkor csak simán tovább ugrik a 130. sor utánra. Ha tehát megfelelt a VERB$ változó az említett feltételeknek, akkor a TEMPO$ változó a “prezenco”, a MODO$ változó az “indikativo” tartalmat kapja és a sor végén egy definiáló egyenlőséggel a VERB$ változót újradefiniáljuk úgy, hogy az elejéről az estas segédigét lekapjuk az utána álló szóközzel együtt, azaz csak a 7. karakterétől a végéig tartjuk meg a VERB$ változót. Majd a 120-as sorban meghívunk egy eljárást, amiben az összetett igealak második tagját fogjuk megvizsgálni, erről az eljárásról később lesz szó. Ezt az eljárást meg fogjuk hívni akkor is, ha nem estas, hanem estos, estis, estus, estu, esti az összetett igealak első tagja, ezért is célszerű külön eljárást hívni meg, mert az összes esetben ugyanazt vizsgálná meg a gép az összetétel második tagjában, célszerűbb ezt egy külön programrésszel végrehajtatni és ezt a programrészt meghívni, mint mind az 5 esetben ugyanazokat a programsorokat beírni újra meg újra.
A 95-ös sorra azért van szükség, mert a későbbiekben majd kiíratjuk az eredetileg beírt igealak idejét és módját. Ha nem ragozott igealakot adtunk meg, akkor a TEMPO$ és MODO$ változók nem kerülnének definiálásra, és kiíratásukkor hibaüzenetet kapnánk, hasonlóan a fentebb említett PERSONO$ változóhoz a 25-ös sorban. Az L változót (a VERB$ hosszát) már korábban a 20. sorban is letároltuk. Azért volt szükség a 95. sorban újra letárolni, mert ha a beírt igealak személyes névmást is tartalmazott, akkor azt az előzőekben eltávolítottuk a VERB$ elejéről, így a VERB$ hossza is megváltozott. Ha nem volt személyes névmás a VERB$ elején és nem változtattuk meg a hosszát, akkor a 95. sorban újra megadjuk az L változóban a VERB$ hosszát, ami ugyan felesleges, de hibát nem okoz.

Nos, az imént megnéztük, mi a helyzet, ha az összetett igealak első tagja az estas. Nézzük most meg ugyanezt az estis, estos, estus, estu, esti segédigékre alkalmazva is!

140 IF VERB$(1:6)=”estis_” AND L>6 THEN
150     LET TEMPO$=”preterito”:LET MODO$=”indikativo”:LET VERB$=VERB$(7:L)
160     CALL KOMPLEKSA1
170 END IF

180 IF VERB$(1:6)=”estos_” AND L>6 THEN
190     LET TEMPO$=”futuro”:LET MODO$=”indikativo”:LET VERB$=VERB$(7:L)
200     CALL KOMPLEKSA1
210 END IF

220 IF VERB$(1:6)=”estus_” AND L>6 THEN
230     LET MODO$=”kondicionalo”:LET VERB$=VERB$(7:L)
240     CALL KOMPLEKSA1
250 END IF
– Mivel feltételes módban egy közös alak van, a TEMPO$ változót nem definiáltuk. Ugyanez lesz a helyzet lentebb a felszólító módnál (Volitivo) és a főnévi igenévnél (Infinitivo) is.

260 IF VERB$(1:5)=”estu_” AND L>5 THEN
270     LET MODO$=”volitivo”:LET VERB$=VERB$(6:L)
280     CALL KOMPLEXA1
290 END IF
– Az estu segédige, a fentiekkel ellentétben csak 4 betűből áll, ezért itt nem L>6, hanem L>5 szerepel utána, és a következő sorban is a 6. karaktertől a szó végéig definiálja újra a program a VERB$ változó tartalmát. Ugyanez igaz az esti segédigére is lent.

300 IF VERB$(1:5)=”esti_” AND L>5 THEN
310     LET MODO$=”infinitivo”:LET VERB$=VERB$(6:L)
320     CALL KOMPLEKSA1
330 END IF

1.2.1.1.
Ezek után nézzük meg, mit is csinál az a KOMPLEKSA1 eljárás! Fent az összetett igealak első tagját vizsgálta a program és ennek alapján meghatározott bizonyos igei kategóriákat (idő és mód), továbbá a segédigei részt eltávolította a beírt igealak elejéről, amivel az ige tövéhez egy lépéssel közelebb kerültünk. A KOMPLEKSA1 eljárás pedig az összetétel második tagját fogja vizsgálni és abból további igei kategóriákat fog meghatározni, az igealak végéről pedig a grammatikai morfémát elhagyva az ige tövét immár meg is kapjuk.
Ha a beírt igealak utolsó 4 betűje anta, akkor folyamatos (imperfekta), ha inta, akkor befejezett (perfekta), ha onta, akkor beálló (predikta) változattal (rilato) van dolgunk. Meg kell tehát állapítani a változatokat a végződés alapján, és a változatokra utaló végződéseket eltávolítani a VERB$ változó végéről, és így megkapjuk az ige tövét (ami alapján az igét az összes igeidőben végigragoztathatjuk majd a géppel). A gyakorlatban ez így néz ki:

16  LET RILATO$=” “
340 DEF KOMPLEKSA1
345     LET L=LEN(VERB$)

350     LET GOND=1
360     IF VERB$(L-3:L)=”anta” THEN LET RILATO$=”imperfekta”:LET GOND=0
370     IF VERB$(L-3:L)=”inta” THEN LET RILATO$=”perfekta”:LET GOND=0
380     IF VERB$(L-3:L)=”onta” THEN LET RILATO$=”predikta”:LET GOND=0
390     IF VERB$(L-2:L)=”ata” THEN LET RILATO$=”imperfekta”:LET VOCO$=”pasivo”:LET GOND=2
400     IF VERB$(L-2:L)=”ita” THEN LET RILATO$=”perfekta”:LET VOCO$=”pasivo”:LET GOND=2
410     IF VERB$(L-2:L)=”ota” THEN LET RILATO$=”predikta”:LET VOCO$=”pasivo”:LET GOND=2
420     IF GOND=0 THEN LET VERB$=VERB$(1:L-4):GOTO 1000
430     IF GOND=2 THEN LET VERB$=VERB$(1:L-3):GOTO 1000
440     IF GOND=1 THEN LET RILATO$=”???”:GOTO 2000
450 END DEF

A 16. sorban még a program legelején definiálunk egy üres RILATO$ változót, erre azért van szükség, mert ha az eljáráson belül definiálnánk először a változót, belső változó lenne, és az eljárásból visszatérve már nem élne és tartalmának kiíratásakor hibaüzenetet kapnánk. Az L változóban azért definiáljuk újra a VERB$ hosszát, mert az előzőekben a segédigét letöröltük a változó elejéről, így hossza is megváltozott.
A GOND változóra azért van szükség, hogy ha sem anta, inta, vagy onta, sem ata, ita, vagy ota végződés nem lenne az igealak végén, akkor kiderüljön, hogy gond van és nem eszperantó igét írt be a felhasználó. Ha anta, inta, onta végződések valamelyikével találkozik a program, a GOND változó értékét 0-ra állítja (360-380. sorok), a 420. sorban pedig megvizsgálja, hogy nulla-e az értéke, és ha igen, előállítja az ige tövét a VERB$ változóba definiáló egyenlőség segítségével úgy, hogy az utolsó négy betűjét (az anta, inta vagy onta végződést) elhagyja. Ha ata, ita, ota végződések valamelyikét észleli a program, a GOND változó értéke 2 lesz (390-410. sorok), és a 430. sorban megvizsgálja, kettő-e az értéke és ha igen, akkor a VERB$ változóba előállítja az ige tövét úgy, hogy az utolsó három betűjét (az ata, ota vagy ita végződést) elhagyja. Ugyanakkor a VOCO$ változó értékét “pasivo”-ra állítja, amikor ata, ita vagy ota végződést talált. Anta, inta, onta végződéseknél nem kell a VOCO$ változót “aktivo”-ra állítani, mert a program legelején ezt a változót már “aktivo”-nak definiáltuk, így a programban sehol máshol nem kell ezt már “aktivo”-ként definiálni, csak itt, az összetett igealakoknál kell átírni “pasivo”-ra, ha ata, ota, vagy ita a végződés.
Viszont ha a GOND változó értéke 1 maradt, tehát egyik végződést sem detektálta a program, akkor az összetett igealak második tagja nem eszperantó igealak, így a RILATO$ tartalma “???” lesz. Ettől függetlenül az összetett igealak első tagja, az esti ige lehet helyesen megadott igealak és az általa kifejezett igei kategóriákat a későbbiekben ki is írja a gép, de az igeváltozatot nem tudta felismerni, így az igetövet sem tudta előállítani, tehát a felhasználó által beírt “igét” nem tudja elragozni.

Ha szabályos eszperantó igealakot adtunk meg, akkor a program futása az 1000. sorban folytatódik (420. és 430. sor), erről az 1.3. pont alatt lesz szó (a beírt ige kategóriáinak kiírása és a tő alapján az ige végigragozása minden igeidőben). Ha nem szabályos igealakot adtunk meg, akkor az 2000. sorban fog a program futása folytatódni, így is kiírja a felismert igei kategóriákat, de az ige elragozására már nem kerül sor, erről is az 1.3. alatt lesz szó.

1.2.2.
Az előzőekben megvizsgáltuk, mi a helyzet, ha összetett igealakot írt be a felhasználó. Ha tehát a beírt igealak elején nem az esti ige valamelyik alakja áll, akkor a program nem írt ki semmit, hanem továbbment arra a részre, amit most fogunk tárgyalni.
A programnak meg kell vizsgálnia, hogy az ige végén mi áll. Ha nem i, as, is, os, us, u, anta, inta, onta, ata, ita, ota betűcsoportok valamelyike, akkor egyértelműen nem eszperantó igét írt be a felhasználó, mivel minden eszperantó igealak az említett betűcsoportok egyikére végződik. Ilyen esetben a program udvariasan felkéri a felhasználót, hogy ugyan már szedje össze magát és szíveskedjen eszperantó igét írni be. Ezt az udvarias üzenetet mindenkinek a fantáziájára bízom. Most inkább nézzük meg azt, hogy mit kezd a program az előbb említett végződésekkel!

460 IF VERB$(L:L)=”i” THEN LET VERB$=VERB$(1:L-1):LET MODO$=”infinitivo”

Az L változóban tároltuk le korábban a VERB$ változó hosszát, itt most a VERB$(L:L) azt jelenti, hogy az utolsó karakterétől az utolsó karakteréig vizsgáljuk, magyarul: csak az utolsó karakterét. Ha ez “i”, akkor főnévi igenévvel van dolgunk és végrehajtja a program a pirossal szedett rész utáni utasításokat, vagyis az utolsó betűt, az “i”-t lekapja az ige végéről, így megkapjuk az igetövet (definiáló egyenlőséggel újra meghatározzuk a VERB$ változót, az eredeti VERB$ változó első karakterétől az utolsó előtti karakteréig), a MODO$ változó tartalmát pedig “infinitivo”-ként definiáljuk. Hasonlóan nem lesz túl bonyolult a helyzet a többi igeraggal sem:

470 IF VERB$(L:L)=”u” THEN LET VERB$=VERB$(1:L-1):LET MODO$=”volitivo”

A következő igeragok esetén csak annyiban más még a helyzet (a MODO$ változó tartalmán kívül), hogy nem az utolsó, hanem az utolsó 2, vagy az utolsó 3 vagy az utolsó 4 betűt kell vizsgálni, így a zárójelekbe más értékek kerülnek, ill. adott esetben az időt (TEMPO$) is meg kell határozni, ill. a szenvedő alakú igenevek esetében a VOCO$ tartalmát, amit a program elején “aktivo”-nak definiáltunk, át kell állítani “pasivo”-ra:

480 IF VERB$(L-1:L)=”as” THEN LET VERB$=VERB$(1:L-2):LET MODO$=”indikativo”:LET TEMPO$=”prezenco”
490 IF VERB$(L-1:L)=”is” THEN LET VERB$=VERB$(1:L-2):LET MODO$=”indikativo”:LET TEMPO$=”preterito”
500 IF VERB$(L-1:L)=”os” THEN LET VERB$=VERB$(1:L-2):LET MODO$=”indikativo”:LET TEMPO$=”futuro”
510 IF VERB$(L-1:L)=”us” THEN LET VERB$=VERB$(1:L-2):LET MODO$=”kondicionalo”

520 IF VERB$(L-3:L)=”anta” THEN LET VERB$=VERB$(1:L-4):LET MODO$=”participo”:LET TEMPO$=”prezenco”
530 IF VERB$(L-3:L)=”inta” THEN LET VERB$=VERB$(1:L-4):LET MODO$=”participo”:LET TEMPO$=”preterito”
540 IF VERB$(L-3:L)=”onta” THEN LET VERB$=VERB$(1:L-4):LET MODO$=”participo”:LET TEMPO$=”futuro”

550 IF VERB$(L-2:L)=”ata” THEN LET VERB$=VERB$(1:L-3):LET MODO$=”participo”:LET TEMPO$=”prezenco”:LET VOCO$=”pasivo”
560 IF VERB$(L-2:L)=”ita” THEN LET VERB$=VERB$(1:L-3):LET MODO$=”participo”:LET TEMPO$=”preterito”:LET VOCO$=”pasivo”
570 IF VERB$(L-2:L)=”ota” THEN LET VERB$=VERB$(1:L-3):LET MODO$=”participo”:LET TEMPO$=”futuro”:LET VOCO$=”pasivo”

Mint láthattuk, először azt vizsgáltattuk meg a programmal, összetett-e az igealak és először az összetett igealakkal küzdöttünk meg, és ha nem talál a program a beírt igealak elején estas, estos, stb. segédigét, akkor simán továbbmegy az egyszerű igealakokra jellemző grammatikai morfémák vizsgálatára. Azért volt szükség először az összetett igealakokkal “mérkőzni meg”, mert ha pl. azt írná be a felhasználó, hogy “estas faronta”, és a program először az onta végződést nézné, csak simán annyit állapítana meg, hogy ez egy beálló melléknévi igenév, és nem vizsgálná, hogy előtte van-e valamilyen szó. Így célszerű azt megnézni először, hogy a beírt alak első tagja az esti ige valamelyik alakja-e. Persze többféleképpen meg lehetne oldani ezt a feladatot, így működhetne úgy is a program, hogy először a beírt alak legvégén lévő végződést nézi meg, és ha az anta, inta, onta, ata, ita, ota valamelyike, akkor megnézi azt is, van-e segédige előtte – szerintem ez a megoldás kicsit bonyolultabb lenne.


Majdnem meg is lennénk az első résszel, ti. hogy beírunk egy tetszőleges, ragozott vagy igenév alakot a gépbe, akár személyes névmással, akár anélkül, a gép pedig kiírja, hogy ez milyen időben, módban, stb.-ben áll. Azonban van egy hiba még. Ha beírunk egy személyes névmást, utána pedig valamilyen igenév alakot, akkor az egy grammatikailag helytelen igealak, a gép pedig erről is minden gond nélkül kiírná az összes felismert igei kategóriát. Ha pl. azt írjuk be, hogy “mi esti”, helytelen, hiszen a főnévi igenév előtt nem állhat személyes névmás, ennek ellenére a gép azt írná ki, hogy “unua persono singularo”, “infinitivo”, a kettő együtt pedig helytelen. Ezt a problémát könnyen orvosolhatjuk: csak azt kell beprogramozni, hogy ha a PERSONO$ változó tartalma nem üres, és a MODO$ változó tartalma “infinitivo” vagy “participo”, akkor tudassa a felhasználóval a gép, hogy az eszperantó ige beírásánál nem volt a helyzet magaslatán:

IF PERSONO$<>” ” AND (MODO$=”infinitivo” OR MODO$=”participo”) THEN PRINT “Ejnye-bejnye, tessék értelmes igealakot beírni!”

A <> azt jelenti, “nem egyenlő”. A zárójelre azért van szükség, hogy először azt nézze meg a program, hogy “participo” vagy “infinitivo”-e a MODO$ változó tartalma, és ezután vizsgálja meg azt, hogy a PERSONO$ tartalma nem üres-e, és ha ezek a feltételek teljesülnek, akkor a felhasználó értelmetlen igealakot írt be. Ízlés szerint el lehet dönteni, hogy ilyenkor mit csináljon a program, kiírja, hogy ostobaságot írtunk be és ne is menjen már tovább a ragozásra, vagy tudassa, hogy bénák voltunk, értelmetlen eszperantó igét írtunk be, de azért a ragozását kiírhatja. Én az előbbire szavazok, hiszen ha valaki személyes névmást ír egy főnévi igenév elé, az valószínűleg nem is fog érteni semmit a ragozási táblázatokból sem. (Ez kb. olyan, mint ha valaki egy magyar igeragozó programba azt írná be, hogy “én menni”.)

Még egy apró probléma lehetséges. Ha a felhasználó azt írja be eszperantó igének, hogy pl.  “mi vi li ili scias”, tehát több személyes névmást is megad egymás után, akkor csak az egyiket fogja figyelembe venni a program (a 30-90. sorokban állapítja meg a program a személyes névmás alapján a személy kategóriáját, lásd fent). Azonban eléggé valószínűtlen, hogy valaki ilyet írna be (kivéve, akik olvassák ezt, mert ők csak azért is kipróbálják most már). Még ha egymástól vesszővel elválasztva ír be valaki több személyes névmást is az ige elé, értelmes lehet az igealak, de ez felesleges – hiszen ha valaki meg akarja nézni egy igének a ragozását, nem fog ilyet beírni. Ezért ezzel az esettel talán nem érdemes külön foglalkozni.

Az első rész legvégén természetesen még kiíratjuk a géppel a felismert igei kategóriákat:

PRINT

folyt. köv. !

2 komment:

  1. január 29, 2016

    wacha balázs Válasz

    Gratulálok! Kérdésem: ki a program megalkotója, elérhető-e.

    • január 30, 2016

      Bodnár Tamás Válasz

      Üdvözlöm! Én írtam a programot, én szerkesztem a webnyelv oldalt is. De mint a fentiekből is látható, nincs teljesen kész a program, de könnyen megírható. Örülök, ha tetszik, ami készen van belőle!

Kérdésed, észrevételed van?
Írj kommentet!

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöljük.


+ 2 = 7

A következő HTML tag-ek és tulajdonságok használata engedélyezett: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>