Blame sukija/suomi.mor

Packit 1f3717
# Suomi-malaga, suomen kielen muoto-opin kuvaus.
Packit 1f3717
#
Packit 1f3717
# Tekijänoikeus © 2006-2011 Hannu Väisänen (Etunimi.Sukunimi@uef.fi)
Packit 1f3717
#
Packit 1f3717
# Tämä ohjelma on vapaa; tätä ohjelmaa on sallittu levittää
Packit 1f3717
# edelleen ja muuttaa GNU yleisen lisenssin (GPL lisenssin)
Packit 1f3717
# ehtojen mukaan sellaisina kuin Free Software Foundation
Packit 1f3717
# on ne julkaissut; joko Lisenssin version 2, tai (valinnan
Packit 1f3717
# mukaan) minkä tahansa myöhemmän version mukaisesti.
Packit 1f3717
#
Packit 1f3717
# Tätä ohjelmaa levitetään siinä toivossa, että se olisi
Packit 1f3717
# hyödyllinen, mutta ilman mitään takuuta; ilman edes
Packit 1f3717
# hiljaista takuuta kaupallisesti hyväksyttävästä laadusta tai
Packit 1f3717
# soveltuvuudesta tiettyyn tarkoitukseen. Katso GPL
Packit 1f3717
# lisenssistä lisää yksityiskohtia.
Packit 1f3717
#
Packit 1f3717
# Tämän ohjelman mukana pitäisi tulla kopio GPL
Packit 1f3717
# lisenssistä; jos näin ei ole, kirjoita osoitteeseen Free
Packit 1f3717
# Software Foundation Inc., 51 Franklin Street, Fifth Floor,
Packit 1f3717
# Boston, MA 02110-1301, USA.
Packit 1f3717
#
Packit 1f3717
# Tämän ohjeman linkittäminen staattisesti tai dynaamisesti
Packit 1f3717
# muihin moduuleihin on ohjelmaan perustuvan teoksen
Packit 1f3717
# tekemistä, joka on siis GPL lisenssin ehtojen alainen.
Packit 1f3717
#
Packit 1f3717
#
Packit 1f3717
# This program is free software; you can redistribute it and/or modify
Packit 1f3717
# it under the terms of the GNU General Public License as published by
Packit 1f3717
# the Free Software Foundation; either version 2, or (at your option)
Packit 1f3717
# any later version.
Packit 1f3717
#
Packit 1f3717
# This program is distributed in the hope that it will be useful, but
Packit 1f3717
# WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 1f3717
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 1f3717
# General Public License for more details.
Packit 1f3717
#
Packit 1f3717
# You should have received a copy of the GNU General Public License
Packit 1f3717
# along with this program; see the file COPYING.  If not, write to the
Packit 1f3717
# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
Packit 1f3717
# 02110-1301, USA.
Packit 1f3717
#
Packit 1f3717
# Linking this program statically or dynamically with other modules is
Packit 1f3717
# making a combined work based on this program.  Thus, the terms and
Packit 1f3717
# conditions of the GNU General Public License cover the whole
Packit 1f3717
# combination.
Packit 1f3717
Packit 1f3717
initial <>, rules # laatusana,
Packit 1f3717
                  nimi_laatusana,
Packit 1f3717
                  lukusana,
Packit 1f3717
                  sanan_alku;
Packit 1f3717
Packit 1f3717
include "suomi.inc";
Packit 1f3717
###include "sanat/luvut.mor";
Packit 1f3717
Packit 1f3717
define @teonsana := <teonsana, kieltosana>;
Packit 1f3717
Packit 1f3717
define @ehtotapa := <ehtotapa, ehtotapa_ttA, ehtotapa_tA>;
Packit 1f3717
Packit 1f3717
define @mahtotapa := 
Packit 1f3717
                      mahtotapa_le_kielto, mahtotapa_ne_kielto,
Packit 1f3717
                      mahtotapa_re_kielto, mahtotapa_se_kielto,
Packit 1f3717
                      mahtotapa_ttA, mahtotapa_tA>;
Packit 1f3717
Packit 1f3717
define @käskytapa := 
Packit 1f3717
                      käskytapa_tA>;
Packit 1f3717
Packit 1f3717
define @nimitapa_1 := 
Packit 1f3717
                       nimitapa_1_nA, nimitapa_1_rA, nimitapa_1_tA>;
Packit 1f3717
define @nimitapa_2 := <nimitapa_2, nimitapa_2_ttA, nimitapa_2_tA>;
Packit 1f3717
define @nimitapa_3 := <nimitapa_3, nimitapa_3_saama, nimitapa_3_ttA, nimitapa_3_tA>;
Packit 1f3717
Packit 1f3717
define @voittoaste := <voittoaste>;
Packit 1f3717
define @yliaste    := <yliaste>;
Packit 1f3717
Packit 1f3717
Packit 1f3717
define @tekijämuodot := @kestämän_tekijäpääte + @tositavan_tekijäpääte_4 + @kertoman_tekijäpääte
Packit 1f3717
                        + @ehtotapa + @mahtotapa + @käskytapa;
Packit 1f3717
Packit 1f3717
# Neljäs nimitapa katsotaan teonsanasta johdetuksi nimisanaksi.
Packit 1f3717
define @nimitavat := @nimitapa_1 + @nimitapa_2 + @nimitapa_3 + <nimitapa_5>;
Packit 1f3717
#define @nimitavat := @nimitapa_1 + @nimitapa_2 + @nimitapa_3 + <nimitapa_4, nimitapa_5>;
Packit 1f3717
Packit 1f3717
define @laatutavat := @laatutapa_1 + @laatutapa_2;
Packit 1f3717
Packit 1f3717
Packit 1f3717
Packit 1f3717
# Sääntö sanan_alku on muokattu Harri Pitkäsen Voikko-versiosta.
Packit 1f3717
#
Packit 1f3717
combi_rule sanan_alku ($vasen, $oikea, $sana):
Packit 1f3717
####define $profile := transmit ("sanan_alku ($vasen, $oikea, $sana):");
Packit 1f3717
#  define $a := transmit ($vasen);
Packit 1f3717
#  define $b := transmit ($oikea);
Packit 1f3717
#  define $c := transmit ($sana);
Packit 1f3717
Packit 1f3717
#if ($oikea.luokka in 
Packit 1f3717
#                      asemosana, seikkasana, suhdesana, nimisana> + @erisnimi) then
Packit 1f3717
#  define $b := transmit ("§§§ " + value_string($oikea.luokka));
Packit 1f3717
#end;
Packit 1f3717
Packit 1f3717
  define $res := <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if $oikea.luokka = nimisana then
Packit 1f3717
    if (tavuviiva in $oikea.jatko) then
Packit 1f3717
      result $res, rules tavuviiva;
Packit 1f3717
    end;
Packit 1f3717
    if (yhdyssana in $oikea.jatko) and
Packit 1f3717
        (($oikea.tiedot = nil) or not ((ei_ys in $oikea.tiedot) or (ei_ysa in $oikea.tiedot))) then
Packit 1f3717
      result $res, rules yhdyssana;
Packit 1f3717
    end;
Packit 1f3717
    if (@nimisanasta_johdettu_laatusana * $oikea.jatko /= <>) then
Packit 1f3717
      result $res, rules nimisanasta_johdettu_laatusana;
Packit 1f3717
    end;
Packit 1f3717
    if (@nimisanasta_johdettu_seikkasana * $oikea.jatko /= <>) then
Packit 1f3717
      result $res, rules nimisanasta_johdettu_seikkasana;
Packit 1f3717
    end;
Packit 1f3717
    if (@nimi_laatusanan_johdin * $oikea.jatko /= <>) then
Packit 1f3717
      result $res, rules nimi_laatusanan_johdin;
Packit 1f3717
    end;
Packit 1f3717
    if (omistusliite in $oikea.jatko) then
Packit 1f3717
      result $res, rules omistusliite;
Packit 1f3717
    end;
Packit 1f3717
    if (liitesana in $oikea.jatko) then
Packit 1f3717
      result $res, rules liitesana;
Packit 1f3717
    end;
Packit 1f3717
    if (loppu in $oikea.jatko) then
Packit 1f3717
      result $res, accept;
Packit 1f3717
    end;
Packit 1f3717
    result $res, rules sijapääte;
Packit 1f3717
Packit 1f3717
  elseif ($oikea.luokka = laatusana) then
Packit 1f3717
    if (omistusliite in $oikea.jatko) then
Packit 1f3717
      result $res, rules omistusliite;
Packit 1f3717
    end;
Packit 1f3717
    if (liitesana in $oikea.jatko) then
Packit 1f3717
      result $res, rules liitesana;
Packit 1f3717
    end;
Packit 1f3717
    # Arka+mainen, halpa+mainen, oiva+llinen, täyde+llinen (= täysi + johdin_llinen), yms.
Packit 1f3717
    if (@nimi_laatusanan_johdin * $oikea.jatko /= <>) then
Packit 1f3717
      result $res, rules nimi_laatusanan_johdin;
Packit 1f3717
    end;
Packit 1f3717
    if (@voittoaste + @yliaste * $oikea.jatko /= <>) then
Packit 1f3717
      result $res, rules voitto_yliaste;
Packit 1f3717
    end;
Packit 1f3717
    if (@laatusanasta_johdettu_nimisana * $oikea.jatko /= <>) then
Packit 1f3717
      result $res, rules laatusanasta_johdettu_nimisana;
Packit 1f3717
    end;
Packit 1f3717
    if (@laatusanasta_johdettu_laatusana * $oikea.jatko /= <>) then
Packit 1f3717
      result $res, rules laatusanasta_johdettu_laatusana;
Packit 1f3717
    end;
Packit 1f3717
    if (loppu in $oikea.jatko) then
Packit 1f3717
      result $res, accept;
Packit 1f3717
    end;
Packit 1f3717
    if (tavuviiva in $oikea.jatko) then
Packit 1f3717
      result $res, rules tavuviiva;
Packit 1f3717
    end;
Packit 1f3717
#    if (yhdyssana in $oikea.jatko) then
Packit 1f3717
    if (yhdyssana in $oikea.jatko) and
Packit 1f3717
        (($oikea.tiedot = nil) or not ((ei_ys in $oikea.tiedot) or (ei_ysa in $oikea.tiedot))) then
Packit 1f3717
      result $res, rules yhdyssana;
Packit 1f3717
#      result $res, rules inen_päätteinen_laatusana;
Packit 1f3717
    end;
Packit 1f3717
    result $res, rules sijapääte;
Packit 1f3717
Packit 1f3717
  elseif ($oikea.luokka = teonsana) then
Packit 1f3717
#define $a := transmit ($oikea);
Packit 1f3717
    if (liitesana in $oikea.jatko) then
Packit 1f3717
      if (($oikea.tapaluokka = käskytapa) and
Packit 1f3717
          ($oikea.tekijä = 2) and
Packit 1f3717
          ($oikea.luku = yksikkö)) then
Packit 1f3717
        result $res, rules liitesana_ei_kO;
Packit 1f3717
      else
Packit 1f3717
        result $res, rules liitesana;
Packit 1f3717
      end;
Packit 1f3717
    end;
Packit 1f3717
    if (loppu in  $oikea.jatko) then
Packit 1f3717
      result $res, accept;
Packit 1f3717
    end;
Packit 1f3717
    if (tavuviiva in  $oikea.jatko) then
Packit 1f3717
      result $res, rules tavuviiva;
Packit 1f3717
    end;
Packit 1f3717
    if (@teonsanasta_johdettu_teonsana * $oikea.jatko /= <>) then
Packit 1f3717
      result $res, rules teonsanan_johdos_teonsana;
Packit 1f3717
    end;
Packit 1f3717
#    if (@tekijämuodot * $oikea.jatko /= <>) then
Packit 1f3717
#      result $res, rules tekijämuodot;
Packit 1f3717
#    end;
Packit 1f3717
#    if (@nimitavat * $oikea.jatko /= <>) then
Packit 1f3717
#      result $res, rules nimitavat;
Packit 1f3717
#    end;
Packit 1f3717
#    if (@laatutavat * $oikea.jatko /= <>) then
Packit 1f3717
#      result $res, rules laatutavat;
Packit 1f3717
#    end;
Packit 1f3717
#    result $res, rules teonsanan_johdos_nimisana, teonsanan_johdos_laatusana;
Packit 1f3717
# Tämä on nopeampi kuin kaikki erikseen!
Packit 1f3717
    result $res, rules tekijämuodot, nimitavat, laatutavat,
Packit 1f3717
                       teonsanan_johdos_nimisana, teonsanan_johdos_laatusana;
Packit 1f3717
  elseif $oikea.luokka = lyhenne then
Packit 1f3717
    if (kaksoispiste in $oikea.jatko) then
Packit 1f3717
      result $res, rules kaksoispiste;
Packit 1f3717
    end;
Packit 1f3717
    if (tavuviiva in $oikea.jatko) then
Packit 1f3717
      result $res, rules tavuviiva;
Packit 1f3717
    end;
Packit 1f3717
    if (loppu in $oikea.jatko) then
Packit 1f3717
      result $res, accept;
Packit 1f3717
    end;
Packit 1f3717
#    result $res, rules kaksoispiste, tavuviiva, loppu;
Packit 1f3717
  elseif $oikea.luokka in @erisnimi then
Packit 1f3717
    if (omistusliite in $oikea.jatko) then
Packit 1f3717
      result $res, rules omistusliite;
Packit 1f3717
    end;
Packit 1f3717
    if (liitesana in $oikea.jatko) then
Packit 1f3717
      result $res, rules liitesana;
Packit 1f3717
    end;
Packit 1f3717
    if (tavuviiva in $oikea.jatko) then
Packit 1f3717
      result $res, rules tavuviiva;
Packit 1f3717
    end;
Packit 1f3717
    if (loppu in $oikea.jatko) then
Packit 1f3717
      result $res, accept;
Packit 1f3717
    end;
Packit 1f3717
    if ((johdin_lAinen in $oikea.jatko or johdin_mAinen in $oikea.jatko)
Packit 1f3717
        and ($oikea.luokka in <paikannimi, sukunimi>)) then
Packit 1f3717
      result $res, rules paikannimen_ja_sukunimen_lainen_johdin;
Packit 1f3717
    end;
Packit 1f3717
    result $res, rules erisnimen_sijapääte;
Packit 1f3717
  elseif $oikea.luokka in <huudahdussana, sidesana> then
Packit 1f3717
    if (tavuviiva in $oikea.jatko) then
Packit 1f3717
      result $res, rules tavuviiva;
Packit 1f3717
    end;
Packit 1f3717
    if (loppu in $oikea.jatko) then
Packit 1f3717
      result $res, accept;
Packit 1f3717
    end;
Packit 1f3717
    result $res, rules liitesana;
Packit 1f3717
  elseif $oikea.luokka = etuliite then
Packit 1f3717
    if (kieltosana in $oikea.jatko) then
Packit 1f3717
      result $res, rules kieltosana;
Packit 1f3717
    end;
Packit 1f3717
    if (nimisana in $oikea.jatko) then
Packit 1f3717
      result $res, rules nimisana, teonsanasta_johdettu_nimisana,
Packit 1f3717
                         paikannimen_ja_sukunimen_lainen_johdos;
Packit 1f3717
      if (not (teonsana in $oikea.jatko)) then
Packit 1f3717
        result $res, rules teonsana_teonsanasta_johdettu_nimisana;
Packit 1f3717
      end;
Packit 1f3717
    end;
Packit 1f3717
    if (laatusana in $oikea.jatko) then
Packit 1f3717
      result $res, rules laatusana, teonsanasta_johdettu_laatusana;
Packit 1f3717
      if (not (teonsana in $oikea.jatko)) then
Packit 1f3717
        result $res, rules teonsana_teonsanasta_johdettu_laatusana;
Packit 1f3717
      end;
Packit 1f3717
    end;
Packit 1f3717
    if (nimi_laatusana in $oikea.jatko) then
Packit 1f3717
      result $res, rules nimi_laatusana;
Packit 1f3717
      if (not (nimisana in $oikea.jatko)) then
Packit 1f3717
        result $res, rules nimisana, teonsanasta_johdettu_nimisana;
Packit 1f3717
      end;
Packit 1f3717
      if (not (laatusana in $oikea.jatko)) then
Packit 1f3717
        result $res, rules laatusana, teonsanasta_johdettu_laatusana;
Packit 1f3717
      end;
Packit 1f3717
    end;
Packit 1f3717
    if (teonsana in $oikea.jatko) then
Packit 1f3717
      result $res, rules teonsana;
Packit 1f3717
    end;
Packit 1f3717
    # Tavuviiva ja etuliite ovat aina jatkossa eli niitä ei tarvitse testata.
Packit 1f3717
    result $res, rules tavuviiva, etuliite;
Packit 1f3717
  elseif $oikea.luokka = kieltosana then
Packit 1f3717
    if (loppu in $oikea.jatko) then
Packit 1f3717
      result $res, accept;
Packit 1f3717
    end;
Packit 1f3717
    result $res, rules liitesana, liitesana_kä, tavuviiva;
Packit 1f3717
  elseif $oikea.luokka = asemosana then
Packit 1f3717
    if (loppu in $oikea.jatko) then
Packit 1f3717
      result $res, accept;
Packit 1f3717
    end;
Packit 1f3717
    result $res, rules asemosanan_sijapääte, liitesana, tavuviiva, voitto_yliaste;
Packit 1f3717
  elseif $oikea.luokka in <seikkasana, suhdesana> then
Packit 1f3717
    if (loppu in $oikea.jatko) then
Packit 1f3717
      result $res, accept;
Packit 1f3717
    end;
Packit 1f3717
    if (liitesana in $oikea.jatko) then
Packit 1f3717
      result $res, rules liitesana;
Packit 1f3717
    end;
Packit 1f3717
    if (omistusliite in $oikea.jatko) then
Packit 1f3717
      result $res, rules omistusliite;
Packit 1f3717
    end;
Packit 1f3717
    if (tavuviiva in $oikea.jatko) then
Packit 1f3717
      result $res, rules tavuviiva;
Packit 1f3717
    end;
Packit 1f3717
    result $res, rules sijapääte;
Packit 1f3717
  elseif $oikea.luokka in @erisnimi then
Packit 1f3717
    if (omistusliite in $oikea.jatko) then
Packit 1f3717
      result $res, rules omistusliite;
Packit 1f3717
    end;
Packit 1f3717
    if (liitesana in $oikea.jatko) then
Packit 1f3717
      result $res, rules liitesana;
Packit 1f3717
    end;
Packit 1f3717
    if (tavuviiva in $oikea.jatko) then
Packit 1f3717
      result $res, rules tavuviiva;
Packit 1f3717
    end;
Packit 1f3717
    if (loppu in $oikea.jatko) then
Packit 1f3717
      result $res, accept;
Packit 1f3717
    end;
Packit 1f3717
    if ((johdin_lAinen in $oikea.jatko) and ($oikea.luokka in <paikannimi, sukunimi>)) then
Packit 1f3717
      result $res, rules paikannimen_ja_sukunimen_lainen_johdin;
