72 lines
1.7 KiB
JavaScript
72 lines
1.7 KiB
JavaScript
'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);
|
|
}
|
|
}
|