'use strict'; class Sana { constructor(perusmuoto, vartalo, sidevokaalivartalo) { this.perusmuoto = perusmuoto; this.vartalo = vartalo !== null ? vartalo : this.perusmuoto; this.sidevokaalivartalo = sidevokaalivartalo !== null ? sidevokaalivartalo : this.vartalo; } } function onko_prefiksi(merkkijono, prefiksi) { return merkkijono.slice(0, prefiksi.length) === prefiksi; } function prefiksittä(merkkijono, prefiksi) { console.assert(onko_prefiksi(merkkijono, prefiksi) === true); return merkkijono.slice(prefiksi.length); } function vartalo(merkkijono) { let sanat = [ new Sana('könyv', null, 'könyve'), new Sana('eper', null, 'epre'), new Sana('alma', 'almá', null), ]; // Lista mahdollisista parsimistavoista // Jokainen parsimistapa on lista morfeemeja // Jokainen morfeemi on kahden pitkä lista let parsitut = []; for (let sana of sanat) { if (onko_prefiksi(merkkijono, sana.perusmuoto)) { let tulos = [[sana.perusmuoto, sana]]; let loput = prefiksittä(merkkijono, sana.perusmuoto); if (loput !== '') { for (let jatko of vartalo(loput)) { parsitut.push(tulos.concat(jatko)); } } else { parsitut.push(tulos); } } // TODO: Substantiivin päätteet // TODO: Verbitaivutus } if (parsitut.length === 0) { // Lisää null merkkaamaan, että sanaa ei tunnistettu // TODO: Etsi osa, jonka tunnistaa parsitut.push([[merkkijono, null]]); } return parsitut; } function tulosta_konsoliin(parsitut) { for (let parsimistapa of parsitut) { let teksti = ''; for (let morfeemi of parsimistapa) { let [morfeemiteksti, morfeemiobjekti] = morfeemi; if (teksti.length !== 0) { teksti = teksti.concat('|'); } teksti = teksti.concat(morfeemiteksti); } console.log(teksti); } }