中文词法分析的简单程序

    技术2022-05-11  99

    VC 6.0 下编译通过  disc 为辞典   expression 为输入的短语

     

    // Code.cpp : Defines the entry point for the console application. //

    #include "stdafx.h" #include "iostream.h" #include "string.h" #include "windows.h"

    int CountWord(char* words);  //计 算有多少个字符

    struct dict {  char syn[8],word[6];  int scode,wcode; } dic[19];

    int main(int argc, char* argv[]) {  strcpy(dic[0].syn,"祈使动词");     dic[0].scode=0;  strcpy(dic[0].word,"请");     dic[0].wcode=0;     strcpy(dic[1].syn,"祈使动词");     dic[1].scode=0;  strcpy(dic[1].word,"把");     dic[1].wcode=1;     strcpy(dic[2].syn,"代词");  dic[2].scode=1;  strcpy(dic[2].word,"你");  dic[2].wcode=0;  strcpy(dic[3].syn,"动词");  dic[3].scode=2;  strcpy(dic[3].word,"走");  dic[3].wcode=0;  strcpy(dic[4].syn,"动词");  dic[4].scode=2;  strcpy(dic[4].word,"跑");  dic[4].wcode=1;  strcpy(dic[5].syn,"动词");  dic[5].scode=2;  strcpy(dic[5].word,"跳");  dic[5].wcode=2;  strcpy(dic[6].syn,"动词");  dic[6].scode=2;  strcpy(dic[6].word,"转");  dic[6].wcode=3;  strcpy(dic[7].syn,"动词");  dic[7].scode=2;  strcpy(dic[7].word,"抬");  dic[7].wcode=4;  strcpy(dic[8].syn,"方向词");  dic[8].scode=3;  strcpy(dic[8].word,"向左");  dic[8].wcode=0;  strcpy(dic[9].syn,"方向词");  dic[9].scode=3;  strcpy(dic[9].word,"向右");  dic[9].wcode=1;  strcpy(dic[10].syn,"方位词");  dic[10].scode=4;  strcpy(dic[10].word,"向前");  dic[10].wcode=0;  strcpy(dic[11].syn,"方位词");  dic[11].scode=4;  strcpy(dic[11].word,"侧");  dic[11].wcode=1;  strcpy(dic[12].syn,"名词");  dic[12].scode=5;  strcpy(dic[12].word,"左手");  dic[12].wcode=0;  strcpy(dic[13].syn,"名词");  dic[13].scode=5;  strcpy(dic[13].word,"右手");  dic[13].wcode=1;  strcpy(dic[14].syn,"名词");  dic[14].scode=5;  strcpy(dic[14].word,"左腿");  dic[14].wcode=2;  strcpy(dic[15].syn,"名词");  dic[15].scode=5;  strcpy(dic[15].word,"右腿");  dic[15].wcode=3;  strcpy(dic[16].syn,"副词");  dic[16].scode=6;  strcpy(dic[16].word,"快");  dic[16].wcode=0;  strcpy(dic[17].syn,"副词");  dic[17].scode=6;  strcpy(dic[17].word,"慢");  dic[17].wcode=1;  strcpy(dic[18].syn,"其他词");  dic[18].scode=7;  strcpy(dic[18].word,"起来");  dic[18].wcode=0; //--Init Data End ///

     char expression[30],phrase[40];  //输 入句子的分词程序  char *p1,*p2;      //*  PWORD pw_exp1,pw_exp2,pw_old;   //temp   pw_old Can RollBack  int  n_WordNub = 0,n_InputNub = 0;   //*    strcpy(expression,"请你向前走快抬左手侧左腿");    for(int i=0; i<40; i++)   phrase[i] = ' ' ;  phrase[39] = '/0';

     p2 = expression;  p1 = phrase;   pw_old = pw_exp1 = (PWORD)p2;  //Init

    //计 算输入的字数以确定查询的次数  n_InputNub = CountWord(p2);       printf("分析结果: /n");

        for(int nub=0; nub<n_InputNub; nub++) //按 照输入的字数来找  {   for(int i=0; i<19; i++)  // 查询词表   {    pw_exp2 = (PWORD)dic[i].word;    for(int j=0; j<CountWord(dic[i].word); j++) //比 较单词    {     if (*pw_exp1 == *pw_exp2)     {      pw_exp1++;      pw_exp2++;     }     else     {      pw_exp1 = pw_old;  //RollBack     }    }

       if ((char*)pw_exp1 != p2)  //词 表找到单词    {     for(int x=0; x<((char*)pw_exp1 - p2); x++)  //存 储识别单词     {      *p1 = *(p2+x);      p1++;     }     *p1 = '/';  //填 入分隔符     p1++;     p2 =(char*) pw_exp1;   //查 询下一个     pw_old = pw_exp1;      //Can RollBack    }

       if (*p2 == '/0') //查 完了!    {     break;    }

      }  }

    //查 询完辞典!  if( ((char*)pw_exp1 == p2) && (*p2 != '/0') ) //词 表里没有找到  {   cout<<"不可识别的短语!";  }  else{   cout<<"识别完毕! :" ;   cout<<phrase;}    return 0; }

    int CountWord(char* words) {  int n = 0;  while(*words != '/0')  {   words++;   n++;  }  return int(n/2); }


    最新回复(0)