Packit 1f3717
    end;
Packit 1f3717
    result $res, rules erisnimen_sijapääte;
Packit 1f3717
  end;
Packit 1f3717
#define $b := transmit (<"c"> + <$oikea>);
Packit 1f3717
#define $c := transmit (<"d"> + <$sana>);
Packit 1f3717
  stop;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule etuliite ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("etuliite ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka = etuliite;
Packit 1f3717
Packit 1f3717
#define $a := transmit ($vasen);
Packit 1f3717
#define $b := transmit (<$oikea> + <$sana> + <"">);
Packit 1f3717
Packit 1f3717
  define $i := $n - 1;
Packit 1f3717
Packit 1f3717
#assert ($i = length($vasen));
Packit 1f3717
Packit 1f3717
  ? ($oikea.luokka in $vasen.$i.jatko);
Packit 1f3717
Packit 1f3717
  ? (($vasen.$i.tiedot = nil) or not ((ei_ys in $vasen.$i.tiedot) or (ei_ysa in $vasen.$i.tiedot)));
Packit 1f3717
  ? (($oikea.tiedot    = nil) or not ((ei_ys in $oikea.tiedot)    or (ei_ysj in $oikea.tiedot)));
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
# Ehkei-tyyppiset sanat eivät voi olla yhdyssanojen osana.
Packit 1f3717
#  if (kieltosana in $oikea.jatko) then
Packit 1f3717
#    result $r, rules kieltosana;
Packit 1f3717
#  end;
Packit 1f3717
  if (nimisana in $oikea.jatko) then
Packit 1f3717
    result $res, rules nimisana, teonsanasta_johdettu_nimisana,
Packit 1f3717
                       paikannimen_ja_sukunimen_lainen_johdos;
Packit 1f3717
    if (not (teonsana in $oikea.jatko)) then
Packit 1f3717
      result $res, rules teonsana_teonsanasta_johdettu_nimisana;
Packit 1f3717
    end;
Packit 1f3717
  end;
Packit 1f3717
  if (laatusana in $oikea.jatko) then
Packit 1f3717
    result $res, rules laatusana, teonsanasta_johdettu_laatusana;
Packit 1f3717
    if (not (teonsana in $oikea.jatko)) then
Packit 1f3717
      result $res, rules teonsana_teonsanasta_johdettu_laatusana;
Packit 1f3717
    end;
Packit 1f3717
  end;
Packit 1f3717
  if (nimi_laatusana in $oikea.jatko) then
Packit 1f3717
    result $res, rules nimi_laatusana;
Packit 1f3717
    if (not (nimisana in $oikea.jatko)) then
Packit 1f3717
      result $res, rules nimisana, teonsanasta_johdettu_nimisana;
Packit 1f3717
    end;
Packit 1f3717
    if (not (laatusana in $oikea.jatko)) then
Packit 1f3717
      result $res, rules laatusana, teonsanasta_johdettu_laatusana;
Packit 1f3717
    end;
Packit 1f3717
  end;
Packit 1f3717
  if (teonsana in $oikea.jatko) then
Packit 1f3717
    result $res, rules teonsana;
Packit 1f3717
  end;
Packit 1f3717
Packit 1f3717
  # Tavuviiva ja etuliite ovat aina jatkossa eli niitä ei tarvitse testata.
Packit 1f3717
  #
Packit 1f3717
  result $res, rules tavuviiva, etuliite;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule nimisana ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("nimisana ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  define $i := $n - 1;
Packit 1f3717
Packit 1f3717
#assert ($i = length($vasen));
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  # Esim. (koillis)puolitse, (maan)teitse, (sähkö)postitse.
Packit 1f3717
  #
Packit 1f3717
  if ($oikea.luokka = seikkasana and $oikea.tiedot /= nil and
Packit 1f3717
      ys_perusosa in $oikea.tiedot and $vasen /= <>) then
Packit 1f3717
    if (loppu in $oikea.jatko) then
Packit 1f3717
      result $res, accept;
Packit 1f3717
    end;
Packit 1f3717
    if (liitesana in $oikea.jatko) then
Packit 1f3717
       result $res, rules liitesana;
Packit 1f3717
    end;
Packit 1f3717
    if (omistusliite in $oikea.jatko) then
Packit 1f3717
      result $res, rules omistusliite;
Packit 1f3717
    end;
Packit 1f3717
    result $res, rules ei_ys_sijapääte;
Packit 1f3717
  end;
Packit 1f3717
Packit 1f3717
  ? $oikea.luokka = nimisana;
Packit 1f3717
Packit 1f3717
#define $n1 := transmit (<"nimisana1"> + <$vasen.$i.jatko>);
Packit 1f3717
#define $n2 := transmit (<"nimisana2"> + <$oikea.luokka>);
Packit 1f3717
#define $n3 := transmit (<"nimisana3"> + <$sana>);
Packit 1f3717
#define $n4 := transmit (<"nimisana4"> + <($oikea.luokka in $vasen.$i.jatko)>);
Packit 1f3717
#define $n5 := transmit (<"nimisana5"> + <$oikea.tiedot>);
Packit 1f3717
Packit 1f3717
  ? $oikea.luokka in $vasen.$i.jatko;
Packit 1f3717
  ? yhdyssana_oikein ($vasen, $oikea, $i);
Packit 1f3717
###  ? ($oikea.tiedot = nil) or not (ei_ys in $oikea.tiedot); # Ei toimi!
Packit 1f3717
Packit 1f3717
  if (tavuviiva in $oikea.jatko) then
Packit 1f3717
    result $res, rules tavuviiva;
Packit 1f3717
  end;
Packit 1f3717
  if (yhdyssana in $oikea.jatko) then
Packit 1f3717
    result $res, rules yhdyssana;
Packit 1f3717
  end;
Packit 1f3717
  if (@nimisanasta_johdettu_laatusana * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules nimisanasta_johdettu_laatusana;
Packit 1f3717
  end;
Packit 1f3717
  if (@nimisanasta_johdettu_seikkasana * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules nimisanasta_johdettu_seikkasana;
Packit 1f3717
  end;
Packit 1f3717
  if (@nimi_laatusanan_johdin * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules nimi_laatusanan_johdin;
Packit 1f3717
  end;
Packit 1f3717
  if ($vasen.$i.luokka = tavuviiva) or ($oikea.tiedot = nil or not (ei_ysj in $oikea.tiedot)) then
Packit 1f3717
    if (omistusliite in $oikea.jatko) then
Packit 1f3717
      result $res, rules omistusliite;
Packit 1f3717
    end;
Packit 1f3717
    if (liitesana in $oikea.jatko) then
Packit 1f3717
      result $res, rules liitesana;
Packit 1f3717
    end;
Packit 1f3717
    if (loppu in $oikea.jatko) then
Packit 1f3717
      result $res, accept;
Packit 1f3717
    end;
Packit 1f3717
    result $res, rules sijapääte;
Packit 1f3717
  end;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule laatusana ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("laatusana ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka = laatusana;
Packit 1f3717
Packit 1f3717
  define $i := $n - 1;
Packit 1f3717
Packit 1f3717
#define $nimi := transmit (<"laatusana"> + <$vasen.$i.alku> + <$oikea> + <$sana>);
Packit 1f3717
#define $n := transmit (<"luokka"> + <$vasen.$i.luokka>);
Packit 1f3717
Packit 1f3717
  ? ($oikea.luokka in $vasen.$i.jatko);
Packit 1f3717
  ? yhdyssana_oikein ($vasen, $oikea, $i);
Packit 1f3717
Packit 1f3717
#define $n := transmit (<$vasen> + <$oikea> + <$sana>);
Packit 1f3717
#define $n1 := transmit ($vasen);
Packit 1f3717
#define $n2 := transmit ($oikea);
Packit 1f3717
#define $n3 := transmit ($sana);
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if (omistusliite in $oikea.jatko) then
Packit 1f3717
    result $res, rules omistusliite;
Packit 1f3717
  end;
Packit 1f3717
  if (liitesana in $oikea.jatko) then
Packit 1f3717
    result $res, rules liitesana;
Packit 1f3717
  end;
Packit 1f3717
  # Arka+mainen, halpa+mainen, oiva+llinen, täyde+llinen (= täysi + johdin_llinen), yms.
Packit 1f3717
  if (@nimi_laatusanan_johdin * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules nimi_laatusanan_johdin;
Packit 1f3717
  end;
Packit 1f3717
  if (@voittoaste + @yliaste * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules voitto_yliaste;
Packit 1f3717
  end;
Packit 1f3717
  if (@laatusanasta_johdettu_nimisana * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules laatusanasta_johdettu_nimisana;
Packit 1f3717
  end;
Packit 1f3717
  if (@laatusanasta_johdettu_laatusana * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules laatusanasta_johdettu_laatusana;
Packit 1f3717
  end;
Packit 1f3717
  if (loppu in $oikea.jatko) then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  if (tavuviiva in $oikea.jatko) then
Packit 1f3717
    result $res, rules tavuviiva;
Packit 1f3717
  end;
Packit 1f3717
  if (yhdyssana in $oikea.jatko) then
Packit 1f3717
#    ? ($oikea.tiedot = nil) or not ((ei_ys in $oikea.tiedot) or (ei_ysj in $oikea.tiedot));
Packit 1f3717
    result $res, rules yhdyssana;
Packit 1f3717
#    result $res, rules inen_päätteinen_laatusana;
Packit 1f3717
  end;
Packit 1f3717
  result $res, rules sijapääte;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule inen_päätteinen_laatusana ($vasen, $oikea, $sana, $n):
Packit 1f3717
  ? $oikea.perusmuoto /= nil;
Packit 1f3717
  ? $oikea.luokka in <laatusana, nimi_laatusana>;
Packit 1f3717
  ? $oikea.perusmuoto matches ".*inen";
Packit 1f3717
Packit 1f3717
define $i := $n - 1;
Packit 1f3717
define $profile := transmit ("inen_päätteinen_laatusana ($vasen, $oikea, $sana, $n):");
Packit 1f3717
define $a1 := transmit ($vasen.$i);
Packit 1f3717
define $a2 := transmit ($oikea - jatko);
Packit 1f3717
define $a3 := transmit ($sana);
Packit 1f3717
define $a4 := transmit ($n);
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if omistusliite in $oikea.jatko then
Packit 1f3717
    result $res, rules omistusliite;
Packit 1f3717
  end;
Packit 1f3717
  if tavuviiva in $oikea.jatko then
Packit 1f3717
    result $res, rules tavuviiva;
Packit 1f3717
  end;
Packit 1f3717
  if loppu in $oikea.jatko then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  if liitesana in $oikea.jatko then
Packit 1f3717
    result $res, rules liitesana;
Packit 1f3717
  end;
Packit 1f3717
  if yhdyssana in $oikea.jatko then
Packit 1f3717
    result $res, rules yhdyssana;
Packit 1f3717
  end;
Packit 1f3717
  result $res, rules sijapääte;
Packit 1f3717
##  result $res, rules laatusanan_sijapäte; laatusanan_johdos;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule nimi_laatusana ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("nimi_laatusana ($vasen, $oikea, $sana, $n):");
Packit 1f3717
Packit 1f3717
  ? $oikea.luokka = nimi_laatusana;
Packit 1f3717
  define $i := $n - 1;
Packit 1f3717
Packit 1f3717
##assert ($i = length($vasen));
Packit 1f3717
Packit 1f3717
#define $n4 := transmit ($oikea.luokka);
Packit 1f3717
Packit 1f3717
  if ($i greater 0) then
Packit 1f3717
    ? $oikea.luokka in $vasen.$i.jatko;
Packit 1f3717
    ? yhdyssana_oikein ($vasen, $oikea, $i);
Packit 1f3717
  end;
Packit 1f3717
Packit 1f3717
#define $n1 := transmit ($vasen);
Packit 1f3717
#define $n2 := transmit ($oikea);
Packit 1f3717
#define $n3 := transmit ($sana);
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if (omistusliite in $oikea.jatko) then
Packit 1f3717
    result $res, rules omistusliite;
Packit 1f3717
  end;
Packit 1f3717
  if (liitesana in $oikea.jatko) then
Packit 1f3717
    result $res, rules liitesana;
Packit 1f3717
  end;
Packit 1f3717
  if ((voittoaste in $oikea.jatko) or (yliaste in $oikea.jatko)) then
Packit 1f3717
    result $res, rules voitto_yliaste;
Packit 1f3717
  end;
Packit 1f3717
  if (loppu in $oikea.jatko) then
Packit 1f3717
     result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  if (@nimi_laatusanan_johdin * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules nimi_laatusanan_johdin;
Packit 1f3717
  end;
Packit 1f3717
  if (@laatusanasta_johdettu_nimisana * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules laatusanasta_johdettu_nimisana;
Packit 1f3717
  end;
Packit 1f3717
  if (@laatusanasta_johdettu_laatusana * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules laatusanasta_johdettu_laatusana;
Packit 1f3717
  end;
Packit 1f3717
  if (@nimisanasta_johdettu_laatusana * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules nimisanasta_johdettu_laatusana;
Packit 1f3717
  end;
Packit 1f3717
  if (@nimisanasta_johdettu_seikkasana * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules nimisanasta_johdettu_seikkasana;
Packit 1f3717
  end;
Packit 1f3717
  if (tavuviiva in $oikea.jatko) then
Packit 1f3717
    result $res, rules tavuviiva;
Packit 1f3717
  end;
Packit 1f3717
  if (yhdyssana in $oikea.jatko) then
Packit 1f3717
    result $res, rules yhdyssana;
Packit 1f3717
  end;
Packit 1f3717
  result $res, rules sijapääte;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule asemosana ($vasen, $oikea, $sana):
Packit 1f3717
####define $profile := transmit ("asemosana ($vasen, $oikea, $sana):");
Packit 1f3717
  ? $oikea.luokka = asemosana;
Packit 1f3717
Packit 1f3717
#define $nimi := transmit (<"asemosana"> + <$oikea> + <$sana>);
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if (loppu in $oikea.jatko) then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  result $res, rules asemosanan_sijapääte, liitesana, tavuviiva, voitto_yliaste;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule lyhennesääntö ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("lyhennesääntö ($vasen, $oikea, $sana):");
Packit 1f3717
  ? $oikea.luokka in <lyhenne>;
Packit 1f3717
Packit 1f3717
#define $nimi := transmit (<"lyhennesääntö"> + <$vasen> + <$oikea> + <$sana>);
Packit 1f3717
#define $nimi1 := transmit (<"lyhennesääntö1"> + <$vasen.($n-1)>);
Packit 1f3717
#define $nimi2 := transmit (<"lyhennesääntö2"> + <$oikea>);
Packit 1f3717
#define $nimi3 := transmit (<"lyhennesääntö3"> + <$sana>);
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if (loppu in $oikea.jatko) then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  result $res, rules kaksoispiste, tavuviiva;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule apusana ($vasen, $oikea, $sana):
Packit 1f3717
####define $profile := transmit ("apusana ($vasen, $oikea, $sana):");
Packit 1f3717
  ? $oikea.luokka in <huudahdussana, sidesana>;
Packit 1f3717
Packit 1f3717
#define $nimi := transmit (<"apusana"> + <$oikea> + <$sana>);
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if (loppu in $oikea.jatko) then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  result $res, rules liitesana, tavuviiva;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule kaksoispiste ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("kaksoispiste ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka in <kaksoispiste>;
Packit 1f3717
Packit 1f3717
#define $nimi := transmit (<":"> + <$vasen> + <$oikea> + <$sana> + <length($vasen)>);
Packit 1f3717
Packit 1f3717
  result $vasen + <[alku: $sana] + $oikea + [äs: $vasen.($n-1).äs]>,
Packit 1f3717
         rules kaksoispisteen_sijapääte;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule tavuviiva ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("tavuviiva ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka in <tavuviiva>;
Packit 1f3717
  ? $oikea.luokka in $vasen.($n-1).jatko;
Packit 1f3717
Packit 1f3717
#define $nimi1 := transmit (<"tavuviiva1"> + <$vasen>);
Packit 1f3717
#define $nimi2 := transmit (<"tavuviiva2"> + <$oikea>);
Packit 1f3717
#define $nimi3 := transmit (<"tavuviiva3"> + <$sana>);
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if (loppu in $oikea.jatko) then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  result $res, rules yhdyssana, asemosana, apusana, lyhennesääntö, erisnimi, lukusana;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
# Tämä sääntö on muokattu Harri Pitkäsen Voikko-versiosta.
Packit 1f3717
#
Packit 1f3717
combi_rule kaksoispisteen_sijapääte ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("kaksoispisteen_sijapääte ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka = sijapääte;
Packit 1f3717
  ? $oikea.sija /= keinonto_n;
Packit 1f3717
Packit 1f3717
  define $edellinen := $vasen.($n-1);
Packit 1f3717
  ? ($edellinen.äs = aä) or ($oikea.äs = aä) or ($edellinen.äs = $oikea.äs);
Packit 1f3717
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $edellinen.äs; end;
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if (loppu in $oikea.jatko) then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  result $res, rules omistusliite, liitesana;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
define @sti_edeltäjä := <laatusana, nimi_laatusana, voittoaste, yliaste>
Packit 1f3717
                        + @nimisanasta_johdettu_laatusana
Packit 1f3717
                        + @laatusanasta_johdettu_laatusana
Packit 1f3717
                        + @nimi_laatusanan_johdin
Packit 1f3717
                        + @teonsanasta_johdettu_laatusana
Packit 1f3717
                        + @lukusana + @laatutapa_1 + @laatutapa_2;
Packit 1f3717
Packit 1f3717
# Sijapääte, joka voi olla yhdyssanan alkuosassa.
Packit 1f3717
#
Packit 1f3717
#define @yhdyssanasija := 
Packit 1f3717
#                          omanto_en,
Packit 1f3717
#                          omanto_ien,
Packit 1f3717
#                          omanto_jen,
Packit 1f3717
#                          omanto_in,          # Vanhempainloma.
Packit 1f3717
#                          omanto_ten,         # Naistentanssit.
Packit 1f3717
#                          omanto_iT,          # Hampaidenhoito, hampaittenhoito.
Packit 1f3717
#                          sisätulento_hVn,    # Maahantulo, työhönotto.
Packit 1f3717
#                          sisätulento_ihin>;  # Maihinnousu.
Packit 1f3717
Packit 1f3717
combi_rule sijapääte ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("sijapääte ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka = sijapääte;
Packit 1f3717
Packit 1f3717
#define $nimi := transmit (<$vasen> + <$oikea> + <$sana>);
Packit 1f3717
Packit 1f3717
  define $edellinen := $vasen.($n-1);
Packit 1f3717
Packit 1f3717
  ? $oikea.sija in $edellinen.jatko;
Packit 1f3717
  ? äs_ok ($edellinen,$oikea);
Packit 1f3717
Packit 1f3717
  ? ($oikea.sija /= sisätulento_Vn)  or sisätulento_Vn_oikein  ($oikea.sija, substring($edellinen.alku,1R), $sana);
Packit 1f3717
  ? ($oikea.sija /= sisätulento_hVn) or sisätulento_hVn_oikein ($oikea.sija, substring($edellinen.alku,1R), $sana);
Packit 1f3717
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $edellinen.äs; end;
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
#define $a1 := transmit ($edellinen);
Packit 1f3717
#define $b1 := transmit ($oikea);
Packit 1f3717
#define $c1 := transmit ($sana);
Packit 1f3717
Packit 1f3717
  if (($oikea.sija = kerronto_sti) and ($edellinen.luokka in @sti_edeltäjä)) then
Packit 1f3717
    if (loppu in $oikea.jatko) then
Packit 1f3717
      result $res, accept;
Packit 1f3717
    end;
Packit 1f3717
    result $res, rules liitesana;
Packit 1f3717
  else
Packit 1f3717
    if (omistusliite in $oikea.jatko) then
Packit 1f3717
      result $res, rules omistusliite;
Packit 1f3717
    end;
Packit 1f3717
    if (liitesana in $oikea.jatko) then
Packit 1f3717
      result $res, rules liitesana;
Packit 1f3717
    end;
Packit 1f3717
    if (tavuviiva in $oikea.jatko) then
Packit 1f3717
      result $res, rules tavuviiva;
Packit 1f3717
    end;
Packit 1f3717
    if (yhdyssana in $oikea.jatko) and
Packit 1f3717
       (($edellinen.tiedot = nil) or not ((ei_ys in $edellinen.tiedot) or (ei_ysa in $edellinen.tiedot))) then
Packit 1f3717
      result $res, rules yhdyssana;
Packit 1f3717
    end;
Packit 1f3717
    if (loppu in $oikea.jatko) then
Packit 1f3717
      result $res, accept;
Packit 1f3717
    end;
Packit 1f3717
  end;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule ei_ys_sijapääte ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("sijapääte ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka = sijapääte;
Packit 1f3717
Packit 1f3717
#define $nimi := transmit (<$vasen> + <$oikea> + <$sana>);
Packit 1f3717
Packit 1f3717
  define $edellinen := $vasen.($n-1);
Packit 1f3717
Packit 1f3717
  ? $oikea.sija in $edellinen.jatko;
Packit 1f3717
  ? äs_ok ($edellinen,$oikea);
Packit 1f3717
Packit 1f3717
  ? ($oikea.sija /= sisätulento_Vn)  or sisätulento_Vn_oikein  ($oikea.sija, substring($edellinen.alku,1R), $sana);
Packit 1f3717
  ? ($oikea.sija /= sisätulento_hVn) or sisätulento_hVn_oikein ($oikea.sija, substring($edellinen.alku,1R), $sana);
Packit 1f3717
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $edellinen.äs; end;
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
#define $a1 := transmit ($edellinen);
Packit 1f3717
#define $b1 := transmit ($oikea);
Packit 1f3717
#define $c1 := transmit ($sana);
Packit 1f3717
Packit 1f3717
  if (($oikea.sija = kerronto_sti) and ($edellinen.luokka in @sti_edeltäjä)) then
Packit 1f3717
    if (loppu in $oikea.jatko) then
Packit 1f3717
      result $res, accept;
Packit 1f3717
    end;
Packit 1f3717
    result $res, rules liitesana;
Packit 1f3717
  else
Packit 1f3717
    if (omistusliite in $oikea.jatko) then
Packit 1f3717
      result $res, rules omistusliite;
Packit 1f3717
    end;
Packit 1f3717
    if (liitesana in $oikea.jatko) then
Packit 1f3717
      result $res, rules liitesana;
Packit 1f3717
    end;
Packit 1f3717
    if (tavuviiva in $oikea.jatko) then
Packit 1f3717
      result $res, rules tavuviiva;
Packit 1f3717
    end;
Packit 1f3717
    if (loppu in $oikea.jatko) then
Packit 1f3717
      result $res, accept;
Packit 1f3717
    end;
Packit 1f3717
  end;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule asemosanan_sijapääte ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("asemosanan_sijapääte ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka = sijapääte;
Packit 1f3717
Packit 1f3717
  define $edellinen := $vasen.($n-1);
Packit 1f3717
  ? $oikea.sija in $edellinen.jatko;
Packit 1f3717
  ? äs_ok ($edellinen,$oikea);
Packit 1f3717
Packit 1f3717
  ? ($oikea.sija /= sisätulento_Vn)  or sisätulento_Vn_oikein  ($oikea.sija, substring($edellinen.alku,1R), $sana);
Packit 1f3717
  ? ($oikea.sija /= sisätulento_hVn) or sisätulento_hVn_oikein ($oikea.sija, substring($edellinen.alku,1R), $sana);
Packit 1f3717
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $edellinen.äs; end;
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if (($oikea.sija = kerronto_sti) and ($edellinen.luokka in @sti_edeltäjä)) then
Packit 1f3717
    if (loppu in $oikea.jatko) then
Packit 1f3717
      result $res, accept;
Packit 1f3717
    end;
Packit 1f3717
    result $res, rules liitesana;
Packit 1f3717
  else
Packit 1f3717
    if sijamuoto_sijasta($oikea.sija) = omanto then
Packit 1f3717
      result $res, rules inen_johdos_nimisanasta; # Muun+tyyppinen yms.
Packit 1f3717
    end;
Packit 1f3717
    if (loppu in $oikea.jatko) then
Packit 1f3717
      result $res, accept;
Packit 1f3717
    end;
Packit 1f3717
    result $res, rules liitesana;
Packit 1f3717
#    result $res, rules liitesana, tavuviiva, loppu;
Packit 1f3717
  end;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule laatutavan_sijapääte ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("laatutavan_sijapääte ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka = sijapääte;
Packit 1f3717
Packit 1f3717
  define $edellinen := $vasen.($n-1);
Packit 1f3717
  ? $oikea.sija in $edellinen.jatko;
Packit 1f3717
  ? äs_ok ($edellinen,$oikea);
Packit 1f3717
Packit 1f3717
  ? ($oikea.sija /= sisätulento_Vn)  or sisätulento_Vn_oikein  ($oikea.sija, substring($edellinen.alku,1R), $sana);
Packit 1f3717
  ? ($oikea.sija /= sisätulento_hVn) or sisätulento_hVn_oikein ($oikea.sija, substring($edellinen.alku,1R), $sana);
Packit 1f3717
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $edellinen.äs; end;
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if (($oikea.sija = kerronto_sti) and ($edellinen.luokka in @sti_edeltäjä)) then
Packit 1f3717
    if (loppu in $oikea.jatko) then
Packit 1f3717
      result $res, accept;
Packit 1f3717
    end;
Packit 1f3717
    result $res, rules liitesana;
Packit 1f3717
  else
Packit 1f3717
    if (omistusliite in $oikea.jatko) then
Packit 1f3717
      result $res, rules omistusliite;
Packit 1f3717
    end;
Packit 1f3717
    if (liitesana in $oikea.jatko) then
Packit 1f3717
      result $res, rules liitesana;
Packit 1f3717
    end;
Packit 1f3717
    if (loppu in $oikea.jatko) then
Packit 1f3717
      result $res, accept;
Packit 1f3717
    end;
Packit 1f3717
###    result $res, rules omistusliite, liitesana, loppu;
Packit 1f3717
  end;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule teonsana ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("teonsana ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka in <teonsana>;
Packit 1f3717
Packit 1f3717
  define $i := $n - 1;
Packit 1f3717
  ? $oikea.luokka in $vasen.$i.jatko;
Packit 1f3717
Packit 1f3717
  if ((substring($vasen.$i.perusmuoto,1R) matches @ääntiö) and
Packit 1f3717
      (substring($oikea.perusmuoto,1) matches @ääntiö)) then
Packit 1f3717
   ? (substring($vasen.$i.perusmuoto,1R) /= substring($oikea.perusmuoto,1));
Packit 1f3717
  end;
Packit 1f3717
Packit 1f3717
#define $n1 := transmit (<"teonsana1"> + <$vasen>);
Packit 1f3717
#define $n2 := transmit (<"teonsana2"> + <$oikea>);
Packit 1f3717
#define $n3 := transmit (<"teonsana3"> + <$sana>);
Packit 1f3717
#define $n6 := transmit (<"">);
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if (liitesana in $oikea.jatko) then
Packit 1f3717
    if (($oikea.tapaluokka = käskytapa) and
Packit 1f3717
        ($oikea.tekijä = 2) and
Packit 1f3717
        ($oikea.luku = yksikkö)) then
Packit 1f3717
      result $res, rules liitesana_ei_kO;
Packit 1f3717
    else
Packit 1f3717
      result $res, rules liitesana;
Packit 1f3717
    end;
Packit 1f3717
  end;
Packit 1f3717
  if (loppu in  $oikea.jatko) then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  if (tavuviiva in  $oikea.jatko) then
Packit 1f3717
    result $res, rules tavuviiva;
Packit 1f3717
  end;
Packit 1f3717
  if (@teonsanasta_johdettu_teonsana * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules teonsanan_johdos_teonsana;
Packit 1f3717
  end;
Packit 1f3717
#  if (@tekijämuodot * $oikea.jatko /= <>) then
Packit 1f3717
#    result $res, rules tekijämuodot;
Packit 1f3717
#  end;
Packit 1f3717
#  if (@nimitavat * $oikea.jatko /= <>) then
Packit 1f3717
#    result $res, rules nimitavat;
Packit 1f3717
#  end;
Packit 1f3717
#  if (@laatutavat * $oikea.jatko /= <>) then
Packit 1f3717
#    result $res, rules laatutavat;
Packit 1f3717
#  end;
Packit 1f3717
# Tämä on nopeampi kuin kaikki erikseen!
Packit 1f3717
  result $res, rules tekijämuodot, nimitavat, laatutavat;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule tekijämuodot ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("tekijämuodot ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka in @tekijämuodot;
Packit 1f3717
Packit 1f3717
  define $i := $n - 1;
Packit 1f3717
  ? $oikea.luokka in $vasen.$i.jatko;
Packit 1f3717
  ? äs_ok ($vasen.$i, $oikea);
Packit 1f3717
Packit 1f3717
#define $a := transmit ($vasen);
Packit 1f3717
#define $b := transmit ($oikea.luokka);
Packit 1f3717
#define $c := transmit ($sana);
Packit 1f3717
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $vasen.$i.äs; end;
Packit 1f3717
Packit 1f3717
  # Päätteessä on sama ääntiö kuin vartalon lopussa,
Packit 1f3717
  # esim. puhua => puhuu, saada => saa.
Packit 1f3717
  #
Packit 1f3717
  if (($oikea.luokka = kestämän_tekijäpääte_y3)
Packit 1f3717
      and ($vasen.$i.alku matches ".*" + @ääntiö)) then
Packit 1f3717
    require (viimeinen_kirjain ($vasen.$i.alku) = $sana);
Packit 1f3717
  end;
Packit 1f3717
Packit 1f3717
  # Vvi-päätteessä Avi hyväksytään missä tahansa sanassa, muuten päätteen alussa
Packit 1f3717
  # on sama ääntiö kuin vartalon lopussa: puhuuvi, sanoovi.
Packit 1f3717
  #
Packit 1f3717
  # "Savu käypi sieramista,: Pöly musta pörnyävi,: Tulta Hurja henkiävi,: Säkeniä suitsuavi, ..."
Packit 1f3717
  # Frans Pietari Kemelli: Höyrylaiva Oulu. Oulun Viikko-Sanomia 14.8.1841.
Packit 1f3717
  # http://fi.wikisource.org/wiki/H%C3%B6yrylaiva_Oulu
Packit 1f3717
  # http://digi.lib.helsinki.fi/sanomalehti/secure/showPage.html?id=122472&conversationId=1&action=entryPage
Packit 1f3717
  #
Packit 1f3717
  if (($oikea.luokka = kestämän_tekijäpääte_y3_Vvi)
Packit 1f3717
      and ($vasen.$i.alku matches ".*" + @ääntiö)) then
Packit 1f3717
    require (($sana in <"avi", "ävi">) or
Packit 1f3717
             (viimeinen_kirjain ($vasen.$i.alku) = substring($sana,1,1)));
Packit 1f3717
  end;
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if (loppu in $oikea.jatko) then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  result $res, rules liitesana;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule nimitavat ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("nimitavat ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka in @nimitavat;
Packit 1f3717
Packit 1f3717
  define $i := $n - 1;
Packit 1f3717
Packit 1f3717
#define $n1 := transmit (<"nimitavat1"> + <$vasen.$i>);
Packit 1f3717
#define $n2 := transmit (<"nimitavat2"> + <$oikea>);
Packit 1f3717
Packit 1f3717
  ? $oikea.luokka in $vasen.$i.jatko;
Packit 1f3717
#define $n3 := transmit (<"nimitavat3"> + <$vasen.$i.luokka> + <$oikea.jatko> + <$sana>);
Packit 1f3717
Packit 1f3717
  ? äs_ok ($vasen.$i, $oikea);
Packit 1f3717
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $vasen.$i.äs; end;
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if ($oikea.luokka in @nimitapa_1) then
Packit 1f3717
    if (loppu in $oikea.jatko) then
Packit 1f3717
      result $res, accept;
Packit 1f3717
    end;
Packit 1f3717
    result $res, rules nimitapa_1_pitkä, liitesana;
Packit 1f3717
  elseif ($oikea.luokka in @nimitapa_2) then
Packit 1f3717
    #
Packit 1f3717
    # Ääntiö + "iss[aä] käy mutta ei kerake + "iss[aä]".
Packit 1f3717
    # Esim. puno+issa (puno+essa) käy mutta ei tull+issa (tull+essa).
Packit 1f3717
    # Nyt esim. "aitoissa" on sekä aitta-sanan että aitoa-sanan muoto (aitoessa).
Packit 1f3717
    #
Packit 1f3717
    if ($sana in <"issa", "issä">) then
Packit 1f3717
      ? ($vasen.$i.alku matches ".*[aeiouyäö]");
Packit 1f3717
    end;
Packit 1f3717
    if (omistusliite in $oikea.jatko) then
Packit 1f3717
      result $res, rules omistusliite;
Packit 1f3717
    end;    
Packit 1f3717
    if (loppu in $oikea.jatko) then
Packit 1f3717
      result $res, accept;
Packit 1f3717
    end;
Packit 1f3717
    result $res, rules liitesana;
Packit 1f3717
  elseif ($oikea.luokka in @nimitapa_3) then
Packit 1f3717
    if (omistusliite in $oikea.jatko) then
Packit 1f3717
      result $res, rules omistusliite;
Packit 1f3717
    end;    
Packit 1f3717
    if (loppu in $oikea.jatko) then
Packit 1f3717
      result $res, accept;
Packit 1f3717
    end;
Packit 1f3717
    result $res, rules liitesana;
Packit 1f3717
  elseif ($oikea.luokka = nimitapa_5) then
Packit 1f3717
    if (loppu in $oikea.jatko) then
Packit 1f3717
      result $res, accept;
Packit 1f3717
    end;
Packit 1f3717
    result $res, rules omistusliite;
Packit 1f3717
  end;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule nimitapa_1_pitkä ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("nimitapa_1_pitkä ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka = nimitapa_1_pitkä;
Packit 1f3717
Packit 1f3717
  define $i := $n - 1;
Packit 1f3717
  ? nimitapa_1_pitkä in $vasen.$i.jatko;
Packit 1f3717
  ? äs_ok ($vasen.$i, $oikea);
Packit 1f3717
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $vasen.$i.äs; end;
Packit 1f3717
Packit 1f3717
#define $nimi := transmit ("nimitapa_1_pitkä " + $vasen.$i.alku + " " + $sana);
Packit 1f3717
Packit 1f3717
  result $vasen + <[alku: $sana] + $oikea>, rules omistusliite;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule laatutavat ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("laatutavat ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka in @laatutavat;
Packit 1f3717
Packit 1f3717
  define $i := $n - 1;
Packit 1f3717
  ? $oikea.luokka in $vasen.$i.jatko;
Packit 1f3717
  ? äs_ok ($vasen.$i, $oikea);
Packit 1f3717
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $vasen.$i.äs; end;
Packit 1f3717
Packit 1f3717
#define $n1 := transmit (<"laatutapa1"> + <$vasen>);
Packit 1f3717
#define $n2 := transmit (<"laatutapa2"> + <$oikea>);
Packit 1f3717
#define $n3 := transmit (<"laatutapa3"> + <$sana>);
Packit 1f3717
#define $n4 := transmit (<"laatutapa4"> + <$i>);
Packit 1f3717
#define $n5 := transmit (<"">);
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if (omistusliite in $oikea.jatko) then
Packit 1f3717
    result $res, rules omistusliite;
Packit 1f3717
  end;
Packit 1f3717
  if (liitesana in $oikea.jatko) then
Packit 1f3717
    result $res, rules liitesana;
Packit 1f3717
  end;
Packit 1f3717
  if (loppu in $oikea.jatko) then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  if ((voittoaste in $oikea.jatko) or (yliaste in $oikea.jatko)) then
Packit 1f3717
    result $res, rules laatutavan_voitto_yliaste;
Packit 1f3717
  end;
Packit 1f3717
  result $res, rules laatutavan_sijapääte;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule kieltosana ($vasen, $oikea, $sana):
Packit 1f3717
####define $profile := transmit ("kieltosana ($vasen, $oikea, $sana):");
Packit 1f3717
  ? $oikea.luokka = kieltosana;
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if (loppu in $oikea.jatko) then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  result $res, rules liitesana, liitesana_kä, tavuviiva;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule liitesana ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("liitesana ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka in <liitesana, liitesana2, liitesana_kO, liitesana_s>;
Packit 1f3717
Packit 1f3717
  define $i := $n - 1;
Packit 1f3717
  #
Packit 1f3717
  # Testin jälkiosa  on lisätty siksi, että on otettu
Packit 1f3717
  # käyttöön sääntö liitesana_ei_kO. Toinen mahdollisuus olisi ollut
Packit 1f3717
  # vaihtaa jokaisessa jatko-kentässä "liitesana" muotoon "liitesana, liitesana_kO",
Packit 1f3717
  # paitsi silloin, kun sanaa ei voi seurata liitesana_kO.
Packit 1f3717
  # Lisäämällä tämän pääsi helpommalla. Liitesana "ko", "kö" ei voi olla teonsanan
Packit 1f3717
  # jatkona samalla tavalla kuin muut liitesanat: "puhuko" on "puhu" + käskytapa_kielto
Packit 1f3717
  # (älkää puhuko), ei "puhu" + liitesana_kO (mutta "puhuuko" on "puhuu" + liitesana_kO).
Packit 1f3717
  # Huomaa toisaalta, että "puhukin" on "puhu" + litesana "kin".
Packit 1f3717
  #
Packit 1f3717
##? $oikea.luokka in $vasen.$i.jatko;
Packit 1f3717
  ? ($oikea.luokka in $vasen.$i.jatko) or (liitesana in $vasen.$i.jatko and $oikea.luokka = liitesana_kO);
Packit 1f3717
  ? äs_ok ($vasen.$i, $oikea);
Packit 1f3717
Packit 1f3717
#define $a := transmit (<$vasen.$i.luokka> + <$vasen.$i.tapaluokka> + 
Packit 1f3717
#                       <$vasen.$i.tekijä> + <$vasen.$i.luku> + <$sana> + <$oikea.luokka> + <$i>);
Packit 1f3717
Packit 1f3717
  result $vasen + <[alku: $sana] + $oikea>, accept;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
# Merkkijonon viimeinen merkki
Packit 1f3717
# Tekijä: Björn Beutel.
Packit 1f3717
#subrule last($string):
Packit 1f3717
#  ! $string matches ".*", ".": $last;
Packit 1f3717
#  return $last;
Packit 1f3717
#end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule liitesana_ei_kO ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("liitesana ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka in <liitesana, liitesana2, liitesana_s>;
Packit 1f3717
Packit 1f3717
  define $i := $n - 1;
Packit 1f3717
  ? $oikea.luokka in $vasen.$i.jatko;
Packit 1f3717
  ? äs_ok ($vasen.$i, $oikea);
Packit 1f3717
Packit 1f3717
#define $a := transmit (<$vasen.$i.luokka> + <$vasen.$i.tapaluokka> + 
Packit 1f3717
#                       <$vasen.$i.tekijä> + <$vasen.$i.luku> + <$sana> + <$oikea.luokka> + <$i>);
Packit 1f3717
Packit 1f3717
  result $vasen + <[alku: $sana] + $oikea>, accept;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule liitesana_kä ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("liitesana_kä ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka = liitesana_kä;
Packit 1f3717
Packit 1f3717
  define $i := $n - 1;
Packit 1f3717
  ? $oikea.luokka in $vasen.$i.jatko;
Packit 1f3717
  ? äs_ok ($vasen.$i, $oikea);
Packit 1f3717
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $vasen.$i.äs; end;
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if (loppu in $oikea.jatko) then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  result $res, rules liitesana;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule omistusliite ($vasen, $oikea, $sana, $n):
Packit 1f3717
#define $profile := transmit ("omistusliite ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka = omistusliite;
Packit 1f3717
  define $i := $n - 1;
Packit 1f3717
Packit 1f3717
  ? $oikea.luokka in $vasen.$i.jatko;
Packit 1f3717
  ? äs_ok ($vasen.$i, $oikea);
Packit 1f3717
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $vasen.$i.äs; end;
Packit 1f3717
  define $result := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  # Hyväksytään yksikön ensimmäisen omistusliite "in" eräissä
Packit 1f3717
  # sijamuodoissa, esim. matkallain, matkaltain, matkallein;
Packit 1f3717
  # ja myös esim. tyttärein (tyttäreni).
Packit 1f3717
  #
Packit 1f3717
  if (($sana = "in") and ($oikea.tekijä = 1)
Packit 1f3717
      and ((($vasen.$i.luokka in <sijapääte, nimitapa_2, nimitapa_3>) and
Packit 1f3717
             (not ($vasen.$i.sija in <vajanto_ttA, vajanto_ittA>)) and
Packit 1f3717
             (substring (value_string ($vasen.$i.sija), 1R) in <"A", "e">))
Packit 1f3717
            or (($vasen.$i.alku /= nil) and substring ($vasen.$i.alku, 1R) in <"e">))) then
Packit 1f3717
    if (loppu in $oikea.jatko) then
Packit 1f3717
      result $result, accept;
Packit 1f3717
    end;
Packit 1f3717
    result $result, rules liitesana;
Packit 1f3717
  end;
Packit 1f3717
Packit 1f3717
#define $a := transmit ($vasen);
Packit 1f3717
#define $b := transmit ($oikea);
Packit 1f3717
#define $c := transmit ($sana);
Packit 1f3717
Packit 1f3717
  # Jos sijamuoto on omanto_in, hyväksytään vain omistusliitteet "nsa", "nsä", "mme".
Packit 1f3717
  # Omistusliitteet "nsa" ja "nsä" hyväksytään aina, mutta omistusliite "mme" vain, jos
Packit 1f3717
  # sanan vartalon viimeinen kirjain on a tai e tai ä. Tämä algoritmi kelpaa Juhani
Packit 1f3717
  # Ahon teoksille (http://www.lonnrot.net/etext.html).
Packit 1f3717
  #
Packit 1f3717
  # Siis hyväksytään esim. isä+i+nsä, vala+i+nsa, kasvo+i+nsa, pöytä+i+mme, synte+i+mme, mutta ei usko+i+mme.
Packit 1f3717
  #
Packit 1f3717
  if ($sana in <"ni", "si", "s", "nsa", "nsä", "ns", "mme", "nne">) then
Packit 1f3717
    if ($vasen.$i.sija = omanto_in) then
Packit 1f3717
      if (($sana in <"nsa", "nsä">) or
Packit 1f3717
          (($sana in <"mme">) and (substring ($vasen.($i-1).alku, 1R) in <"a", "e", "ä">))) then
Packit 1f3717
        if (loppu in $oikea.jatko) then
Packit 1f3717
          result $result, accept;
Packit 1f3717
        end;
Packit 1f3717
        result $result, rules liitesana;
Packit 1f3717
      else
Packit 1f3717
        stop;
Packit 1f3717
      end;
Packit 1f3717
    else
Packit 1f3717
      if (loppu in $oikea.jatko) then
Packit 1f3717
        result $result, accept;
Packit 1f3717
      end;
Packit 1f3717
      result $result, rules liitesana;
Packit 1f3717
    end;
Packit 1f3717
  elseif omistusliite3_oikein ($vasen.$i.alku, $sana) then
Packit 1f3717
#define $o1 := transmit ($vasen.$i.alku + " " + $sana);
Packit 1f3717
#define $o2 := transmit ((strcat ($vasen) matches ".*(aa|ee|ii|oo|uu|yy|ää|öö)"));
Packit 1f3717
#define $o3 := transmit ((not (strcat ($vasen) matches ".*(aa|ee|ii|oo|uu|yy|ää|öö)")));
Packit 1f3717
#define $o4 := transmit (($vasen.$i.luokka = sijapääte));
Packit 1f3717
    if ((not (strcat ($vasen) matches ".*(aa|ee|ii|oo|uu|yy|ää|öö)"))
Packit 1f3717
        and ((($vasen.$i.luokka = sijapääte) and
Packit 1f3717
              ($vasen.$i.sija in 
Packit 1f3717
                                  osanto_tA, osanto_ttA, osanto_itA,
Packit 1f3717
                                  osanto_jA,
Packit 1f3717
                                  olento_nA, olento_inA,
Packit 1f3717
                                  tulento_ksi, tulento_iksi,
Packit 1f3717
                                  sisäolento_ssA, sisäolento_issA,
Packit 1f3717
                                  sisäeronto_stA, sisäeronto_istA,
Packit 1f3717
                                  ulko_olento_llA, ulko_olento_illA,
Packit 1f3717
                                  ulkoeronto_ltA, ulkoeronto_iltA,
Packit 1f3717
                                  ulkotulento_lle, ulkotulento_ille,
Packit 1f3717
                                  vajanto_ttA, vajanto_ittA,
Packit 1f3717
                                  seuranto_ine>))
Packit 1f3717
             or ($vasen.$i.luokka in <seikkasana, suhdesana>)
Packit 1f3717
             or (($vasen.$i.luokka = nimisana) and ($vasen.$i.sijamuoto /= nil)))) then # Omallatunnolla+an yms.
Packit 1f3717
      if (loppu in $oikea.jatko) then
Packit 1f3717
        result $result, accept;
Packit 1f3717
      end;
Packit 1f3717
      result $result, rules liitesana;
Packit 1f3717
    elseif (($vasen.$i.luokka in <nimitapa_1_pitkä, nimitapa_2, nimitapa_3, nimitapa_3_saama, nimitapa_5>)
Packit 1f3717
            and not ($vasen.$i.alku in <"maa", "mää">)) then  ## Tämä ehto on kopsattu Harri Pitkäsen Voikko-versiosta:
Packit 1f3717
                                                              ## eroa+maa+an on väärin.
Packit 1f3717
      if (loppu in $oikea.jatko) then
Packit 1f3717
        result $result, accept;
Packit 1f3717
      end;
Packit 1f3717
      result $result, rules liitesana;
Packit 1f3717
    end;
Packit 1f3717
  end;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule voitto_yliaste ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("voitto_yliaste ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka in @voittoaste + @yliaste;
Packit 1f3717
  define $i := $n - 1;
Packit 1f3717
Packit 1f3717
#define $nimi1a := transmit ("voitto_yliaste1 " + $vasen.$i.alku + " " + $sana);
Packit 1f3717
#define $nimi2a := transmit (<"voitto_yliaste2"> + <$vasen.$i>);
Packit 1f3717
#define $nimi3a := transmit (<"voitto_yliaste3"> + <$oikea> + <$sana>);
Packit 1f3717
Packit 1f3717
  ? $oikea.luokka in $vasen.$i.jatko;
Packit 1f3717
  ? äs_ok ($vasen.$i, $oikea);
Packit 1f3717
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $vasen.$i.äs; end;
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if ($oikea.luokka = voittoaste and yhdyssana in $oikea.jatko) then
Packit 1f3717
    #
Packit 1f3717
    # Jos jatkossa on yhdyssana, niin on myös tavuviiva.
Packit 1f3717
    #
Packit 1f3717
    result $res, rules yhdyssana, tavuviiva;
Packit 1f3717
  end;
Packit 1f3717
  if (liitesana in $oikea.jatko) then
Packit 1f3717
    result $res, rules liitesana;
Packit 1f3717
  end;
Packit 1f3717
  if (omistusliite in $oikea.jatko) then
Packit 1f3717
    result $res, rules omistusliite;
Packit 1f3717
  end;
Packit 1f3717
  if (johdin_UUs in $oikea.jatko) then
Packit 1f3717
    result $res, rules laatusanasta_johdettu_nimisana;
Packit 1f3717
  end;
Packit 1f3717
  if (loppu in $oikea.jatko) then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
Packit 1f3717
  result $res, rules sijapääte;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule laatutavan_voitto_yliaste ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("laatutavan_voitto_yliaste ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka in @voittoaste + @yliaste;
Packit 1f3717
  define $i := $n - 1;
Packit 1f3717
Packit 1f3717
  ? $oikea.luokka in $vasen.$i.jatko;
Packit 1f3717
  ? äs_ok ($vasen.$i, $oikea);
Packit 1f3717
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $vasen.$i.äs; end;
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if (liitesana in $oikea.jatko) then
Packit 1f3717
    result $res, rules liitesana;
Packit 1f3717
  end;
Packit 1f3717
  if (omistusliite in $oikea.jatko) then
Packit 1f3717
    result $res, rules omistusliite;
Packit 1f3717
  end;
Packit 1f3717
  if (loppu in $oikea.jatko) then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
Packit 1f3717
  result $res, rules sijapääte;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
subrule strcat ($vasen):
Packit 1f3717
  define $s := "";
Packit 1f3717
Packit 1f3717
  foreach $k in $vasen:
Packit 1f3717
    $s :=+ $k.alku;
Packit 1f3717
  end;
Packit 1f3717
Packit 1f3717
  return $s;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
subrule sana1 ($tietue):
Packit 1f3717
  if ($tietue.perusmuoto2 /= nil) then
Packit 1f3717
    return $tietue.perusmuoto2;
Packit 1f3717
  elseif ($tietue.perusmuoto = nil) then
Packit 1f3717
    return $tietue.alku;
Packit 1f3717
  else
Packit 1f3717
    return $tietue.perusmuoto;
Packit 1f3717
  end;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
subrule sisätulento_Vn_oikein ($sija, $ed_kirjain, $sana):
Packit 1f3717
  return ((($ed_kirjain matches @a) and ($sana matches "an?")) or
Packit 1f3717
          (($ed_kirjain matches @e) and ($sana matches "en?")) or
Packit 1f3717
          (($ed_kirjain matches @i) and ($sana matches "in?")) or
Packit 1f3717
          (($ed_kirjain matches @o) and ($sana matches "on?")) or
Packit 1f3717
          (($ed_kirjain matches @u) and ($sana matches "un?")) or
Packit 1f3717
          (($ed_kirjain matches @y) and ($sana matches "yn?")) or
Packit 1f3717
          (($ed_kirjain matches @ä) and ($sana matches "än?")) or
Packit 1f3717
          (($ed_kirjain matches @ö) and ($sana matches "ön?")));
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
subrule sisätulento_hVn_oikein ($sija, $ed_kirjain, $sana):
Packit 1f3717
  return ((($ed_kirjain matches @a) and ($sana matches "han?")) or
Packit 1f3717
          (($ed_kirjain matches @e) and ($sana matches "hen?")) or
Packit 1f3717
          (($ed_kirjain matches @i) and ($sana matches "hin?")) or
Packit 1f3717
          (($ed_kirjain matches @o) and ($sana matches "hon?")) or
Packit 1f3717
          (($ed_kirjain matches @u) and ($sana matches "hun?")) or
Packit 1f3717
          (($ed_kirjain matches @y) and ($sana matches "hyn?")) or
Packit 1f3717
          (($ed_kirjain matches @ä) and ($sana matches "hän?")) or
Packit 1f3717
          (($ed_kirjain matches @ö) and ($sana matches "hön?")) or
Packit 1f3717
          (($ed_kirjain matches "'"))); # Parfait'hen yms.
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
subrule omistusliite3_oikein ($sana, $liite):
Packit 1f3717
  return ((($sana matches ".*" + @a) and ($liite = "an")) or
Packit 1f3717
          (($sana matches ".*" + @e) and ($liite in <"en", "hen">)) or
Packit 1f3717
          (($sana matches ".*" + @i) and ($liite = "in")) or
Packit 1f3717
          (($sana matches ".*" + @o) and ($liite = "on")) or
Packit 1f3717
          (($sana matches ".*" + @u) and ($liite = "un")) or
Packit 1f3717
          (($sana matches ".*" + @y) and ($liite = "yn")) or
Packit 1f3717
          (($sana matches ".*" + @ä) and ($liite = "än")) or
Packit 1f3717
          (($sana matches ".*" + @ö) and ($liite = "ön")));
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
subrule viimeinen_kirjain ($sana):
Packit 1f3717
  if     ($sana matches ".*" + @a) then return "a";
Packit 1f3717
  elseif ($sana matches ".*" + @e) then return "e";
Packit 1f3717
  elseif ($sana matches ".*" + @i) then return "i";
Packit 1f3717
  elseif ($sana matches ".*" + @o) then return "o";
Packit 1f3717
  elseif ($sana matches ".*" + @u) then return "u";
Packit 1f3717
  elseif ($sana matches ".*" + @y) then return "y";
Packit 1f3717
  elseif ($sana matches ".*" + @ä) then return "ä";
Packit 1f3717
  elseif ($sana matches ".*" + @ö) then return "ö";
Packit 1f3717
  else
Packit 1f3717
    error "Viimeinen kirjain ei ole ääntiö sanassa " + $sana;
Packit 1f3717
  end;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
subrule yhdyssana_oikein ($vasen, $oikea, $n):
Packit 1f3717
#define $profile := transmit ("subrule yhdyssana_oikein ($vasen, $oikea, $n):");
Packit 1f3717
#define $a := transmit (<$oikea.luokka> + <$oikea.perusmuoto> + <$vasen.$n.luokka>);
Packit 1f3717
#define $b := transmit (<$vasen.$n.perusmuoto> + <$oikea.perusmuoto>);
Packit 1f3717
Packit 1f3717
Packit 1f3717
  # Jotkut sanat eivät voi olla yhdyssanojen osina.
Packit 1f3717
  #
Packit 1f3717
  if ((($vasen.$n.tiedot /= nil) and ((ei_ys in $vasen.$n.tiedot) or (ei_ysa in $vasen.$n.tiedot))) or
Packit 1f3717
      (($oikea.tiedot    /= nil) and ((ei_ys in $oikea.tiedot)))) then
Packit 1f3717
#define $d := transmit (<"yhdyssana_oikein-d">);
Packit 1f3717
    return no;
Packit 1f3717
  end;
Packit 1f3717
Packit 1f3717
  if (($vasen.$n.luokka /= tavuviiva) and ($oikea.tiedot /= nil) and (ei_ysj in $oikea.tiedot)) then
Packit 1f3717
    return no;
Packit 1f3717
  end;
Packit 1f3717
Packit 1f3717
  if (($vasen.$n.perusmuoto /= nil) and ($oikea.perusmuoto /= nil)) then
Packit 1f3717
    #
Packit 1f3717
    # Yhdyssanan eka osa ei voi loppua samaan ääntiöön, millä toka osa alkaa.
Packit 1f3717
    # Siis esim. ensiilta ei käy, vaan pitäisi olla ensi-ilta.
Packit 1f3717
    #
Packit 1f3717
    define $s := $vasen.$n.perusmuoto;
Packit 1f3717
    if (length($vasen.$n.alku) greater length($vasen.$n.perusmuoto)) then
Packit 1f3717
      $s := $vasen.$n.alku;
Packit 1f3717
    end;
Packit 1f3717
    define $s1 := substring($s,1R);
Packit 1f3717
    define $s2 := substring($oikea.perusmuoto,1);
Packit 1f3717
    if (($s1 = $s2) and ($s1 matches @ääntiö) and ($s2 matches @ääntiö)) then
Packit 1f3717
      return no;
Packit 1f3717
##      return ($s1 /= $s2);
Packit 1f3717
    end;
Packit 1f3717
  end;
Packit 1f3717
  return yes;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
#####################################################
Packit 1f3717
Packit 1f3717
Packit 1f3717
output_filter tulosta ($tulos):
Packit 1f3717
  foreach $j in $tulos:
Packit 1f3717
#define $a := transmit ($j);
Packit 1f3717
#define $b := transmit ("");
Packit 1f3717
    result perusmuoto ($j);
Packit 1f3717
  end;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
subrule sana2 ($tietue):
Packit 1f3717
#  ? ($tietue.luokka = lukusana);
Packit 1f3717
#define $a := transmit ($tietue);
Packit 1f3717
  if ($tietue.perusmuoto = "kymmenen") then
Packit 1f3717
    return "kymmentä";
Packit 1f3717
  elseif ($tietue.perusmuoto = "tuhat") then
Packit 1f3717
    return "tuhatta";
Packit 1f3717
  elseif ($tietue.alaluokka in <sata, miljoona> and $tietue.perusmuoto /= "sadas") then
Packit 1f3717
    return $tietue.perusmuoto + "a";
Packit 1f3717
  elseif ($tietue.perusmuoto2 /= nil) then
Packit 1f3717
    return $tietue.perusmuoto2;
Packit 1f3717
  elseif ($tietue.perusmuoto = nil) then
Packit 1f3717
    return $tietue.alku;
Packit 1f3717
  else
Packit 1f3717
    return $tietue.perusmuoto;
Packit 1f3717
  end;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
subrule lukusanan_perusmuoto ($tietue, $i, $k, $s):
Packit 1f3717
#define $a := transmit (<"a"> + <$tietue.$i.alku> + <$tietue.$i.perusmuoto> + <length($tietue)> + <$i> + <$k> + <$s>);
Packit 1f3717
Packit 1f3717
  if ($i = 1 and $tietue.$i.alaluokka in <sata, tuhat, miljoona>) then
Packit 1f3717
    return $tietue.$i.perusmuoto;
Packit 1f3717
  end;
Packit 1f3717
Packit 1f3717
  if ($tietue.$i.luokka = lukusanan_jälkiliite) then
Packit 1f3717
    return $tietue.$i.perusmuoto;
Packit 1f3717
  end;
Packit 1f3717
Packit 1f3717
  if ($tietue.$i.alaluokka = yksiyhdeksän) then
Packit 1f3717
    if (($k greater 2) and ($i less $k) and ($tietue.($i+1).luokka = sijapääte) and ($tietue.($i+2).luokka /= lukusana)) then
Packit 1f3717
      return $tietue.$i.alku;
Packit 1f3717
    else
Packit 1f3717
      return $tietue.$i.perusmuoto;
Packit 1f3717
    end;
Packit 1f3717
  elseif ($tietue.$i.perusmuoto = "kymmenen") then
Packit 1f3717
    if (($i = $k) and (($s matches ".+sataa") or ($s = "sata"))) then
Packit 1f3717
      return "kymmenen";
Packit 1f3717
    else
Packit 1f3717
      return "kymmentä";
Packit 1f3717
    end;
Packit 1f3717
  elseif ($tietue.$i.alaluokka in <sata, tuhat, miljoona>) then
Packit 1f3717
    if ($tietue.($i+1).luokka in <lukusana, sijapääte>) then
Packit 1f3717
#define $b := transmit (<"b"> + <$tietue.$i.alku> + <$tietue.$i.perusmuoto> + <length($tietue)> + <$i> + <$k> + <$s>);
Packit 1f3717
      return sana2 ($tietue.$i);
Packit 1f3717
    else
Packit 1f3717
#define $c := transmit (<"c"> + <$tietue.$i.alku> + <$tietue.$i.perusmuoto> + <length($tietue)> + <$i> + <$k> + <$s>);
Packit 1f3717
      return $tietue.$i.perusmuoto;
Packit 1f3717
    end;
Packit 1f3717
  elseif ($tietue.$i.luokka = sijapääte) then
Packit 1f3717
#define $ö := transmit (<"ö"> + <$tietue.$i.alku> + <$tietue.$i.perusmuoto> + <length($tietue)> + <$i> + <$k> + <$s>);
Packit 1f3717
    if ($i less $k and $tietue.($i+1).luokka in <lukusana, lukusanan_jälkiliite>) then
Packit 1f3717
      return "";
Packit 1f3717
    else
Packit 1f3717
      return $tietue.$i.alku;
Packit 1f3717
    end;
Packit 1f3717
  end;
Packit 1f3717
  return alku ($tietue.$i);
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
subrule alku ($tietue):
Packit 1f3717
#define $a := transmit (<"ALKU"> + <$tietue>);
Packit 1f3717
Packit 1f3717
  if ($tietue.perusmuoto = nil) then return $tietue.alku; end;
Packit 1f3717
Packit 1f3717
  if ($tietue.alku2 /= nil) then
Packit 1f3717
##define $aaaa := transmit ($tietue.alku);
Packit 1f3717
    return $tietue.alku2;
Packit 1f3717
  end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
  # Antautua/antauta. Antau(du)ttu-muodolle tulee väärä perusmuoto antauttu.
Packit 1f3717
  #
Packit 1f3717
#  if ($tietue.perusmuoto matches ("...*(au|äy)" : $alku, "t(ua|yä)" : $loppu)) then
Packit 1f3717
#    define $n := length ($alku);
Packit 1f3717
#    return substring($tietue.perusmuoto,1,$n+2);
Packit 1f3717
#  end;
Packit 1f3717
Packit 1f3717
  # Onneto(i)n.
Packit 1f3717
  #
Packit 1f3717
  if (($tietue.luokka = johdin_tOn) and ($tietue.alku matches ("t[oö]in"))) then
Packit 1f3717
#define $ton := transmit ("ton");
Packit 1f3717
    return $tietue.perusmuoto;
Packit 1f3717
  end;
Packit 1f3717
Packit 1f3717
  define $taulukko := <
Packit 1f3717
#       <"",    "",   "",    "">,
Packit 1f3717
#        <"kamari",      "kammar",    "kamar">,
Packit 1f3717
        <"kirjoitelma", "kirjotelm", "kirjoitelm">,
Packit 1f3717
        <"kulttuuri",   "kultuur",   "kulttuur">,
Packit 1f3717
        <"liipaisin",   "liipasi",   "liipaisi">,
Packit 1f3717
        <"mahdoton",    "maho",      "mahdo">,
Packit 1f3717
#        <"poliitikko",  "politik",   "poliitik">,
Packit 1f3717
#        <"politiikka",  "politik",   "politiik">,
Packit 1f3717
        <"punainen",    "punan",     "punain">,
Packit 1f3717
        <"punainen",    "punas",     "punais">,
Packit 1f3717
        <"teatteri",    "teaatte",   "teatte">
Packit 1f3717
      >;
Packit 1f3717
  foreach $k in $taulukko:
Packit 1f3717
    if ($tietue.perusmuoto = $k.1) then
Packit 1f3717
#define $e := transmit ($k);
Packit 1f3717
      define $n := length ($k.2);
Packit 1f3717
      if (length($tietue.alku) greater_equal $n) and (substring ($tietue.alku,1,$n) = $k.2) then
Packit 1f3717
#define $ö := transmit ("Huu " + $tietue.alku + " " + $k.3 + " " + substring ($tietue.alku, $n + 1, 1R));
Packit 1f3717
        return $k.3 + substring ($tietue.alku, $n + 1, 1R);
Packit 1f3717
      end;
Packit 1f3717
    end;
Packit 1f3717
  end;
Packit 1f3717
#define $buu := transmit (<"boo"> + <$tietue.alku>);
Packit 1f3717
  return $tietue.alku;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
# Muutetaan sana perusmuotoon: Väisäsillemmekö -> Väisänen.
Packit 1f3717
#
Packit 1f3717
subrule perusmuoto ($tietue):
Packit 1f3717
  define $n := length ($tietue);
Packit 1f3717
  define $k := $n;
Packit 1f3717
Packit 1f3717
#define $z := transmit (<"1"> + <$tietue> + <$k>);
Packit 1f3717
Packit 1f3717
  # Poistetaan sanan lopusta osat, jotka eivät vaikuta perusmuotoon.
Packit 1f3717
  #
Packit 1f3717
  repeat while ($tietue.$k.luokka in 
Packit 1f3717
                                      omistusliite, kaksoispiste,
Packit 1f3717
                                      voittoaste, yliaste,
Packit 1f3717
                                      liitesana_kä, nimitapa_1_pitkä, nimitapa_5>
Packit 1f3717
                                      + @tositapa + @ehtotapa + @mahtotapa + @käskytapa
Packit 1f3717
                                      + @nimitapa_1 + @nimitapa_2 + @nimitapa_3
Packit 1f3717
                                      + @laatutapa_1 + @laatutapa_2);
Packit 1f3717
#define $a := transmit (<"2"> + <$tietue.$k.perusmuoto> + <$tietue.$k.alku> + <$k>);
Packit 1f3717
    $k :=- 1;
Packit 1f3717
  end;
Packit 1f3717
Packit 1f3717
#define $a := transmit (<"A"> + <$tietue.$k.perusmuoto> + <$tietue.$k.alku> + <$k>);
Packit 1f3717
Packit 1f3717
  define $s := "";
Packit 1f3717
  foreach $i in $k - 1:
Packit 1f3717
    if ($tietue.$i.lukutyyppi /= nil and $tietue.$i.lukutyyppi = perusluku) then
Packit 1f3717
      if ($i = 1 and $tietue.($i+1).luokka = sijapääte and $tietue.($i+2).luokka /= lukusana) then
Packit 1f3717
        $s :=+ $tietue.$i.alku;
Packit 1f3717
      else
Packit 1f3717
        $s :=+ lukusanan_perusmuoto ($tietue, $i, $k, $s);
Packit 1f3717
      end;
Packit 1f3717
#    elseif ($tietue.($i+1).luokka = tavuviiva) then
Packit 1f3717
#      if ($tietue.$i.luokka = sijapääte and $tietue.$i.sija in <omanto_n>) then
Packit 1f3717
#        $s :=+ alku ($tietue.$i);
Packit 1f3717
#      end;
Packit 1f3717
    else
Packit 1f3717
      $s :=+ alku ($tietue.$i);
Packit 1f3717
#define $b := transmit (<"B"> + <$tietue.$i.perusmuoto> + <$tietue.$i.alku>  + <$tietue.$i.luokka> + <$i> + <$s>);
Packit 1f3717
    end;
Packit 1f3717
  end;
Packit 1f3717
  if ($k = 1) then
Packit 1f3717
    $s :=+ sana1 ($tietue.$k);
Packit 1f3717
#define $b := transmit (<"C"> + <$tietue.$k.perusmuoto> + <$tietue.$k.alku> + <$k> + <$s>);
Packit 1f3717
  elseif ($tietue.$k.lukutyyppi /= nil and $tietue.$k.lukutyyppi = perusluku) then
Packit 1f3717
    $s :=+ lukusanan_perusmuoto ($tietue, $k, $k, $s);
Packit 1f3717
#define $c := transmit (<"D"> + <$tietue.$k.perusmuoto> + <$tietue.$k.alku> + <$k> + <$s>);
Packit 1f3717
  else
Packit 1f3717
    $s :=+ sana2 ($tietue.$k);
Packit 1f3717
#define $d := transmit (<"E"> + <$tietue.$k.perusmuoto> + <$tietue.$k.alku> + <$k> + <$s>);
Packit 1f3717
  end;
Packit 1f3717
  return $s;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
Packit 1f3717
##==========================================
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule teonsana_teonsanasta_johdettu_nimisana ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("teonsana_teonsanasta_johdettu_nimisana ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka = teonsana;
Packit 1f3717
  ? nimisana in $vasen.($n-1).jatko;
Packit 1f3717
  ? $oikea.jatko * (@teonsanasta_johdettu_teonsana) /= <>;
Packit 1f3717
  ? äs_ok ($vasen.($n-1), $oikea);
Packit 1f3717
Packit 1f3717
#define $a := transmit ($vasen.($n-1));
Packit 1f3717
#define $b := transmit ($oikea);
Packit 1f3717
#define $c := transmit ($sana);
Packit 1f3717
#define $d := transmit ($n);
Packit 1f3717
#define $e := transmit (<"">);
Packit 1f3717
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $vasen.($n-1).äs; end;
Packit 1f3717
  result $vasen + <[alku: $sana] + $oikea>, rules teonsanan_johdos_teonsana_nimisana;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule teonsana_teonsanasta_johdettu_laatusana ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("teonsana_teonsanasta_johdettu_laatusana ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka = teonsana;
Packit 1f3717
  ? laatusana in $vasen.($n-1).jatko;
Packit 1f3717
  ? $oikea.jatko * (@teonsanasta_johdettu_teonsana) /= <>;
Packit 1f3717
  ? äs_ok ($vasen.($n-1), $oikea);
Packit 1f3717
Packit 1f3717
#define $a := transmit ($vasen.($n-1));
Packit 1f3717
#define $b := transmit ($oikea);
Packit 1f3717
#define $c := transmit ($sana);
Packit 1f3717
#define $d := transmit ($n);
Packit 1f3717
#define $e := transmit (<"">);
Packit 1f3717
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $vasen.($n-1).äs; end;
Packit 1f3717
  result $vasen + <[alku: $sana] + $oikea>, rules teonsanan_johdos_teonsana_laatusana;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule teonsanasta_johdettu_nimisana ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("teonsanasta_johdettu_nimisana ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka = teonsana;
Packit 1f3717
  ? $oikea.jatko * (@teonsanasta_johdettu_nimisana) /= <>;
Packit 1f3717
Packit 1f3717
#define $a := transmit ($vasen.($n-1).jatko);
Packit 1f3717
#define $b := transmit ($oikea.jatko);
Packit 1f3717
#define $c := transmit ($sana);
Packit 1f3717
#define $d := transmit ($n);
Packit 1f3717
#define $e := transmit ($vasen.($n-1));
Packit 1f3717
Packit 1f3717
#  ? yhdyssana_oikein ($vasen, $oikea, $n-1);
Packit 1f3717
  if ((substring($vasen.($n-1).perusmuoto,1R) = substring($oikea.perusmuoto,1)) and
Packit 1f3717
      (substring($oikea.perusmuoto,1) matches @ääntiö)) then
Packit 1f3717
    stop;
Packit 1f3717
  end;
Packit 1f3717
  ? $vasen.($n-1).jatko * <nimisana, nimi_laatusana, laatusana, etuliite> /= <>;
Packit 1f3717
Packit 1f3717
Packit 1f3717
  result $vasen + <[alku: $sana] + $oikea>,
Packit 1f3717
         rules teonsanan_johdos_nimisana;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule teonsanan_johdos_nimisana ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("teonsanan_johdos_nimisana ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka in @teonsanasta_johdettu_nimisana;
Packit 1f3717
Packit 1f3717
  define $i := $n - 1;
Packit 1f3717
  ? $oikea.luokka in $vasen.$i.jatko;
Packit 1f3717
Packit 1f3717
  # Vaihdetaan ääntiösointu oikeaksi.
Packit 1f3717
  # Esim. pitää => pito, kiertää => kierros.
Packit 1f3717
  #
Packit 1f3717
  if ($oikea.luokka in <johdin_O, johdin_Os, johdin_tO_leuto, johdin_tO_liitto>) then
Packit 1f3717
    $vasen.$i :=+ [alkuperäinen_äs: $vasen.($n-1).äs];
Packit 1f3717
    if ($vasen.$i.alku matches ".*" + @yäö + ".*") then
Packit 1f3717
      $vasen.$i.äs := ä;
Packit 1f3717
    else
Packit 1f3717
      $vasen.$i.äs := a;
Packit 1f3717
    end;
Packit 1f3717
  end;
Packit 1f3717
Packit 1f3717
  ? äs_ok ($vasen.$i, $oikea);
Packit 1f3717
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $vasen.$i.äs; end;
Packit 1f3717
Packit 1f3717
  $vasen.$i :=+ [lähtöluokka: $vasen.$i.luokka];
Packit 1f3717
  $vasen.$i.luokka := nimisana;
Packit 1f3717
Packit 1f3717
#define $a := transmit ($vasen.$i.luokka);
Packit 1f3717
#define $b := transmit ($oikea);
Packit 1f3717
#define $c := transmit ($sana);
Packit 1f3717
#define $d := transmit ($n);
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if (tavuviiva in $oikea.jatko) then
Packit 1f3717
    result $res, rules tavuviiva;
Packit 1f3717
  end;
Packit 1f3717
  if (yhdyssana in $oikea.jatko) then
Packit 1f3717
    result $res, rules yhdyssana;
Packit 1f3717
  end;
Packit 1f3717
  if (omistusliite in $oikea.jatko) then
Packit 1f3717
    result $res, rules omistusliite;
Packit 1f3717
  end;
Packit 1f3717
  if (liitesana in $oikea.jatko) then
Packit 1f3717
    result $res, rules liitesana;
Packit 1f3717
  end;
Packit 1f3717
  if (loppu in $oikea.jatko) then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  if (@nimisanasta_johdettu_seikkasana * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules nimisanasta_johdettu_seikkasana;
Packit 1f3717
  end;
Packit 1f3717
  if (@nimisanasta_johdettu_laatusana * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules nimisanasta_johdettu_laatusana;
Packit 1f3717
  end;
Packit 1f3717
  if (@nimi_laatusanan_johdin * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules nimi_laatusanan_johdin;
Packit 1f3717
  end;
Packit 1f3717
  result $res, rules sijapääte;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
#################################################
Packit 1f3717
Packit 1f3717
combi_rule teonsanasta_johdettu_laatusana ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("teonsanasta_johdettu_laatusana ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka = teonsana;
Packit 1f3717
  ? $oikea.jatko * @teonsanasta_johdettu_laatusana /= <>;
Packit 1f3717
Packit 1f3717
#define $a := transmit ($vasen);
Packit 1f3717
#define $b := transmit ($oikea);
Packit 1f3717
#define $c := transmit ($sana);
Packit 1f3717
#define $d := transmit ($n);
Packit 1f3717
Packit 1f3717
##  ? yhdyssana_oikein ($vasen, $oikea, $n-1);
Packit 1f3717
  if ((substring($vasen.($n-1).perusmuoto,1R) = substring($oikea.perusmuoto,1)) and
Packit 1f3717
      (substring($oikea.perusmuoto,1) matches @ääntiö)) then
Packit 1f3717
    stop;
Packit 1f3717
  end;
Packit 1f3717
  ? $vasen.($n-1).jatko * <nimisana, nimi_laatusana, laatusana, etuliite> /= <>;
Packit 1f3717
Packit 1f3717
  result $vasen + <[alku: $sana] + $oikea>,
Packit 1f3717
         rules teonsanan_johdos_laatusana;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule teonsanan_johdos_laatusana ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("teonsanan_johdos_laatusana ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka in @teonsanasta_johdettu_laatusana;
Packit 1f3717
  ? $oikea.luokka in $vasen.($n-1).jatko;
Packit 1f3717
  ? äs_ok ($vasen.($n-1), $oikea);
Packit 1f3717
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $vasen.($n-1).äs; end;
Packit 1f3717
Packit 1f3717
#define $a := transmit ($vasen);
Packit 1f3717
#define $b := transmit ($oikea);
Packit 1f3717
#define $c := transmit ($sana);
Packit 1f3717
#define $d := transmit ($n);
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if (tavuviiva in $oikea.jatko) then
Packit 1f3717
    result $res, rules tavuviiva;
Packit 1f3717
  end;
Packit 1f3717
  if (yhdyssana in $oikea.jatko) then
Packit 1f3717
    result $res, rules yhdyssana;
Packit 1f3717
  end;
Packit 1f3717
  if (omistusliite in $oikea.jatko) then
Packit 1f3717
    result $res, rules omistusliite;
Packit 1f3717
  end;
Packit 1f3717
  if (liitesana in $oikea.jatko) then
Packit 1f3717
    result $res, rules liitesana;
Packit 1f3717
  end;
Packit 1f3717
  if (loppu in $oikea.jatko) then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  if (@laatusanasta_johdettu_nimisana * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules laatusanasta_johdettu_nimisana;
Packit 1f3717
  end;
Packit 1f3717
  if (@laatusanasta_johdettu_laatusana * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules laatusanasta_johdettu_laatusana;
Packit 1f3717
  end;
Packit 1f3717
  if (@nimi_laatusanan_johdin * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules nimi_laatusanan_johdin;
Packit 1f3717
  end;
Packit 1f3717
  if ((voittoaste in $oikea.jatko) or (yliaste in $oikea.jatko)) then
Packit 1f3717
    result $res, rules voitto_yliaste;
Packit 1f3717
  end;
Packit 1f3717
  result $res, rules sijapääte;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule teonsanan_johdos_teonsana ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("teonsanan_johdos_teonsana ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka in @teonsanasta_johdettu_teonsana;
Packit 1f3717
  ? $oikea.luokka in $vasen.($n-1).jatko;
Packit 1f3717
  ? äs_ok ($vasen.($n-1), $oikea);
Packit 1f3717
Packit 1f3717
#define $a := transmit (<"vasen"> + <$vasen>);
Packit 1f3717
#define $b := transmit (<"oikea"> + <$oikea>);
Packit 1f3717
#define $c := transmit ($sana);
Packit 1f3717
#define $d := transmit ($n);
Packit 1f3717
Packit 1f3717
  $oikea :=+ [lähtöluokka: $oikea.luokka];
Packit 1f3717
  $oikea.luokka := teonsana;
Packit 1f3717
Packit 1f3717
#define $a2 := transmit (<"vasen2"> + <$vasen>);
Packit 1f3717
#define $b2 := transmit (<"oikea2"> + <$oikea>);
Packit 1f3717
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $vasen.($n-1).äs; end;
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if (liitesana in $oikea.jatko) then
Packit 1f3717
    result $res, rules liitesana_ei_kO;
Packit 1f3717
  end;
Packit 1f3717
  if (loppu in  $oikea.jatko) then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  if (tavuviiva in  $oikea.jatko) then
Packit 1f3717
    result $res, rules tavuviiva;
Packit 1f3717
  end;
Packit 1f3717
##  if (@teonsanasta_johdettu_teonsana * $oikea.jatko /= <>) then
Packit 1f3717
##    result $res, rules teonsanan_johdos_teonsana;
Packit 1f3717
##  end;
Packit 1f3717
#  if (@tekijämuodot * $oikea.jatko /= <>) then
Packit 1f3717
#    result $res, rules tekijämuodot;
Packit 1f3717
#  end;
Packit 1f3717
#  if (@nimitavat * $oikea.jatko /= <>) then
Packit 1f3717
#    result $res, rules nimitavat;
Packit 1f3717
#  end;
Packit 1f3717
#  if (@laatutavat * $oikea.jatko /= <>) then
Packit 1f3717
#    result $res, rules laatutavat;
Packit 1f3717
#  end;
Packit 1f3717
# Tämä on nopeampi kuin kaikki erikseen!
Packit 1f3717
  result $res, rules tekijämuodot, nimitavat, laatutavat,
Packit 1f3717
                     teonsanan_johdos_nimisana, teonsanan_johdos_laatusana;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule teonsanan_johdos_teonsana_nimisana ($vasen, $oikea, $sana, $n):
Packit 1f3717
#define $profile := transmit ("teonsanan_johdos_teonsana_nimisana ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka in @teonsanasta_johdettu_teonsana;
Packit 1f3717
  ? $oikea.luokka in $vasen.($n-1).jatko;
Packit 1f3717
  ? äs_ok ($vasen.($n-1), $oikea);
Packit 1f3717
Packit 1f3717
#define $a := transmit ($vasen);
Packit 1f3717
#define $b := transmit ($oikea);
Packit 1f3717
#define $c := transmit ($sana);
Packit 1f3717
#define $d := transmit ($n);
Packit 1f3717
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $vasen.($n-1).äs; end;
Packit 1f3717
Packit 1f3717
  result $vasen + <[alku: $sana] + $oikea>, rules teonsanan_johdos_nimisana;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule teonsanan_johdos_teonsana_laatusana ($vasen, $oikea, $sana, $n):
Packit 1f3717
#define $profile := transmit ("teonsanan_johdos_teonsana_nimisana ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka in @teonsanasta_johdettu_teonsana;
Packit 1f3717
  ? $oikea.luokka in $vasen.($n-1).jatko;
Packit 1f3717
  ? äs_ok ($vasen.($n-1), $oikea);
Packit 1f3717
Packit 1f3717
#define $a := transmit ($vasen);
Packit 1f3717
#define $b := transmit ($oikea);
Packit 1f3717
#define $c := transmit ($sana);
Packit 1f3717
#define $d := transmit ($n);
Packit 1f3717
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $vasen.($n-1).äs; end;
Packit 1f3717
Packit 1f3717
  result $vasen + <[alku: $sana] + $oikea>, rules teonsanan_johdos_laatusana;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
#################################################
Packit 1f3717
Packit 1f3717
combi_rule nimisanasta_johdettu_seikkasana ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("nimisanasta_johdettu_seikkasana ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka in @nimisanasta_johdettu_seikkasana;
Packit 1f3717
  ? $oikea.luokka in $vasen.($n-1).jatko;
Packit 1f3717
  ? äs_ok ($vasen.($n-1), $oikea);
Packit 1f3717
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $vasen.($n-1).äs; end;
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if (loppu in $oikea.jatko) then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  result $res, rules liitesana;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
#################################################
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule nimisanasta_johdettu_laatusana ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("nimisanasta_johdettu_laatusana ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka in @nimisanasta_johdettu_laatusana;
Packit 1f3717
  define $i := $n - 1;
Packit 1f3717
  ? $oikea.luokka in $vasen.$i.jatko;
Packit 1f3717
Packit 1f3717
  if ($oikea.luokka = johdin_inen) then
Packit 1f3717
    if (($n = 2) and (($vasen.$i.tiedot = nil) or (not (inen in $vasen.$i.tiedot)))) then
Packit 1f3717
#define $aa := transmit ("Plonk " + $vasen.$i.perusmuoto + " " + $vasen.$i.alku);
Packit 1f3717
      stop;
Packit 1f3717
    end;
Packit 1f3717
  end;
Packit 1f3717
Packit 1f3717
  ? äs_ok ($vasen.$i, $oikea);
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $vasen.($n-1).äs; end;
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if (tavuviiva in $oikea.jatko) then
Packit 1f3717
    result $res, rules tavuviiva;
Packit 1f3717
  end;
Packit 1f3717
##############################################
Packit 1f3717
 if (yhdyssana in $oikea.jatko) then
Packit 1f3717
    result $res, rules yhdyssana;
Packit 1f3717
  end;
Packit 1f3717
Packit 1f3717
#  if (yhdyssana in $oikea.jatko) then
Packit 1f3717
#    if ($oikea.luokka = johdin_inen and $n = 2) then
Packit 1f3717
#define $a := transmit (<"a"> + <$vasen.$i.perusmuoto>);
Packit 1f3717
#define $b := transmit (<"b"> + <$oikea - jatko>);
Packit 1f3717
#      result $res, rules inen_päätteinen_laatusana;
Packit 1f3717
#    else
Packit 1f3717
#      result $res, rules yhdyssana;
Packit 1f3717
#    end;
Packit 1f3717
#  end;
Packit 1f3717
###################################
Packit 1f3717
  if (loppu in $oikea.jatko) then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  if (liitesana in $oikea.jatko) then
Packit 1f3717
    result $res, rules liitesana;
Packit 1f3717
  end;
Packit 1f3717
  if (omistusliite in $oikea.jatko) then
Packit 1f3717
    result $res, rules omistusliite;
Packit 1f3717
  end;
Packit 1f3717
  if (@laatusanasta_johdettu_nimisana * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules laatusanasta_johdettu_nimisana;
Packit 1f3717
  end;
Packit 1f3717
  if (@laatusanasta_johdettu_laatusana * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules laatusanasta_johdettu_laatusana;
Packit 1f3717
  end;
Packit 1f3717
  if (@nimi_laatusanan_johdin * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules nimi_laatusanan_johdin;
Packit 1f3717
  end;
Packit 1f3717
  if ((voittoaste in $oikea.jatko) or (yliaste in $oikea.jatko)) then
Packit 1f3717
    result $res, rules voitto_yliaste;
Packit 1f3717
  end;
Packit 1f3717
  result $res, rules sijapääte;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
#################################################
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule laatusanasta_johdettu_nimisana ($vasen, $oikea, $sana, $n):
Packit 1f3717
#define $profile := transmit ("laatusanasta_johdettu_nimisana ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka in @laatusanasta_johdettu_nimisana;
Packit 1f3717
  ? $oikea.luokka in $vasen.($n-1).jatko;
Packit 1f3717
  ? äs_ok ($vasen.($n-1), $oikea);
Packit 1f3717
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $vasen.($n-1).äs; end;
Packit 1f3717
Packit 1f3717
#define $a := transmit ($vasen.($n-1));
Packit 1f3717
#define $b := transmit ($oikea);
Packit 1f3717
#define $c := transmit ($sana);
Packit 1f3717
#define $d := transmit ($n);
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if (tavuviiva in $oikea.jatko) then
Packit 1f3717
    result $res, rules tavuviiva;
Packit 1f3717
  end;
Packit 1f3717
  if (yhdyssana in $oikea.jatko) then
Packit 1f3717
    result $res, rules yhdyssana;
Packit 1f3717
  end;
Packit 1f3717
  if (@nimisanasta_johdettu_laatusana * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules nimisanasta_johdettu_laatusana;
Packit 1f3717
  end;
Packit 1f3717
  if (@nimisanasta_johdettu_seikkasana * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules nimisanasta_johdettu_seikkasana;
Packit 1f3717
  end;
Packit 1f3717
  if (@nimi_laatusanan_johdin * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules nimi_laatusanan_johdin;
Packit 1f3717
  end;
Packit 1f3717
  if (omistusliite in $oikea.jatko) then
Packit 1f3717
    result $res, rules omistusliite;
Packit 1f3717
  end;
Packit 1f3717
  if (liitesana in $oikea.jatko) then
Packit 1f3717
    result $res, rules liitesana;
Packit 1f3717
  end;
Packit 1f3717
  if (loppu in $oikea.jatko) then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  result $res, rules sijapääte;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule laatusanasta_johdettu_laatusana ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("laatusanasta_johdettu_laatusana ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka in @laatusanasta_johdettu_laatusana;
Packit 1f3717
  ? $oikea.luokka in $vasen.($n-1).jatko;
Packit 1f3717
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $vasen.($n-1).äs; end;
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if (omistusliite in $oikea.jatko) then
Packit 1f3717
    result $res, rules omistusliite;
Packit 1f3717
  end;
Packit 1f3717
  if (liitesana in $oikea.jatko) then
Packit 1f3717
    result $res, rules liitesana;
Packit 1f3717
  end;
Packit 1f3717
  if (tavuviiva in $oikea.jatko) then
Packit 1f3717
    result $res, rules tavuviiva;
Packit 1f3717
  end;
Packit 1f3717
  if (loppu in $oikea.jatko) then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  if ((voittoaste in $oikea.jatko) or (yliaste in $oikea.jatko)) then
Packit 1f3717
    result $res, rules voitto_yliaste;
Packit 1f3717
  end;
Packit 1f3717
  if (@laatusanasta_johdettu_nimisana * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules laatusanasta_johdettu_nimisana;             # Hyvänlaisuus.
Packit 1f3717
  end;
Packit 1f3717
  result $res, rules sijapääte;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
###########################################################################33
Packit 1f3717
Packit 1f3717
# Erisnimien käsittely on muokattu Harri Pitkäsen Voikko-versiosta.
Packit 1f3717
Packit 1f3717
combi_rule erisnimi ($vasen, $oikea, $sana):
Packit 1f3717
####define $profile := transmit ("erisnimi ($vasen, $oikea, $sana):");
Packit 1f3717
  ? $oikea.luokka in @erisnimi;
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
  if (omistusliite in $oikea.jatko) then
Packit 1f3717
    result $res, rules omistusliite;
Packit 1f3717
  end;
Packit 1f3717
  if (liitesana in $oikea.jatko) then
Packit 1f3717
    result $res, rules liitesana;
Packit 1f3717
  end;
Packit 1f3717
  if (tavuviiva in $oikea.jatko) then
Packit 1f3717
    result $res, rules tavuviiva;
Packit 1f3717
  end;
Packit 1f3717
  if (loppu in $oikea.jatko) then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  result $res, rules erisnimen_sijapääte;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
# Paikannimestä johdettu kansallisuuden nimi tai
Packit 1f3717
# sukunimestä johdettu aatteen kannattajan nimi.
Packit 1f3717
#
Packit 1f3717
combi_rule paikannimen_ja_sukunimen_lainen_johdos ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("paikannimen_ja_sukunimen_lainen_johdos ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka in <paikannimi, sukunimi>;
Packit 1f3717
#define $a := transmit ($vasen);
Packit 1f3717
#define $b := transmit ($oikea);
Packit 1f3717
#define $c := transmit ($sana);
Packit 1f3717
#define $d := transmit ($n);
Packit 1f3717
Packit 1f3717
  ? ($vasen.($n-1).jatko * <nimisana, nimi_laatusana, laatusana, etuliite> /= <>);
Packit 1f3717
  ? johdin_lAinen in $oikea.jatko;
Packit 1f3717
Packit 1f3717
  result $vasen + <[alku: $sana] + $oikea>, rules paikannimen_ja_sukunimen_lainen_johdin;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule paikannimen_lainen_johdos_paikannimen_omannon_jälkeen ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("paikannimen_lainen_johdin ($vasen, $oikea, $sana, $n):");
Packit 1f3717
Packit 1f3717
  ? ($oikea.luokka = paikannimi and johdin_lAinen in $oikea.jatko);
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $vasen.($n-1).äs; end;
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  result $res, rules paikannimen_ja_sukunimen_lainen_johdin;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule paikannimen_ja_sukunimen_lainen_johdin ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("paikannimen_ja_sukunimen_lainen_johdin ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? ($oikea.luokka = johdin_lAinen) or
Packit 1f3717
    (($oikea.luokka = johdin_mAinen) and ($vasen.($n-1).tiedot = nil or not (ei_mAinen in $vasen.($n-1).tiedot)));
Packit 1f3717
  ? äs_ok ($vasen.($n-1), $oikea);
Packit 1f3717
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $vasen.($n-1).äs; end;
Packit 1f3717
Packit 1f3717
#define $a := transmit ($vasen);
Packit 1f3717
#define $b := transmit ($oikea);
Packit 1f3717
#define $c := transmit ($sana);
Packit 1f3717
#define $d := transmit ($n);
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if (tavuviiva in $oikea.jatko) then
Packit 1f3717
    result $res, rules tavuviiva;
Packit 1f3717
  end;
Packit 1f3717
  if (yhdyssana in $oikea.jatko) then
Packit 1f3717
    result $res, rules yhdyssana;
Packit 1f3717
  end;
Packit 1f3717
  if omistusliite in $oikea.jatko then
Packit 1f3717
    result $res, rules omistusliite;
Packit 1f3717
  end;
Packit 1f3717
  if liitesana in $oikea.jatko then
Packit 1f3717
    result $res, rules liitesana;
Packit 1f3717
  end;
Packit 1f3717
  if (@laatusanasta_johdettu_nimisana * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules laatusanasta_johdettu_nimisana;
Packit 1f3717
  end;
Packit 1f3717
  if (loppu in$oikea.jatko) then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  if (<voittoaste, yliaste> * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules voitto_yliaste;
Packit 1f3717
  end;
Packit 1f3717
  result $res, rules sijapääte;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule erisnimen_sijapääte ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("erisnimen_sijapääte ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka = sijapääte;
Packit 1f3717
Packit 1f3717
#define $nimi := transmit (<$vasen> + <$oikea> + <$sana>);
Packit 1f3717
#define $a := transmit ($vasen);
Packit 1f3717
#define $b := transmit ($oikea);
Packit 1f3717
#define $c := transmit ($sana);
Packit 1f3717
#define $d := transmit ($n);
Packit 1f3717
#define $e := transmit ($vasen.($n-1).perusmuoto);
Packit 1f3717
#define $f := transmit ($vasen.($n-1).luokka);
Packit 1f3717
Packit 1f3717
  define $edellinen := $vasen.length ($vasen);
Packit 1f3717
Packit 1f3717
#define $e := transmit ($edellinen);
Packit 1f3717
Packit 1f3717
  ? $oikea.sija in $edellinen.jatko;
Packit 1f3717
  ? äs_ok ($vasen.($n-1), $oikea);
Packit 1f3717
Packit 1f3717
  ? ($oikea.sija /= sisätulento_Vn)  or sisätulento_Vn_oikein  ($oikea.sija, substring($edellinen.alku,1R), $sana);
Packit 1f3717
  ? ($oikea.sija /= sisätulento_hVn) or sisätulento_hVn_oikein ($oikea.sija, substring($edellinen.alku,1R), $sana);
Packit 1f3717
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $edellinen.äs; end;
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if ($oikea.sija = omanto_n) then
Packit 1f3717
    if omistusliite in $oikea.jatko then
Packit 1f3717
      result $res, rules omistusliite;
Packit 1f3717
    end;
Packit 1f3717
    if ($vasen.($n-1).luokka = paikannimi) then
Packit 1f3717
      result $res, rules paikannimen_lainen_johdos_paikannimen_omannon_jälkeen;
Packit 1f3717
    end;
Packit 1f3717
    result $res, rules yhdysmerkki_erisnimen_jälkeen, johdettu_erisnimi;
Packit 1f3717
  else
Packit 1f3717
    if omistusliite in $oikea.jatko then
Packit 1f3717
      result $res, rules omistusliite;
Packit 1f3717
    end;
Packit 1f3717
    if tavuviiva in $oikea.jatko then
Packit 1f3717
      result $res, rules yhdysmerkki_erisnimen_jälkeen;
Packit 1f3717
    end;
Packit 1f3717
  end;
Packit 1f3717
  if (loppu in $oikea.jatko) then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  result $res, rules liitesana;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule yhdysmerkki_erisnimen_jälkeen ($vasen, $oikea, $sana):
Packit 1f3717
####define $profile := transmit ("yhdysmerkki_erisnimen_jälkeen ($vasen, $oikea, $sana):");
Packit 1f3717
  ? $oikea.luokka = tavuviiva;
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
  result $res, rules yhdyssana, erisnimi;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule johdettu_erisnimi ($vasen, $oikea, $sana):
Packit 1f3717
####define $profile := transmit ("johdettu_erisnimi ($vasen, $oikea, $sana):");
Packit 1f3717
  ? ($oikea.paikannimen_jälkiliite = yes) or ($oikea.etunimen_jälkiliite = yes);
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
  if omistusliite in $oikea.jatko then
Packit 1f3717
    result $res, rules omistusliite;
Packit 1f3717
  end;
Packit 1f3717
  if loppu in $oikea.jatko then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  if liitesana in $oikea.jatko then
Packit 1f3717
    result $res, rules liitesana;
Packit 1f3717
  end;
Packit 1f3717
  if tavuviiva in $oikea.jatko then
Packit 1f3717
    result $res, rules yhdysmerkki_erisnimen_jälkeen;
Packit 1f3717
  end;
Packit 1f3717
#  result $res, rules erisnimen_sijapääte;
Packit 1f3717
  result $res, rules sijapääte;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
# inen-johdinta edeltävä nimisana.
Packit 1f3717
# Sääntö ei voi olla sanan alussa.
Packit 1f3717
#
Packit 1f3717
combi_rule inen_johdos_nimisanasta ($vasen, $oikea, $sana, $n):
Packit 1f3717
##define $profile := transmit ("inen_johdos_nimisanasta ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka in <nimisana, nimi_laatusana>;
Packit 1f3717
  ? johdin_inen in $oikea.jatko;
Packit 1f3717
  ? $oikea.tiedot = nil or
Packit 1f3717
    (not ei_ys in $oikea.tiedot and not ei_ysj in $oikea.tiedot);
Packit 1f3717
Packit 1f3717
#  define $a := transmit ($vasen);
Packit 1f3717
#  define $b := transmit ($oikea);
Packit 1f3717
#  define $c := transmit ($sana);
Packit 1f3717
#  define $d := transmit ($n);
Packit 1f3717
Packit 1f3717
  result $vasen + <[alku: $sana] + $oikea>, rules johdin_inen;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule johdin_inen ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("johdin_inen ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka = johdin_inen;
Packit 1f3717
Packit 1f3717
#  define $ö := transmit ("AAAAAAAAAAAAAAA");
Packit 1f3717
#  define $a := transmit ($vasen);
Packit 1f3717
#  define $b := transmit ($oikea.jatko);
Packit 1f3717
#  define $c := transmit ($sana);
Packit 1f3717
#  define $d := transmit ($n);
Packit 1f3717
#  define $x := transmit ("BBBBBBBBBBBBBBB");
Packit 1f3717
Packit 1f3717
  define $i := $n - 1;
Packit 1f3717
  ? äs_ok ($vasen.$i, $oikea);
Packit 1f3717
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $vasen.$i.äs; end;
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if tavuviiva in $oikea.jatko then
Packit 1f3717
    result $res, rules tavuviiva;
Packit 1f3717
  end;
Packit 1f3717
#  if (yhdyssana in $oikea.jatko) then
Packit 1f3717
#    result $res, rules yhdyssana;
Packit 1f3717
#  end;
Packit 1f3717
  if omistusliite in $oikea.jatko then
Packit 1f3717
    result $res, rules omistusliite;
Packit 1f3717
  end;
Packit 1f3717
  if loppu in $oikea.jatko then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  if liitesana in $oikea.jatko then
Packit 1f3717
    result $res, rules liitesana;
Packit 1f3717
  end;
Packit 1f3717
  if (@laatusanasta_johdettu_nimisana * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules laatusanasta_johdettu_nimisana;
Packit 1f3717
  end;
Packit 1f3717
#  if (@laatusanasta_johdettu_laatusana * $oikea.jatko /= <>) then
Packit 1f3717
#    result $res, rules laatusanasta_johdettu_laatusana;
Packit 1f3717
#  end;
Packit 1f3717
  if ((voittoaste in $oikea.jatko) or (yliaste in $oikea.jatko)) then
Packit 1f3717
    result $res, rules voitto_yliaste;
Packit 1f3717
  end;
Packit 1f3717
  result $res, rules sijapääte;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
subrule äs_ok ($edellinen, $oikea):
Packit 1f3717
#define $a := transmit (<"äs_ok"> + <$edellinen.äs> + <$oikea.äs>);
Packit 1f3717
#define $b := transmit (<"äs_ok"> + <$edellinen>);
Packit 1f3717
#define $c := transmit (<"äs_ok"> + <$oikea>);
Packit 1f3717
Packit 1f3717
  return ($oikea.äs = aä or $edellinen.äs = aä or $oikea.äs = $edellinen.äs);
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule nimi_laatusanan_johdin ($vasen, $oikea, $sana, $n):
Packit 1f3717
####define $profile := transmit ("nimi_laatusanan_johdin ($vasen, $oikea, $sana, $n):");
Packit 1f3717
  ? $oikea.luokka in @nimi_laatusanan_johdin;
Packit 1f3717
  ? $oikea.luokka in $vasen.($n-1).jatko;
Packit 1f3717
  ? äs_ok ($vasen.($n-1), $oikea);
Packit 1f3717
Packit 1f3717
#define $xb := transmit ($oikea.luokka);
Packit 1f3717
#define $xa := transmit ($vasen);
Packit 1f3717
#define $yb := transmit ($oikea);
Packit 1f3717
#define $yc := transmit ($sana);
Packit 1f3717
#define $yd := transmit ($n);
Packit 1f3717
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $vasen.($n-1).äs; end;
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if (tavuviiva in $oikea.jatko) then
Packit 1f3717
    result $res, rules tavuviiva;
Packit 1f3717
  end;
Packit 1f3717
  if (yhdyssana in $oikea.jatko) then
Packit 1f3717
    result $res, rules yhdyssana;
Packit 1f3717
  end;
Packit 1f3717
  if (@laatusanasta_johdettu_nimisana * $oikea.jatko /= <>) then
Packit 1f3717
    result $res, rules laatusanasta_johdettu_nimisana;
Packit 1f3717
  end;
Packit 1f3717
#  if (@laatusanasta_johdettu_laatusana * $oikea.jatko /= <>) then
Packit 1f3717
#    result $res, rules laatusanasta_johdettu_laatusana;
Packit 1f3717
#  end;
Packit 1f3717
  if (loppu in $oikea.jatko) then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  if (omistusliite in $oikea.jatko) then
Packit 1f3717
    result $res, rules omistusliite;
Packit 1f3717
  end;
Packit 1f3717
  if (liitesana in $oikea.jatko) then
Packit 1f3717
    result $res, rules liitesana;
Packit 1f3717
  end;
Packit 1f3717
  if ((voittoaste in $oikea.jatko) or (yliaste in $oikea.jatko)) then
Packit 1f3717
    result $res, rules voitto_yliaste;
Packit 1f3717
  end;
Packit 1f3717
  result $res, rules sijapääte;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
##########################################
Packit 1f3717
Packit 1f3717
# Lukusanojen käsittely on muokattu Harri Pitkäsen Voikko-versiosta.
Packit 1f3717
Packit 1f3717
combi_rule lukusana ($vasen, $oikea, $sana, $index):
Packit 1f3717
#define $profile := transmit ("lukusana ($vasen, $oikea, $sana, $index):");
Packit 1f3717
  ? $oikea.luokka = lukusana;
Packit 1f3717
  define $sijamuoto := nil;
Packit 1f3717
  define $luku := nil;
Packit 1f3717
Packit 1f3717
#define $a1 := transmit ($vasen);
Packit 1f3717
#define $a2 := transmit ($oikea);
Packit 1f3717
#define $a3 := transmit ($sana);
Packit 1f3717
#define $a4 := transmit ($index);
Packit 1f3717
Packit 1f3717
  if ($oikea.alaluokka = erikoisluku) then
Packit 1f3717
    define $erikoisres := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
    if (loppu in $oikea.jatko) then
Packit 1f3717
      result $erikoisres, accept;
Packit 1f3717
    end;
Packit 1f3717
    if (liitesana in $oikea.jatko) then
Packit 1f3717
      result $erikoisres, rules liitesana;
Packit 1f3717
    end;
Packit 1f3717
    if (lukusanan_jälkiliite in $oikea.jatko) then
Packit 1f3717
      result $erikoisres, rules lukusanan_jälkiliite;
Packit 1f3717
    end;
Packit 1f3717
     result $erikoisres, rules yhdyssana, tavuviiva;
Packit 1f3717
    stop;
Packit 1f3717
  end;
Packit 1f3717
Packit 1f3717
  if ($index = 1) then
Packit 1f3717
    if ($oikea.alaluokka = toista) then
Packit 1f3717
      stop;   # "Toistamaan" ei ole toista+maa+n.
Packit 1f3717
    end;
Packit 1f3717
  else
Packit 1f3717
#  if ($index greater 1) then
Packit 1f3717
    define $edellinen := $vasen.($index - 1);
Packit 1f3717
    ? $edellinen.lukutyyppi = nil or $edellinen.lukutyyppi = $oikea.lukutyyppi;
Packit 1f3717
    $sijamuoto := $edellinen.sijamuoto;
Packit 1f3717
    $luku := $edellinen.luku;
Packit 1f3717
    # Estetään peräkkäiset "satasata", "tuhattuhat" jne.
Packit 1f3717
    if ($edellinen.luokka = lukusana) then
Packit 1f3717
      ? not ($oikea.alaluokka = $edellinen.alaluokka);
Packit 1f3717
    end;
Packit 1f3717
  end;
Packit 1f3717
  define $res := $vasen + <[alku: $sana, sijamuoto: $sijamuoto, luku: $luku] + $oikea>;
Packit 1f3717
Packit 1f3717
  if ($oikea.alaluokka = yksiyhdeksän) then
Packit 1f3717
    if (nimentö in $oikea.jatko) then
Packit 1f3717
      if loppu in $oikea.jatko then
Packit 1f3717
        result $res, accept;
Packit 1f3717
      end;
Packit 1f3717
      result $res, rules lukusana_toista, lukusana_sisäkerroin,
Packit 1f3717
                         liitesana; ##, lukusanan_jälkiliite;
Packit 1f3717
#, yhdyssana;
Packit 1f3717
##                   nimisana, laatusana;
Packit 1f3717
##                   nimisana, inen_johdos_nimisanasta, inen_päätteinen_laatusana;
Packit 1f3717
    end;
Packit 1f3717
    if (omistusliite in $oikea.jatko) then
Packit 1f3717
      result $res, rules omistusliite;
Packit 1f3717
    end;
Packit 1f3717
  elseif ($oikea.alaluokka in <kymmenen, sata>) then
Packit 1f3717
    if (nimentö in $oikea.jatko) then
Packit 1f3717
      if omistusliite in $oikea.jatko then
Packit 1f3717
        result $res, rules omistusliite;
Packit 1f3717
      end;
Packit 1f3717
      if loppu in $oikea.jatko then
Packit 1f3717
        result $res, accept;
Packit 1f3717
      end;
Packit 1f3717
      result $res, rules lukusana_sisäkerroin,
Packit 1f3717
                         liitesana, lukusanan_jälkiliite;
Packit 1f3717
##                   nimisana, laatusana;
Packit 1f3717
##                   nimisana, inen_johdos_nimisanasta, inen_päätteinen_laatusana;
Packit 1f3717
    end;
Packit 1f3717
  elseif ($oikea.alaluokka in <tuhat, miljoona> and nimentö in $oikea.jatko) then
Packit 1f3717
    if omistusliite in $oikea.jatko then
Packit 1f3717
      result $res, rules omistusliite;
Packit 1f3717
    end;
Packit 1f3717
    if loppu in $oikea.jatko then
Packit 1f3717
      result $res, accept;
Packit 1f3717
    end;
Packit 1f3717
    result $res, rules liitesana, lukusanan_jälkiliite;
Packit 1f3717
##                       yhdyssana;
Packit 1f3717
##                 nimisana, laatusana;
Packit 1f3717
##                 nimisana, inen_johdos_nimisanasta, inen_päätteinen_laatusana;
Packit 1f3717
  elseif ($oikea.alaluokka = numeromerkki) then
Packit 1f3717
    $res := $vasen + <[alku: $sana, pilkku: no, rakenne: "=q"] + $oikea>;
Packit 1f3717
    if (loppu in $oikea.jatko) then
Packit 1f3717
      result $res, accept;
Packit 1f3717
    end;
Packit 1f3717
   result $res, rules lukusana_numero; ##, yhdysmerkki_numeron_jälkeen;
Packit 1f3717
  end;
Packit 1f3717
  if ($oikea.alaluokka in <sata, tuhat>) then
Packit 1f3717
    if (nimentö in $oikea.jatko) then
Packit 1f3717
      result $res, rules lukusana;
Packit 1f3717
    end;
Packit 1f3717
  end;
Packit 1f3717
  if (tavuviiva in $oikea.jatko) then
Packit 1f3717
    result $res, rules tavuviiva;
Packit 1f3717
  end;
Packit 1f3717
#  result $res, rules lukusana_sijapääte;
Packit 1f3717
  result $res, rules yhdyssana, lukusana_sijapääte;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule lukusana_sijapääte ($vasen, $oikea, $sana, $index):
Packit 1f3717
####define $profile := transmit ("lukusana_sijapääte ($vasen, $oikea, $sana, $index):");
Packit 1f3717
  ? $oikea.luokka = sijapääte;
Packit 1f3717
  define $edellinen := $vasen.($index - 1);
Packit 1f3717
  ? $oikea.sija in $edellinen.jatko;
Packit 1f3717
  ? äs_ok($edellinen, $oikea);
Packit 1f3717
  ? ($oikea.sija /= sisätulento_Vn)  or sisätulento_Vn_oikein  ($oikea.sija, substring($edellinen.alku,1R), $sana);
Packit 1f3717
  ? ($oikea.sija /= sisätulento_hVn) or sisätulento_hVn_oikein ($oikea.sija, substring($edellinen.alku,1R), $sana);
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $edellinen.äs; end;
Packit 1f3717
Packit 1f3717
  define $sijamuoto := sijamuoto_sijasta($oikea.sija);
Packit 1f3717
  ? $edellinen.sijamuoto = nil or $edellinen.sijamuoto = $sijamuoto;
Packit 1f3717
  ? $edellinen.luku = nil or $edellinen.luku = $oikea.luku;
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana, sijamuoto: $sijamuoto, lukutyyppi: $edellinen.lukutyyppi] + $oikea>;
Packit 1f3717
  if ($edellinen.alaluokka = yksiyhdeksän) then
Packit 1f3717
    if omistusliite in $oikea.jatko then
Packit 1f3717
      result $res, rules omistusliite;
Packit 1f3717
    end;
Packit 1f3717
    result $res, rules lukusana_toista, lukusana_sisäkerroin,
Packit 1f3717
##                       yhdyssana;
Packit 1f3717
                 lukusanan_jälkiliite;
Packit 1f3717
##                 nimisana, laatusana;
Packit 1f3717
##                 nimisana, inen_johdos_nimisanasta, inen_päätteinen_laatusana;
Packit 1f3717
  elseif ($edellinen.alaluokka in <kymmenen, sata>) then
Packit 1f3717
    if omistusliite in $oikea.jatko then
Packit 1f3717
      result $res, rules omistusliite;
Packit 1f3717
    end;
Packit 1f3717
    result $res, rules lukusana_sisäkerroin, lukusanan_jälkiliite;
Packit 1f3717
  else
Packit 1f3717
    result $res, rules lukusanan_jälkiliite;
Packit 1f3717
##    result $res, rules yhdyssana;
Packit 1f3717
                       ## , nimisana, lukusanan_jälkiliite, laatusana;
Packit 1f3717
                       ##, inen_johdos_nimisanasta, inen_päätteinen_laatusana;
Packit 1f3717
  end;
Packit 1f3717
  if loppu in $oikea.jatko then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  if ($edellinen.alaluokka in <sata, tuhat>) then
Packit 1f3717
    result $res, rules lukusana;
Packit 1f3717
  end;
Packit 1f3717
  if liitesana in $oikea.jatko then
Packit 1f3717
    result $res, rules liitesana;
Packit 1f3717
  end;
Packit 1f3717
  if tavuviiva in $oikea.jatko then
Packit 1f3717
    result $res, rules tavuviiva;
Packit 1f3717
  end;
Packit 1f3717
  if yhdyssana in $oikea.jatko then
Packit 1f3717
    result $res, rules yhdyssana;
Packit 1f3717
  end;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule lukusana_sisäkerroin ($vasen, $oikea, $sana, $index):
Packit 1f3717
####define $profile := transmit ("lukusana_sisäkerroin ($vasen, $oikea, $sana, $index):");
Packit 1f3717
  ? $oikea.luokka = lukusana;
Packit 1f3717
  ? $oikea.alaluokka in <kymmenen, sata, tuhat, miljoona>;
Packit 1f3717
Packit 1f3717
  define $edellinen := $vasen.($index - 1);
Packit 1f3717
  ? $edellinen.lukutyyppi = $oikea.lukutyyppi;
Packit 1f3717
  define $res := $vasen + <[alku: $sana, sijamuoto: $edellinen.sijamuoto, luku: $edellinen.luku] + $oikea>;
Packit 1f3717
Packit 1f3717
  if ($edellinen.sijamuoto in <nil, nimentö>) then
Packit 1f3717
    result $res, rules lukusana_sisäkerroin_osanto;
Packit 1f3717
  else
Packit 1f3717
    result $res, rules lukusana_sisäkerroin_sijapääte;
Packit 1f3717
  end;
Packit 1f3717
  
Packit 1f3717
  if ($oikea.lukutyyppi = järjestysluku) then
Packit 1f3717
    result $res, rules lukusana;
Packit 1f3717
  end;
Packit 1f3717
  
Packit 1f3717
  if ($oikea.lukutyyppi = järjestysluku and loppu in $oikea.jatko) then
Packit 1f3717
    if omistusliite in $oikea.jatko then
Packit 1f3717
      result $res, rules omistusliite;
Packit 1f3717
    end;
Packit 1f3717
    if loppu in $oikea.jatko then
Packit 1f3717
      result $res, accept;
Packit 1f3717
    end;
Packit 1f3717
    result $res, rules liitesana;
Packit 1f3717
  end;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule lukusana_sisäkerroin_sijapääte ($vasen, $oikea, $sana, $index):
Packit 1f3717
####define $profile := transmit ("lukusana_sisäkerroin_sijapääte ($vasen, $oikea, $sana, $index):");
Packit 1f3717
  ? $oikea.luokka = sijapääte;
Packit 1f3717
  define $edellinen := $vasen.($index - 1);
Packit 1f3717
  ? $oikea.sija in $edellinen.jatko;
Packit 1f3717
  ? äs_ok($edellinen, $oikea);
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $edellinen.äs; end;
Packit 1f3717
Packit 1f3717
  define $sijamuoto := sijamuoto_sijasta($oikea.sija);
Packit 1f3717
  ? $edellinen.sijamuoto = nil or $edellinen.sijamuoto = $sijamuoto;
Packit 1f3717
  ? $edellinen.luku = nil or $edellinen.luku = $oikea.luku;
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana, sijamuoto: $sijamuoto, lukutyyppi: $edellinen.lukutyyppi] + $oikea>;
Packit 1f3717
  if omistusliite in $oikea.jatko then
Packit 1f3717
    result $res, rules omistusliite;
Packit 1f3717
  end;
Packit 1f3717
  if loppu in $oikea.jatko then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  result $res, rules lukusana,
Packit 1f3717
                     liitesana, lukusanan_jälkiliite;
Packit 1f3717
##               nimisana, laatusana;
Packit 1f3717
##               nimisana, inen_johdos_nimisanasta, inen_päätteinen_laatusana;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
combi_rule lukusana_sisäkerroin_osanto ($vasen, $oikea, $sana, $index):
Packit 1f3717
####define $profile := transmit ("lukusana_sisäkerroin_osanto ($vasen, $oikea, $sana, $index):");
Packit 1f3717
  ? $oikea.luokka = sijapääte;
Packit 1f3717
  define $edellinen := $vasen.($index - 1);
Packit 1f3717
  ? $oikea.sija in $edellinen.jatko;
Packit 1f3717
  ? sijamuoto_sijasta($oikea.sija) = osanto;
Packit 1f3717
  ? äs_ok($edellinen, $oikea);
Packit 1f3717
  if $oikea.äs = aä then $oikea.äs := $edellinen.äs; end;
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana, lukutyyppi: $edellinen.lukutyyppi] + $oikea>;
Packit 1f3717
  if omistusliite in $oikea.jatko then
Packit 1f3717
    result $res, rules omistusliite;
Packit 1f3717
  end;
Packit 1f3717
  if loppu in $oikea.jatko then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  result $res, rules lukusana, lukusanan_jälkiliite,
Packit 1f3717
                     liitesana;
Packit 1f3717
##, yhdyssana;
Packit 1f3717
##               nimisana, laatusana; ##, inen_johdos_nimisanasta, inen_päätteinen_laatusana;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
combi_rule lukusana_toista ($vasen, $oikea, $sana, $index):
Packit 1f3717
####define $profile := transmit ("lukusana_toista ($vasen, $oikea, $sana, $index):");
Packit 1f3717
  ? $oikea.luokka = lukusana;
Packit 1f3717
  ? $oikea.alaluokka = toista;
Packit 1f3717
  define $edellinen := $vasen.($index - 1);
Packit 1f3717
  define $res := $vasen + <[alku: $sana, sijamuoto: $edellinen.sijamuoto,
Packit 1f3717
                            luku: $edellinen.luku, lukutyyppi: $edellinen.lukutyyppi] + $oikea>;
Packit 1f3717
  if loppu in $oikea.jatko then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  end;
Packit 1f3717
  if liitesana in $oikea.jatko then
Packit 1f3717
    result $res, rules liitesana;
Packit 1f3717
  end;
Packit 1f3717
  result $res, rules lukusana_sisäkerroin,
Packit 1f3717
##                     lukusanan_jälkiliite,
Packit 1f3717
##                     inen_johdos_nimisanasta,
Packit 1f3717
##                     inen_päätteinen_laatusana,
Packit 1f3717
                     yhdyssana,
Packit 1f3717
                     tavuviiva;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule lukusanan_jälkiliite ($vasen, $oikea, $sana, $index):
Packit 1f3717
####define $profile := transmit ("lukusanan_jälkiliite ($vasen, $oikea, $sana, $index):");
Packit 1f3717
#  define $a := transmit ($vasen);
Packit 1f3717
#  define $b := transmit ($oikea);
Packit 1f3717
#  define $c := transmit ($sana);
Packit 1f3717
#  define $d := transmit ($index);
Packit 1f3717
Packit 1f3717
  ? $oikea.luokka in <lukusanan_jälkiliite, tavuviiva>;
Packit 1f3717
#  ? $oikea.luokka in <nimisana, laatusana, nimi_laatusana, tavuviiva>;
Packit 1f3717
  # FIXME: yhdysviivan käyttöä ei vielä tueta lukusanan ja sen jälkiliitteen välissä
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
  if $oikea.luokka = tavuviiva then
Packit 1f3717
    result $res, accept;
Packit 1f3717
  else
Packit 1f3717
    define $edellinen := $vasen.($index - 1);
Packit 1f3717
    ? $edellinen.lukutyyppi = nil or $edellinen.lukutyyppi = $oikea.lukutyyppi;
Packit 1f3717
    if omistusliite in $oikea.jatko then
Packit 1f3717
      result $res, rules omistusliite;
Packit 1f3717
    end;
Packit 1f3717
    if tavuviiva in $oikea.jatko then
Packit 1f3717
      result $res, rules tavuviiva;
Packit 1f3717
    end;
Packit 1f3717
    if loppu in $oikea.jatko then
Packit 1f3717
      result $res, accept;
Packit 1f3717
    end;
Packit 1f3717
    result $res,
Packit 1f3717
           rules ## ei_ys_sijapääte,
Packit 1f3717
                 yhdyssana,
Packit 1f3717
                 sijapääte,
Packit 1f3717
                 liitesana;
Packit 1f3717
  end;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
combi_rule lukusana_numero ($vasen, $oikea, $sana, $index):
Packit 1f3717
####define $profile := transmit ("lukusana_numero ($vasen, $oikea, $sana, $index):");
Packit 1f3717
  ? $oikea.luokka = lukusana;
Packit 1f3717
Packit 1f3717
  define $edellinen := $vasen.($index - 1);
Packit 1f3717
  $oikea :=+ [pilkku: $edellinen.pilkku];
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if $oikea.alaluokka = numeromerkki then
Packit 1f3717
    result $res, rules lukusana_numero; ##, yhdysmerkki_numeron_jälkeen;
Packit 1f3717
    result $res, accept;
Packit 1f3717
  elseif $oikea.alaluokka = pilkku and $oikea.pilkku /= yes then
Packit 1f3717
    $oikea :=+ [pilkku: yes];
Packit 1f3717
    result $vasen + <[alku: $sana] + $oikea>, rules lukusana_numero;
Packit 1f3717
  end;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
# Aputaulukko funktiolle sijamuoto_sijasta
Packit 1f3717
define @sijamuoto_sijasta_muunnostaulu :=
Packit 1f3717
[nimentö:     nimentö,
Packit 1f3717
 nimentö_t:   nimentö,
Packit 1f3717
 nimentö_tkA: nimentö,
Packit 1f3717
 omanto_n:    omanto,
Packit 1f3717
 omanto_nkA:  omanto,
Packit 1f3717
 omanto_ien:  omanto,
Packit 1f3717
 omanto_jen:  omanto,
Packit 1f3717
 omanto_en:   omanto,
Packit 1f3717
 omanto_in:   omanto,
Packit 1f3717
 omanto_ten:  omanto,
Packit 1f3717
 omanto_iT:   omanto,
Packit 1f3717
 omanto_idän: omanto,
Packit 1f3717
 kohdanto_idät: kohdanto,
Packit 1f3717
 kohdanto_t: kohdanto,
Packit 1f3717
 osanto_A:    osanto,
Packit 1f3717
 osanto_AA:   osanto,
Packit 1f3717
 osanto_iA:   osanto,
Packit 1f3717
 osanto_jA:   osanto,
Packit 1f3717
 osanto_ttA:  osanto,
Packit 1f3717
 osanto_itA:  osanto,
Packit 1f3717
 osanto_tA:   osanto,
Packit 1f3717
 olento_nA:   olento,
Packit 1f3717
 olento_inA:  olento,
Packit 1f3717
 tulento_ksi: tulento,
Packit 1f3717
 tulento_iksi: tulento,
Packit 1f3717
 sisäolento_ssA: sisäolento,
Packit 1f3717
 sisäolento_issA: sisäolento,
Packit 1f3717
 sisäolento_nA: sisäolento,
Packit 1f3717
 sisäeronto_stA: sisäeronto,
Packit 1f3717
 sisäeronto_istA: sisäeronto,
Packit 1f3717
 sisäeronto_tA: sisäeronto,
Packit 1f3717
 sisätulento_Vn: sisätulento,
Packit 1f3717
 sisätulento_VVn: sisätulento,
Packit 1f3717
 sisätulento_hVn: sisätulento,
Packit 1f3717
 sisätulento_iin: sisätulento,
Packit 1f3717
 sisätulento_ihin: sisätulento,
Packit 1f3717
 sisätulento_seen: sisätulento,
Packit 1f3717
 sisätulento_isiin: sisätulento,
Packit 1f3717
 sisätulento_sen: sisätulento,
Packit 1f3717
 sisätulento_isin: sisätulento,
Packit 1f3717
 sisätulento_nne: sisätulento,
Packit 1f3717
 ulko_olento_llA: ulko_olento,
Packit 1f3717
 ulko_olento_illA: ulko_olento,
Packit 1f3717
 ulkoeronto_ltA: ulkoeronto,
Packit 1f3717
 ulkoeronto_iltA: ulkoeronto,
Packit 1f3717
 ulkotulento_lle: ulkotulento,
Packit 1f3717
 ulkotulento_ille: ulkotulento,
Packit 1f3717
 vajanto_ttA: vajanto,
Packit 1f3717
 vajanto_ittA: vajanto,
Packit 1f3717
 seuranto_ine: seuranto,
Packit 1f3717
 keinonto_n: keinonto,
Packit 1f3717
 keinonto_in: keinonto,
Packit 1f3717
 tulento_s: tulento
Packit 1f3717
];
Packit 1f3717
Packit 1f3717
Packit 1f3717
# Palauttaa annettua sijasymbolia vastaavan sijamuodon
Packit 1f3717
subrule sijamuoto_sijasta($sija):
Packit 1f3717
  return @sijamuoto_sijasta_muunnostaulu.$sija;
Packit 1f3717
end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
#robust_rule robust ($surface, $remain_input):
Packit 1f3717
#  define $a := transmit (<"a"> + <$surface>);
Packit 1f3717
#  define $b := transmit (<"b"> + <$remain_input>);
Packit 1f3717
#end;
Packit 1f3717
Packit 1f3717
Packit 1f3717
combi_rule yhdyssana ($vasen, $oikea, $sana, $n):
Packit 1f3717
#define $profile := transmit ("yhdyssana ($vasen, $oikea, $sana, $n):");
Packit 1f3717
Packit 1f3717
#  ? $oikea.luokka /= lukusana;
Packit 1f3717
#if ($oikea.luokka = lukusana) then
Packit 1f3717
#define $a := transmit (($vasen.1).alku);
Packit 1f3717
#define $b := transmit ($oikea.luokka);
Packit 1f3717
#define $c := transmit (<$sana> + <"§">);
Packit 1f3717
#end;
Packit 1f3717
Packit 1f3717
  define $i := $n - 1;
Packit 1f3717
Packit 1f3717
##assert ($n-1 = length($vasen));
Packit 1f3717
Packit 1f3717
#define $aa := transmit (<"Huu"> + <$vasen.$i> + <$sana> + <$oikea>);
Packit 1f3717
Packit 1f3717
  if ($oikea.luokka = seikkasana and $oikea.tiedot /= nil and
Packit 1f3717
      ys_perusosa in $oikea.tiedot and $vasen /= <>) then
Packit 1f3717
    define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
    if (loppu in $oikea.jatko) then
Packit 1f3717
      result $res, accept;
Packit 1f3717
    end;
Packit 1f3717
    if (liitesana in $oikea.jatko) then
Packit 1f3717
       result $res, rules liitesana;
Packit 1f3717
    end;
Packit 1f3717
    if (omistusliite in $oikea.jatko) then
Packit 1f3717
      result $res, rules omistusliite;
Packit 1f3717
    end;
Packit 1f3717
    result $res, rules ei_ys_sijapääte;
Packit 1f3717
  end;
Packit 1f3717
Packit 1f3717
  ? ($oikea.luokka in $vasen.$i.jatko) or
Packit 1f3717
    (yhdyssana in $vasen.$i.jatko) or
Packit 1f3717
    ($oikea.luokka in <paikannimi, sukunimi, teonsana>);
Packit 1f3717
Packit 1f3717
Packit 1f3717
  if ((($vasen.$i.tiedot /= nil) and ((ei_ys in $vasen.$i.tiedot) or (ei_ysa in $vasen.$i.tiedot))) or
Packit 1f3717
      (($oikea.tiedot    /= nil) and ((ei_ys in $oikea.tiedot)))) then
Packit 1f3717
#define $d := transmit (<"yhdyssana_oikein-d">);
Packit 1f3717
    stop;
Packit 1f3717
  end;
Packit 1f3717
  if (($vasen.$i.luokka /= tavuviiva) and ($oikea.tiedot /= nil) and (ei_ysj in $oikea.tiedot)) then
Packit 1f3717
    stop;
Packit 1f3717
  end;
Packit 1f3717
  if (($vasen.$i.perusmuoto /= nil) and ($oikea.perusmuoto /= nil)) then
Packit 1f3717
    define $s := $vasen.$i.perusmuoto;
Packit 1f3717
#define $iii := transmit($vasen.$i.alku);
Packit 1f3717
    if (length($vasen.$i.alku) greater length($vasen.$i.perusmuoto)) then
Packit 1f3717
      $s := $vasen.$i.alku;
Packit 1f3717
    end;
Packit 1f3717
    define $s1 := substring($s,1R);
Packit 1f3717
    define $s2 := substring($oikea.perusmuoto,1);
Packit 1f3717
    if (($s1 = $s2) and ($s1 matches @ääntiö) and ($s2 matches @ääntiö)) then
Packit 1f3717
      stop;
Packit 1f3717
    end;
Packit 1f3717
  end;
Packit 1f3717
##  ? yhdyssana_oikein ($vasen, $oikea, $i);
Packit 1f3717
Packit 1f3717
  define $res := $vasen + <[alku: $sana] + $oikea>;
Packit 1f3717
Packit 1f3717
  if ($oikea.luokka in <nimisana, laatusana, nimi_laatusana>) then
Packit 1f3717
Packit 1f3717
#define $a := transmit ($vasen);
Packit 1f3717
    if (tavuviiva in $oikea.jatko) then
Packit 1f3717
      result $res, rules tavuviiva;
Packit 1f3717
    end;
Packit 1f3717
    if (yhdyssana in $oikea.jatko) then
Packit 1f3717
      result $res, rules yhdyssana;
Packit 1f3717
    end;
Packit 1f3717
Packit 1f3717
    if ($vasen.$i.luokka = tavuviiva) or
Packit 1f3717
######       ($oikea.tiedot = nil or not (ei_ysj in $oikea.tiedot)) then
Packit 1f3717
       ($oikea.tiedot = nil or (not ((ei_ys in $oikea.tiedot) or (ei_ysj in $oikea.tiedot)))) then
Packit 1f3717
#define $a := transmit ($oikea);
Packit 1f3717
#define $b := transmit ($oikea.tiedot);
Packit 1f3717
      if (omistusliite in $oikea.jatko) then
Packit 1f3717
        result $res, rules omistusliite;
Packit 1f3717
      end;
Packit 1f3717
      if (liitesana in $oikea.jatko) then
Packit 1f3717
        result $res, rules liitesana;
Packit 1f3717
      end;
Packit 1f3717
      if (loppu in $oikea.jatko) then
Packit 1f3717
        result $res, accept;
Packit 1f3717
      end;
Packit 1f3717
      result $res, rules sijapääte;
Packit 1f3717
    end;
Packit 1f3717
Packit 1f3717
    if ($oikea.luokka = nimisana) then
Packit 1f3717
      if (@nimisanasta_johdettu_laatusana * $oikea.jatko /= <>) then
Packit 1f3717
        result $res, rules nimisanasta_johdettu_laatusana;
Packit 1f3717
      end;
Packit 1f3717
      if (@nimisanasta_johdettu_seikkasana * $oikea.jatko /= <>) then
Packit 1f3717
        result $res, rules nimisanasta_johdettu_seikkasana;
Packit 1f3717
      end;
Packit 1f3717
      if (@nimi_laatusanan_johdin * $oikea.jatko /= <>) then
Packit 1f3717
        result $res, rules nimi_laatusanan_johdin;
Packit 1f3717
      end;
Packit 1f3717
Packit 1f3717
    elseif ($oikea.luokka = laatusana) then
Packit 1f3717
      if (@nimi_laatusanan_johdin * $oikea.jatko /= <>) then
Packit 1f3717
        result $res, rules nimi_laatusanan_johdin;
Packit 1f3717
      end;
Packit 1f3717
      if (@voittoaste + @yliaste * $oikea.jatko /= <>) then
Packit 1f3717
        result $res, rules voitto_yliaste;
Packit 1f3717
      end;
Packit 1f3717
      if (@laatusanasta_johdettu_nimisana * $oikea.jatko /= <>) then
Packit 1f3717
        result $res, rules laatusanasta_johdettu_nimisana;
Packit 1f3717
      end;
Packit 1f3717
Packit 1f3717
    elseif ($oikea.luokka = nimi_laatusana) then
Packit 1f3717
      if ((voittoaste in $oikea.jatko) or (yliaste in $oikea.jatko)) then
Packit 1f3717
        result $res, rules voitto_yliaste;
Packit 1f3717
      end;
Packit 1f3717
      if (@laatusanasta_johdettu_nimisana * $oikea.jatko /= <>) then
Packit 1f3717
        result $res, rules laatusanasta_johdettu_nimisana;
Packit 1f3717
      end;
Packit 1f3717
      if (@nimisanasta_johdettu_seikkasana * $oikea.jatko /= <>) then
Packit 1f3717
        result $res, rules nimisanasta_johdettu_seikkasana;
Packit 1f3717
      end;
Packit 1f3717
      if (@nimi_laatusanan_johdin * $oikea.jatko /= <>) then
Packit 1f3717
        result $res, rules nimi_laatusanan_johdin;
Packit 1f3717
      end;
Packit 1f3717
      if (@nimisanasta_johdettu_laatusana * $oikea.jatko /= <>) then
Packit 1f3717
        result $res, rules nimisanasta_johdettu_laatusana;
Packit 1f3717
      end;
Packit 1f3717
    end;
Packit 1f3717
Packit 1f3717
  elseif ($oikea.luokka = teonsana) then
Packit 1f3717
    ? $vasen.$i.jatko * <yhdyssana, nimisana, laatusana, nimi_laatusana, etuliite> /= <>;
Packit 1f3717
    if ($oikea.jatko * @teonsanasta_johdettu_nimisana /= <>) then
Packit 1f3717
      result $res, rules teonsanan_johdos_nimisana;
Packit 1f3717
    end;
Packit 1f3717
    if ($oikea.jatko * @teonsanasta_johdettu_laatusana /= <>) then
Packit 1f3717
      result $res, rules teonsanan_johdos_laatusana;
Packit 1f3717
    end;
Packit 1f3717
    if ($oikea.jatko * @teonsanasta_johdettu_teonsana /= <>) then
Packit 1f3717
      result $res, rules teonsanan_johdos_teonsana_nimisana,
Packit 1f3717
                         teonsanan_johdos_teonsana_laatusana;
Packit 1f3717
    end;
Packit 1f3717
Packit 1f3717
  elseif ($oikea.luokka = etuliite) then
Packit 1f3717
    ? ($vasen.$i.luokka = tavuviiva) or
Packit 1f3717
      (($oikea.tiedot = nil) or not ((ei_ys in $oikea.tiedot) or (ei_ysj in $oikea.tiedot)));
Packit 1f3717
    ? (<nimisana, nimi_laatusana, laatusana> * $oikea.jatko /= <>);
Packit 1f3717
    result $res, rules yhdyssana, tavuviiva;
Packit 1f3717
Packit 1f3717
  elseif ($oikea.luokka in <paikannimi, sukunimi>) then
Packit 1f3717
    ? johdin_lAinen in $oikea.jatko;
Packit 1f3717
    result $res, rules paikannimen_ja_sukunimen_lainen_johdin;
Packit 1f3717
  end;
Packit 1f3717
end;