Advertisement
Guest User

Untitled

a guest
Feb 7th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 6 4.44 KB | None | 0 0
  1. my @Characters::Hiragana = ("\x3040".."\x309F").list;
  2. my @Characters::Katakana = ("\x30A0".."\x30FF").list;
  3. my %Characters::Table = {
  4.     # Needed to correct what appears to be a bug with the Z operator
  5.     my %h = @(@Characters::Hiragana) Z=> @(@Characters::Katakana);
  6.     %h , |%h.antipairs};
  7.  
  8. my %kana_table = {
  9.     'あ'=><あ か さ た な は ま や ら わ が ざ だ ば ぱ>,
  10.     'い'=>(|<い き し ち に ひ み>,Nil,|<り ゐ ぎ じ ぢ び ぴ>),
  11.     'う'=>(|<う く す つ ぬ ふ む ゆ る>,Nil,|<ぐ ず づ ぶ ぷ>),
  12.     'え'=>(|<え け せ て ね へ め>,Nil,|<れ ゑ>,Nil,|<げ ぜ で べ ぺ>),
  13.     'お'=>(|<お こ そ と の ほ も よ ろ を>,Nil,|<ご ぞ ど ぼ ぽ>),
  14.     'ん'=>('ん',|(Nil xx 15))
  15. };
  16.  
  17. my @godan = <う つ る く ぐ ぶ む す>;
  18.  
  19. my @iru = %kana_table<>.grep({ .defined });
  20. my @eru = %kana_table<>.grep({ .defined });
  21.  
  22. my regex ichidan { <?after @iru | @eru>'る'$ };
  23.  
  24. sub tail_tr(%table) {
  25.     my @itms = %table.keys Z %table.values;
  26.     return ({/ $^a $ / => $^b} for @itms);
  27. }
  28.  
  29. sub conj_swap(Str $v1, Str $v2) {
  30.     my @pairs = %kana_table{$v1} Z=> %kana_table{$v2};
  31.     my %filt = @pairs.grep({ .value.defined and .key.defined });
  32.     return tail_tr(%filt);
  33. }
  34.  
  35. sub verb_class(Str $λ) {
  36.     given{
  37.     when &ichidan {return 2}
  38.     when / 'する'$ / {return 3}
  39.     when / 'くる'$ / {return 4}
  40.     when / @godan $ / {return 1}
  41.     default {return Nil}
  42.     }
  43. }
  44.  
  45. module Conj {
  46.  
  47.     my %tables::godan = {
  48.     :(0),
  49.     :(1),
  50.     :(2),
  51.     :(3),
  52.     :(0),
  53.     :(4),
  54.     :(4),
  55.     :(4),
  56.     :(0),
  57.     }
  58.  
  59.     my module Tabular {
  60.  
  61.     our multi sub Godan(Str $row, Str $suf) {
  62.         nextwith($row, $suf xx 5);
  63.     }
  64.     our multi sub Godan(Str $row, List @suf) {
  65.         my @tab = conj_swap('う',$row);
  66.         my &func = sub (Str $λ) {
  67.         my $s = @suf[%tables::godan{
  68.                     $λ.substr(*-1)
  69.                 }
  70.                 ];
  71.         my $c =.trans(@tab);
  72.         return $c ~ $s;
  73.         }
  74.         return &func;
  75.     }
  76.  
  77.     our sub Ichidan(Str $suf) {
  78.         my &func = sub (Str $λ) {
  79.         $λ ~~ s/ 'る'$ /$suf/;
  80.         return;
  81.         }
  82.         return &func;
  83.     }
  84.  
  85.     our sub Irregular(Str $su, Str $ku, Str $suf) {
  86.         my &ichi = Ichidan($suf);
  87.         my &func = sub (Str $λ) {
  88.         my $s = (
  89.             given () {
  90.             when s/ <?after 'ん'>'ずる'$ /じる/ {succeed $_;}
  91.             when s/ 'す'<?before 'る'> $ /$su/ {succeed $_;}
  92.             when s/ 'く'<?before 'る'> $ /$ku/ {succeed $_;}
  93.             default {return Nil;}
  94.             }
  95.         );
  96.         return &ichi($s);
  97.         }
  98.         return &func;
  99.     }
  100.  
  101.     our sub Entry(Str $row,, Str $suf, Str $su, Str $ku) {
  102.         my &dan5 = Godan($row, ω);
  103.         my &dan1 = Ichidan($suf);
  104.         my &irr = Irregular($su, $ku, $suf);
  105.         my &func = sub (Str $λ) {
  106.         given verb_class() {
  107.             when 4|3 {return &irr();}
  108.             when 2 {return &dan1();}
  109.             when 1 {return &dan5();}
  110.             default {return Nil;}
  111.         }
  112.         }
  113.         return &func;
  114.     }
  115.     }
  116.    
  117.     our &Past = Tabular::Entry(
  118.     'い',
  119.     <った いた いだ した んだ>,
  120.     'た',
  121.     'し',
  122.     'き');
  123.     our &Negative = Tabular::Entry(
  124.     |<あ ない ない しない こない>);
  125.     our &PastNegative = Tabular::Entry(
  126.     |<あ なかった なかった しなかった こなかった>);
  127.     my &_impproto = Tabular::Entry(
  128.     'え',
  129.     '',
  130.     'よ',
  131.     'せよ',
  132.     '');
  133.     our sub Imperative(Str $λ) {
  134.     if (verb_class() == 4) {
  135.         $λ ~~ s/'くる'/こい/;
  136.         return;
  137.     }
  138.     else {return _impproto();}
  139.     }
  140.  
  141.     our &Volitional = Tabular::Entry(
  142.     |<お う よう し こ>);
  143.     our &Conjunctive = Tabular::Entry(
  144.     'い',
  145.     <って いて いで して んで>,
  146.     'て',
  147.     'し',
  148.     'き');
  149.     our &Conditional = Tabular::Entry(
  150.     |<え ば れば す く>);
  151. }
  152.  
  153. module Polite {
  154.     my sub _base(Str $λ = CALLER::<$_>) {
  155.     my $s;
  156.     if (verb_class() == 3|4) {
  157.         $s = S/ 'る' $ // given;
  158.     }
  159.     else {
  160.         $s =.trans(conj_swap('う','い'));
  161.     }
  162.     return $s ~ 'ま';
  163.     }
  164.  
  165.     our &Present = {  _base ~ 'す' };
  166.     our &Past = {  _base ~ 'した' };
  167.     our &Negative = {  _base ~ 'せん' };
  168.     our &PastNegative = {  _base ~ 'せんでした' };
  169.     our &Volitional = { _base ~ 'しょう' };
  170.     our &Conjunctive = { _base ~ 'して' };
  171.     our &Conditional = { _base ~ 'すれば' };
  172.     our &Imperative = { _base ~ 'せ' }; # Not generally used
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement