mondatlanito/mondatlanító.js

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);
}
}