diff Wnn/jserver/bnsetu_kai.c @ 0:bbc77ca4def5

initial import
author Yoshiki Yazawa <yaz@cc.rim.or.jp>
date Thu, 13 Dec 2007 04:30:14 +0900
parents
children ed4bb01eb317
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Wnn/jserver/bnsetu_kai.c	Thu Dec 13 04:30:14 2007 +0900
@@ -0,0 +1,847 @@
+/*
+ *  $Id: bnsetu_kai.c,v 1.5 2003/05/11 18:35:54 hiroo Exp $
+ */
+
+/*
+ * FreeWnn is a network-extensible Kana-to-Kanji conversion system.
+ * This file is part of FreeWnn.
+ * 
+ * Copyright Kyoto University Research Institute for Mathematical Sciences
+ *                 1987, 1988, 1989, 1990, 1991, 1992
+ * Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1999
+ * Copyright ASTEC, Inc. 1987, 1988, 1989, 1990, 1991, 1992
+ * Copyright FreeWnn Project 1999, 2000, 2003
+ *
+ * Maintainer:  FreeWnn Project   <freewnn@tomo.gr.jp>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+/************************************************
+ *      小文節解析                              *
+ ************************************************/
+#include <stdio.h>
+#include <ctype.h>
+#include "commonhd.h"
+#include "de_header.h"
+#include "jdata.h"
+
+#include "fzk.h"
+#include "kaiseki.h"
+
+int
+sbn_kai (yomi_sno, yomi_eno, endvect, endvect1, tsbnptr, bnst_num, parent)
+     int yomi_sno;
+     int yomi_eno;
+     int endvect;               /* 終端ベクタ */
+     int endvect1;              /* 終端ベクタ */
+     struct SYO_BNSETSU **tsbnptr;      /* 小文節解析結果 */
+     int bnst_num;              /* これまでに解析した小文節数 */
+     struct SYO_BNSETSU *parent;        /* 親の幹語ノード */
+{
+  int fzkcnt, hyokaval, hyokaval0 = 0, hinsidt, sbncnt;
+  unsigned short *hinsi_buf;
+  int hinsidt_fk;               /* 複合品詞のセーブ */
+  register int i,               /* 幹語の終わりのインデックス */
+    j,                          /* 文節始めのインデックス */
+    t, ii;
+  struct jdata *jentptr;
+  register struct SYO_BNSETSU *sbnptr = NULL;
+  struct SYO_BNSETSU *sbnptr_top = 0;
+  struct ICHBNP *ichbnpbp;
+  int k, ll;
+  struct SYO_BNSETSU *kanptr;
+  struct SYO_BNSETSU *kanptr_tmp = NULL;
+  struct SYO_BNSETSU *kanptr_before;
+  struct SYO_BNSETSU *giji_sbn;
+  int get_giji_flg = -1;        /* 擬似文節を作れたか */
+
+  enum FLG
+  {
+    set,
+    noset
+  }
+  setflg;
+  enum FLG kanflg;              /* 同じベクタの品詞があったか否か */
+  enum GFLG
+  {
+    get,
+    noget
+  }
+  getflg;
+  struct SYO_BNSETSU *getsbnsp ();
+  int kangovect;
+  int connect_flg;
+
+  if ((yomi_sno == yomi_eno) || (fzk_ckvt (endvect) == NO && fzk_ckvt (endvect1) == NO))
+    return (NOTHING);
+
+  if ((fzkcnt = fzk_kai (&bun[yomi_sno], &bun[yomi_eno], endvect, endvect1, &ichbnpbp)) <= 0)
+    return (fzkcnt);            /* ERROR */
+  for (ii = 0; ii < fzkcnt; ii++)
+    getfzkoh (ichbnpbp, ii)->offset += yomi_sno;
+
+  for (ii = 0; ii < fzkcnt; ii++)
+    {
+      i = getfzkoh (ichbnpbp, ii)->offset;
+      if (jmtp[i] == (struct jdata **) UN_KNOWN) /* もう引いた? */
+        {
+          jmt_set (i);		/* 辞書引き */
+        }
+    }
+
+  j = j_max (ichbnpbp, fzkcnt);
+  j = (j >= yomi_eno) ? yomi_eno - 1 : j;
+
+  setflg = noset;
+  if ((giji_sbn = getsbnsp ()) == NO)
+    return (-1);                /* ERROR */
+  giji_sbn->kbcnt = bnst_num;
+  giji_sbn->bend_m = yomi_sno;
+  giji_sbn->parent = parent;
+
+  /* 疑似文節を先に取り出します(もしあれば) */
+  if (getgiji (yomi_sno, yomi_eno, giji_sbn, ichbnpbp, fzkcnt, bnst_num) >= 0)
+    {
+      sbncnt = 1;
+      getflg = get;
+      get_giji_flg = giji_sbn->j_c;
+      if (giji_sbn->j_c > j)
+        {
+          sbnptr_top = giji_sbn;
+          get_giji_flg = -1;
+          kanptr_tmp = giji_sbn->lnk_br;
+        }
+    }
+  else
+    {
+      sbnptr = giji_sbn;
+      sbncnt = 0;
+      getflg = noget;
+    }
+
+  for (; j >= yomi_sno; j--)
+    {                           /* 文節の長さ */
+      if ((setflg == noset) && (get_giji_flg == j))
+        {
+          giji_sbn->lnk_br = sbnptr_top;
+          sbnptr_top = giji_sbn;
+          setflg = set;
+          kanptr_tmp = giji_sbn->lnk_br;
+        }
+      for (ii = 0; (ii < fzkcnt) && ((i = (getfzkoh (ichbnpbp, ii)->offset)) <= j); ii++)
+        {                       /* 付属語 */
+          jentptr = (struct jdata *) C (i, j);
+          for (; jentptr; jentptr = jentptr->jptr)
+            {                   /* 辞書 */
+              for (t = 0; t < (jentptr->kosuu); t++)
+                {               /* 幹語 */
+                  if (((jentptr->hindo[t] & 0x7f) == 0x7f) || (jentptr->hindo_in && (jentptr->hindo_in[t] & 0x7f) == 0x7f))
+                    continue;   /*コメントアウトされた辞書エントリ */
+#ifdef  CONVERT_with_SiSheng
+                  hyokaval = hyoka1 (jentptr->hindo[t],
+                                     (jentptr->hindo_in == 0 ? 0 : jentptr->hindo_in[t]),
+                                     (jentptr->sisheng == 0 ? 0 : diff_sisheng (jentptr->sisheng[t], jentptr->sisheng_int)), j - i / 2 - yomi_sno / 2 + 1, dic_table[jentptr->jishono].nice);
+#else
+                  hyokaval = hyoka1 (jentptr->hindo[t], (jentptr->hindo_in == 0 ? 0 : jentptr->hindo_in[t]), j - i + 1, j - yomi_sno + 1, dic_table[jentptr->jishono].nice);
+#endif /* CONVERT_with_SiSheng */
+                  if (bnst_num != 1)
+                    {
+                      if (parent != 0 && parent->status_bkwd == NO)
+                        /* 前の文節が endvect に接続できないものは、
+                           評価値を下げる */
+                        hyokaval0 = _DIVID (hyokaval, 2);
+                      else
+                        hyokaval0 = hyokaval;
+                    }
+                  hinsidt_fk = hinsidt = jentptr->hinsi[t];
+                  if ((ll = wnn_get_fukugou_component_body (hinsidt_fk, &hinsi_buf)) == 0)
+                    {
+                      error1 ("wnn_get_fukugou_component:erroe in bunsetukai.");
+                      return (-1);
+                    }
+                  for (; ll > 0; ll--)
+                    {
+                      hinsidt = *hinsi_buf;
+                      hinsi_buf++;
+                      /* ここから後は単純品詞だけ考えればいい */
+                      connect_flg = kan_ck_vector (hinsidt, (getfzkoh (ichbnpbp, ii)->vector));
+                      if ((connect_flg == WNN_CONNECT_BK || (bnst_num == 1 && kan_ck_vector (hinsidt, (getfzkoh1 (ichbnpbp, ii)->vector)) == WNN_CONNECT_BK)))
+                        {
+                          /* 接続できる */
+                          if (bnst_num == 1)
+                            /* endvect に接続できないものは評価値を下げる */
+                            hyokaval0 = (connect_flg != WNN_NOT_CONNECT_BK) ? hyokaval : _DIVID (hyokaval, 2);
+                          kangovect = ft->kango_hinsi_area[hinsidt];
+                          if (getflg == get)
+                            {
+                              getflg = noget;
+                              if (0 == (sbnptr = getsbnsp ()))
+                                return (-1);    /* ERROR */
+                              sbnptr->kbcnt = bnst_num;
+                              sbnptr->bend_m = yomi_sno;
+                              sbnptr->parent = parent;
+                            }
+                          sbnptr->j_c = j;
+
+                          if (setflg == noset)
+                            {   /* この長さの文節は初めて */
+                              sbnptr->lnk_br = sbnptr_top;
+                              sbnptr_top = sbnptr;
+                              setflg = set;
+                              sbnptr->v_jc = hyokaval0;
+                              sbnptr->t_jc = t;
+                              sbnptr->jentptr = jentptr;
+                              sbnptr->hinsi_fk = hinsidt_fk;
+                              sbnptr->kangovect = kangovect;
+                              sbnptr->i_jc = i;
+                              /* yoku wakaran 9/8
+                                 if (endvect1 == WNN_VECT_NO)
+                                 sbnptr->status_bkwd = WNN_NOT_CONNECT_BK;
+                                 else
+                               */
+                              sbnptr->status_bkwd = connect_flg;
+                              kanptr_tmp = sbnptr->lnk_br;
+                              getflg = get;
+                              sbncnt++;
+                            }
+                          else
+                            {
+                              kanflg = noset;
+                              for (kanptr_before = kanptr = sbnptr_top; kanptr != kanptr_tmp; kanptr_before = kanptr, kanptr = kanptr->lnk_br)
+                                {
+                                  if (kanptr->kangovect == kangovect)
+                                    {
+                                      /* 同じベクタの品詞があった  */
+                                      if (hyokaval0 > kanptr->v_jc)
+                                        {
+                                          /* こっちの方が評価値が高い */
+                                          kanptr->v_jc = hyokaval0;
+                                          kanptr->t_jc = t;
+                                          kanptr->jentptr = jentptr;
+                                          kanptr->hinsi_fk = hinsidt_fk;
+                                          kanptr->i_jc = i;
+                                          /* yoku wakaran 9/8
+                                             if (endvect1 == WNN_VECT_NO)
+                                             kanptr->status_bkwd = WNN_NOT_CONNECT_BK;
+                                             else
+                                           */
+                                          kanptr->status_bkwd = connect_flg;
+                                        }
+                                      kanflg = set;
+                                      break;
+                                    }
+                                  else if (kanptr->kangovect > kangovect)
+                                    {
+                                      /* 同じベクタの品詞がなかった */
+                                      break;
+                                    }
+                                }       /* SORT & INSERT SYO_BN */
+
+                              if (kanflg == noset)
+                                {
+                                  /* 同じベクタの品詞がなかった */
+                                  if (kanptr == sbnptr_top)
+                                    {
+                                      sbnptr->lnk_br = kanptr;
+                                      sbnptr_top = sbnptr;
+                                    }
+                                  else
+                                    {
+                                      sbnptr->lnk_br = kanptr;
+                                      kanptr_before->lnk_br = sbnptr;
+                                    }
+                                  sbnptr->v_jc = hyokaval0;
+                                  sbnptr->t_jc = t;
+                                  sbnptr->jentptr = jentptr;
+                                  sbnptr->hinsi_fk = hinsidt_fk;
+                                  sbnptr->kangovect = kangovect;
+                                  sbnptr->i_jc = i;
+                                  /* yoku wakaran 9/8
+                                     if (endvect1 == WNN_VECT_NO)
+                                     sbnptr->status_bkwd = WNN_NOT_CONNECT_BK;
+                                     else
+                                   */
+                                  sbnptr->status_bkwd = connect_flg;
+                                  sbncnt++;
+                                  getflg = get;
+                                }
+                            }
+                        }       /* 接続できる */
+                    }           /* 単純品詞 */
+                }               /* 幹語 */
+            }                   /* 辞書 */
+        }                       /* 付属語 */
+      setflg = noset;           /* 次の長さの漢語はまだsetして無い */
+    }                           /* 文節の長さ */
+  if (sbncnt == NOTHING)
+    {                           /* 幹語がなかった */
+      for (k = fzkcnt - 1; k >= 0; k--)
+        {
+          if (kan_ck_vector (katakanago_no, getfzkoh (ichbnpbp, k)->vector) == WNN_CONNECT_BK)
+            {
+              k = getgiji (yomi_sno, yomi_eno, sbnptr, ichbnpbp, k + 1, bnst_num);
+              break;
+            }
+        }
+      if (k < 0)
+        {
+          if (bnst_num == 1)
+            {
+              /* 何が何でも疑似文節を作るんだい */
+              getgiji_f (yomi_sno, sbnptr);
+              sbncnt = 1;
+              sbnptr_top = sbnptr;
+#ifdef  nodef
+              wnn_errorno = WNN_NO_KOUHO;
+              error1 ("Cannot get bunsetsu kouho in bunsetu-kaiseki.\n");
+#endif /* nodef */
+            }
+          else
+            {
+              freesbn (sbnptr);
+              sbncnt = 0;
+              sbnptr_top = 0;
+            }
+        }
+      else
+        {
+          sbncnt = 1;
+          sbnptr_top = sbnptr;
+        }
+    }
+  else if (getflg == noget)
+    {
+      freesbn (sbnptr);
+    }
+  *tsbnptr = sbnptr_top;        /* 短いものから並べる */
+  freeibsp (ichbnpbp);
+  return (sbncnt);
+}
+
+/*******************************************/
+/*      max value in maxj[] search routine */
+/*******************************************/
+int
+j_max (fzkbnp, fzkcnt)
+     register struct ICHBNP *fzkbnp;
+     int fzkcnt;                /* max number of fzkkouho table */
+{
+  register int i, mxj = -1, k, ofst;
+
+  for (i = 0; i < fzkcnt; i++)
+    {
+      if ((ofst = getfzkoh (fzkbnp, i)->offset) < maxchg)
+        if ((k = maxj[ofst]) > mxj)
+          mxj = k;
+    }
+  return (mxj);
+}
+
+/**********************************************/
+/*      疑似幹語の獲得                        */
+/**********************************************/
+#ifdef  KOREAN
+int
+getgiji (yomi_sno, yomi_eno, sbnptr, fzkbnp, fzkcnt, bnst_num)
+     int yomi_sno;
+     int yomi_eno;
+     struct SYO_BNSETSU *sbnptr;
+     struct ICHBNP *fzkbnp;
+     int fzkcnt;
+     int bnst_num;
+{
+  register int j_end;
+  int j_end_sv;
+  int *vector;
+  int *vector1;
+  int giji_hinsi;
+  int giji_hindo;
+  int len = 0;
+  w_char c = (w_char) 0;
+
+  j_end = getfzkoh (fzkbnp, fzkcnt - 1)->offset;
+  vector = getfzkoh (fzkbnp, fzkcnt - 1)->vector;
+  vector1 = getfzkoh1 (fzkbnp, fzkcnt - 1)->vector;
+
+/* 分類 */
+  if ((isascii (c = bun[j_end]) && isdigit (c)) || isjdigit (c))
+    {                           /* 数字 */
+      giji_hinsi = suuji_no;
+      giji_hindo = c_env->suuji_val;
+    }
+  else if ((isascii (c) && isparen_e (c)) || isjparen_e (c))
+    {                           /* 閉括弧 */
+      giji_hinsi = toji_kakko_no;
+      giji_hindo = c_env->toji_kakko_val;
+    }
+  else if (is_g_eisuu (c))
+    {                           /* アスキー(アルファベット, 数字) */
+      giji_hinsi = eisuu_no;
+      giji_hindo = c_env->eisuu_val;
+    }
+  else if ((isascii (c) && isparen_s (c)) || isjparen_s (c))
+    {                           /* 開括弧 */
+      giji_hinsi = kai_kakko_no;
+      giji_hindo = c_env->kaikakko_val;
+    }
+  else if (ishangul (c))
+    {                           /* Hangul */
+      giji_hinsi = katakanago_no;
+      giji_hindo = 0;
+    }
+  else
+    {                           /* 記号、漢字 */
+      giji_hinsi = kigou_no;
+      giji_hindo = c_env->kigou_val;
+    }
+
+/* 接続可能か */
+  if ((sbnptr->status_bkwd = kan_ck_vector (giji_hinsi, vector)) == WNN_CONNECT_BK)
+    goto _Can_connect;
+  if (bnst_num != 1)
+    return (-1);
+  if (kan_ck_vector (giji_hinsi, vector1) == WNN_NOT_CONNECT_BK)
+    {
+      if (giji_hinsi != suuji_no || kan_ck_vector (eisuu_no, vector1) == WNN_NOT_CONNECT_BK)
+        return (-1);
+      else
+        {
+          giji_hinsi = eisuu_no;
+          giji_hindo = c_env->eisuu_val;
+        }
+    }
+
+_Can_connect:
+
+/* 長さを調べる */
+  if (giji_hinsi == suuji_no)
+    {
+      for (; (j_end + len < yomi_eno) && ((isascii (bun[j_end + len]) && isdigit (bun[j_end + len])) || isjdigit (bun[j_end + len])); len++)
+        ;
+      if ((j_end + len < yomi_eno) && is_g_eisuu (bun[j_end + len]))
+        {
+          /* 英数 */
+          for (len++; (j_end + len < yomi_eno) && is_g_eisuu (bun[j_end + len]); len++)
+            ;
+          if (kan_ck_vector (eisuu_no, vector) == WNN_NOT_CONNECT_BK && (bnst_num != 1 || kan_ck_vector (eisuu_no, vector1)))
+            return (-1);
+          giji_hinsi = eisuu_no;
+        }
+    }
+  else if (giji_hinsi == eisuu_no)
+    {
+      for (; ((j_end + len) < yomi_eno) && is_g_eisuu (bun[j_end + len]); len++)
+        ;
+    }
+  else if (giji_hinsi == toji_kakko_no)
+    {                           /* 閉括弧 */
+      len = 1;
+    }
+  else if (giji_hinsi == kigou_no)
+    {                           /* 記号 */
+      len = 1;
+    }
+  else if (giji_hinsi == kai_kakko_no)
+    {                           /* 開括弧 */
+      len = 1;
+    }
+  else if (giji_hinsi == giji_no)
+    {
+      len = 1;
+    }
+  else if (giji_hinsi == katakanago_no)
+    {                           /* Hangul */
+      for (len = 1; (j_end + len < yomi_eno) && ishangul (bun[j_end + len]); len++)
+        ;
+    }
+  else
+    {
+      if (j_end >= yomi_eno)
+        len = 0;
+      else
+        len = 1;
+    }
+
+  /* スペースは、そのあとの疑似文節にくっつける */
+  if ((giji_hinsi == eisuu_no) || (giji_hinsi == suuji_no) || (giji_hinsi == katakanago_no))
+    {
+      for (; ((j_end + len) < yomi_eno) && (isspace (bun[j_end + len]) || (isjspace (c))); len++)
+        ;
+    }
+
+_Only_Fuzokugo:
+/* 評価値の決定 */
+  sbnptr->v_jc = HYOKAVAL (giji_hindo, len, len + j_end - yomi_sno);
+  sbnptr->i_jc = j_end;
+  if (giji_hinsi == katakanago_no)
+    {
+      sbnptr->t_jc = WNN_KATAKANA;
+      sbnptr->v_jc = 0;
+    }
+  else if (giji_hinsi == suuji_no)
+    {
+      sbnptr->t_jc = c_env->giji.number;
+    }
+  else if (isascii (c))
+    {
+      if (giji_hinsi == eisuu_no)
+        {
+          sbnptr->t_jc = c_env->giji.eisuu;
+        }
+      else if (giji_hinsi == kigou_no || giji_hinsi == toji_kakko_no || giji_hinsi == kai_kakko_no)
+        {
+          sbnptr->t_jc = c_env->giji.kigou;
+        }
+      else
+        {
+          sbnptr->t_jc = -1;
+        }
+      sbnptr->v_jc += 2;        /* 次候補よりも評価値を上げるため */
+    }
+  else
+    {
+      sbnptr->t_jc = -1;
+    }
+  sbnptr->hinsi_fk = giji_hinsi;
+  sbnptr->jentptr = 0;
+  sbnptr->kangovect = ft->kango_hinsi_area[giji_hinsi];
+  sbnptr->j_c = j_end + len - 1;
+  return (len);
+}
+#else /* !KOREAN */
+int
+getgiji (yomi_sno, yomi_eno, sbnptr, fzkbnp, fzkcnt, bnst_num)
+     int yomi_sno;
+     int yomi_eno;
+     struct SYO_BNSETSU *sbnptr;
+     struct ICHBNP *fzkbnp;
+     int fzkcnt;
+     int bnst_num;
+{
+  register int j_end;
+  int j_end_sv;
+  int *vector;
+#ifndef CHINESE
+  int *vector1;
+#endif
+  int giji_hinsi;
+  int giji_hindo;
+  int len = 0;
+  w_char c = (w_char) 0;
+
+  j_end = getfzkoh (fzkbnp, fzkcnt - 1)->offset;
+  vector = getfzkoh (fzkbnp, fzkcnt - 1)->vector;
+#ifndef CHINESE
+  vector1 = getfzkoh1 (fzkbnp, fzkcnt - 1)->vector;
+#endif
+
+  if (j_end >= yomi_eno)
+    {                           /* 付属語だけの場合 */
+      giji_hinsi = fuzokugo_no;
+      giji_hindo = c_env->fuzokogo_val;
+      len = 0;
+      goto _Only_Fuzokugo;
+    }
+/*#ifdef        not_use*/
+  if (isjhira (bun[j_end]))     /* ひらがなならバイバイ */
+    return (-1);
+/*#endif*/
+  for (j_end_sv = j_end; j_end < yomi_eno; j_end++)
+    {
+      /* スペースは、その前の疑似文節にくっつける */
+      if (!(isspace (c = bun[j_end])) && !(isjspace (c)))
+        {
+          if (TOKUSYU (c) || check_bar_katakana (j_end, yomi_eno) || isjhira (c) || isjkanji (c))
+            {                   /* 片仮名 ひらがな 漢字 */
+              j_end = j_end_sv;
+            }
+          break;
+        }
+    }
+
+  if (j_end >= yomi_eno)
+    {                           /* スペースだけの場合 */
+      giji_hinsi = fuzokugo_no;
+      giji_hindo = c_env->fuzokogo_val;
+      len = 0;
+      goto _Only_Fuzokugo;
+    }
+
+/* 分類 */
+  if ((isascii (c = bun[j_end]) && isdigit (c)) || isjdigit (c))
+    {                           /* 数字 */
+      giji_hinsi = suuji_no;
+      giji_hindo = c_env->suuji_val;
+    }
+  else if ((isascii (c) && isparen_e (c)) || isjparen_e (c))
+    {                           /* 閉括弧 */
+      giji_hinsi = toji_kakko_no;
+      giji_hindo = c_env->toji_kakko_val;
+    }
+  else if (TOKUSYU (c) || check_bar_katakana (j_end, yomi_eno))
+    {                           /* 片仮名 */
+      giji_hinsi = katakanago_no;
+      giji_hindo = c_env->kana_val;
+    }
+  else if (is_g_eisuu (c))
+    {                           /* アスキー(アルファベット, 数字) */
+      giji_hinsi = eisuu_no;
+      giji_hindo = c_env->eisuu_val;
+    }
+  else if ((isascii (c) && isparen_s (c)) || isjparen_s (c))
+    {                           /* 開括弧 */
+      giji_hinsi = kai_kakko_no;
+      giji_hindo = c_env->kaikakko_val;
+#ifdef  nodef
+    }
+  else if (isjhira (c))
+    {                           /* ひらがな */
+      giji_hinsi = giji_no;
+      giji_hindo = 0;
+#endif
+    }
+  else
+    {                           /* 記号、漢字 */
+      giji_hinsi = kigou_no;
+      giji_hindo = c_env->kigou_val;
+    }
+
+/* 接続可能か */
+  if (sbnptr->status_bkwd = kan_ck_vector (giji_hinsi, vector) == WNN_CONNECT_BK)
+    goto _Can_connect;
+#ifdef  nodef
+  /* 数字に接続できないが,アスキには接続できる */
+  if (giji_hinsi == suuji_no && kan_ck_vector (eisuu_no, vector) == WNN_CONNECT_BK)
+    {
+      giji_hinsi = eisuu_no;
+      giji_hindo = c_env->eisuu_val;
+      goto _Can_connect;
+    }
+#endif /* nodef */
+  if (bnst_num != 1)
+    return (-1);
+#ifndef CHINESE
+  if (kan_ck_vector (giji_hinsi, vector1) == WNN_NOT_CONNECT_BK)
+    {
+      if (giji_hinsi != suuji_no || kan_ck_vector (eisuu_no, vector1) == WNN_NOT_CONNECT_BK)
+        return (-1);
+      else
+        {
+          giji_hinsi = eisuu_no;
+          giji_hindo = c_env->eisuu_val;
+        }
+    }
+#endif /* CHINESE */
+
+_Can_connect:
+
+/* 長さを調べる */
+  if (giji_hinsi == suuji_no)
+    {
+      for (; (j_end + len < yomi_eno) && ((isascii (bun[j_end + len]) && isdigit (bun[j_end + len])) || isjdigit (bun[j_end + len])); len++)
+        ;
+#ifndef CHINESE
+      if ((j_end + len < yomi_eno) && is_g_eisuu (bun[j_end + len]))
+        {
+          /* 英数 */
+          for (len++; (j_end + len < yomi_eno) && is_g_eisuu (bun[j_end + len]); len++)
+            ;
+          if (kan_ck_vector (eisuu_no, vector) == WNN_NOT_CONNECT_BK && (bnst_num != 1 || kan_ck_vector (eisuu_no, vector1)))
+            return (-1);
+          giji_hinsi = eisuu_no;
+#ifdef  nodef
+          /* 半角数字 */
+        }
+      else
+        {
+          if (kan_ck_vector (suuji_no, vector) == WNN_NOT_CONNECT_BK)
+            return (-1);
+#endif /* nodef */
+        }
+#endif /* CHINESE */
+    }
+  else if (giji_hinsi == eisuu_no)
+    {
+      for (; ((j_end + len) < yomi_eno) && is_g_eisuu (bun[j_end + len]); len++)
+        ;
+    }
+  else if (giji_hinsi == toji_kakko_no)
+    {                           /* 閉括弧 */
+      len = 1;
+    }
+  else if (giji_hinsi == kigou_no)
+    {                           /* 記号 */
+      len = 1;
+    }
+  else if (giji_hinsi == kai_kakko_no)
+    {                           /* 開括弧 */
+      len = 1;
+    }
+  else if (giji_hinsi == giji_no)
+    {
+      len = 1;
+    }
+  else if (giji_hinsi == katakanago_no)
+    {
+      /* カタカナ 半角カタカナ 濁点 半濁点 */
+      for (len = 1; (j_end + len < yomi_eno) && (TOKUSYU (bun[j_end + len]) || check_bar_katakana (j_end + len, yomi_eno)); len++)
+        ;
+    }
+  else
+    {
+      if (j_end >= yomi_eno)
+        len = 0;
+      else
+        len = 1;
+    }
+
+  /* スペースは、そのあとの疑似文節にくっつける */
+  if ((giji_hinsi == eisuu_no) || (giji_hinsi == suuji_no))
+    {
+      for (; ((j_end + len) < yomi_eno) && (isspace (bun[j_end + len]) || (isjspace (c))); len++)
+        ;
+    }
+
+_Only_Fuzokugo:
+/* 評価値の決定 */
+  sbnptr->v_jc = HYOKAVAL (giji_hindo, len, len + j_end - yomi_sno);
+  sbnptr->i_jc = j_end;
+  if (giji_hinsi == katakanago_no)
+    {
+      sbnptr->t_jc = WNN_KATAKANA;
+    }
+  else if (giji_hinsi == suuji_no)
+    {
+      sbnptr->t_jc = c_env->giji.number;
+    }
+  else if (isascii (c))
+    {
+      if (giji_hinsi == eisuu_no)
+        {
+          sbnptr->t_jc = c_env->giji.eisuu;
+        }
+      else if (giji_hinsi == kigou_no || giji_hinsi == toji_kakko_no || giji_hinsi == kai_kakko_no)
+        {
+          sbnptr->t_jc = c_env->giji.kigou;
+        }
+      else
+        {
+          sbnptr->t_jc = -1;
+        }
+      sbnptr->v_jc += 2;        /* 次候補よりも評価値を上げるため */
+    }
+  else
+    {
+      sbnptr->t_jc = -1;
+    }
+  sbnptr->hinsi_fk = giji_hinsi;
+  sbnptr->jentptr = 0;
+  sbnptr->kangovect = ft->kango_hinsi_area[giji_hinsi];
+  sbnptr->j_c = j_end + len - 1;
+  return (len);
+}
+#endif /* KOREAN */
+
+int
+is_g_eisuu (c)
+     register w_char c;
+{
+  register int i;
+
+  if ((isascii (c) && isalnum (c)) || isjalnum (c))
+    return (YES);
+  else
+    {
+      for (i = 0; i < 20; i++)
+        {
+          if (giji_eisuu[i] == 0xffff)
+            return (NO);
+          else if (giji_eisuu[i] == c)
+            return (YES);
+        }
+    }
+  return (NO);
+}
+
+
+/* 何が何でも疑似文節を作るんだい */
+int
+getgiji_f (yomi_sno, sbnptr)
+     register int yomi_sno;
+     register struct SYO_BNSETSU *sbnptr;
+{
+  sbnptr->v_jc = HYOKAVAL (0, 1, 1);
+  sbnptr->i_jc = yomi_sno;
+  sbnptr->t_jc = -1;
+  sbnptr->hinsi_fk = giji_no;
+  sbnptr->jentptr = 0;
+  sbnptr->kangovect = ft->kango_hinsi_area[kigou_no];
+  sbnptr->j_c = yomi_sno;
+
+  return (1);
+}
+
+/* カタカナか? 長音記号の前は、カタカナでないとダメ */
+int
+check_bar_katakana (i, yomi_eno)
+     register int i;
+     register int yomi_eno;
+{
+  register int j;
+  for (j = i; j < yomi_eno; j++)
+    {
+      if (isjkata (bun[j]))
+        return (YES);
+      if (!(BAR_CODE (bun[j])))
+        return (NO);
+    }
+  return (NO);
+}
+
+/*
+ * kan_ckvt     hinsi の品詞がvectorに接続できるか
+ */
+
+int
+kan_ckvt (hinsi, vector)
+     register unsigned short hinsi;     /* 品詞No. */
+     register int vector;       /* 付属語前端ベクタ */
+{
+  register int *v;
+  v = (int *) ((word_vector *) ft->kango_vect_area + vector);
+  return (kan_ck_vector (hinsi, v));
+  /*
+     return (kan_ck_vector(hinsi,
+     ((word_vector *) ft->kango_vect_area + vector)));
+   */
+}
+
+#ifdef  change_macro
+int
+kan_ck_vector (hinsi, vector)
+     unsigned short hinsi;      /* 品詞No. */
+     int vector[];              /* 付属語前端ベクタ */
+{
+  register int wvect;
+
+  wvect = vector[hinsi / (sizeof (int) << 3)];  /* << 3 == * 8  */
+  wvect >>= (hinsi % (sizeof (int) << 3));
+  if ((wvect & 0x00000001) == 1)
+    return (WNN_CONNECT_BK);
+  else
+    return (WNN_NOT_CONNECT_BK);
+}
+#endif /* change_macro */