中文词法分析的简单程序

原创 2001年05月18日 01:04:00

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

关于词法分析的一点总结

学完词法分析,有点乱,稍微整理下整个过程 下面我们都是以c语言为例, 我们首先明确词法分析要做的是什么,词法分析是将字符流转化为记号流,字符流就是一行行的代码,如if(a > 10), a++, wh...
  • wyt734933289
  • wyt734933289
  • 2016年10月28日 11:56
  • 450

HULAC:一个高效的中文词法分析工具包(清华)

——免费加入AI技术专家社群>> ——免费加入AI高管投资者群>> THULAC(THU Lexical Analyzer for Chinese)由清华大学自然语言处理与社会人文计算实验室研...
  • CygqjBABx875u
  • CygqjBABx875u
  • 2017年11月12日 00:00
  • 78

JavaScript词法分析过程

在调用一个JavaScript方法之前,都会对方法进行一次词法分析的过程,主要分析如下内容: 第一步: 先分析参数 第二布: 再分析变量声明 第三步: 最后分析函数声明 现提供一个具体...
  • sheldon178
  • sheldon178
  • 2015年09月09日 22:35
  • 402

【编译原理】词法分析(一)

本文是词法分析的第一篇文章,主要介绍在词法分析过程中需要用到的一些基本概念,包括词法单元、模式和词素以及三者之间的关系。...
  • jzyhywxz
  • jzyhywxz
  • 2017年10月19日 15:47
  • 325

一个完整的语法分析、词法分析例子——Universal Pasrser

需求:用户用formal notation指定语法、词法,然后可以匹配相应的文本。用法类似正则表达式,只需给出formal notation,不需要为每一种格式的文本单独写匹配器。 formal no...
  • binling
  • binling
  • 2015年11月12日 12:12
  • 1648

输入及词法分析详解

欢迎大家来到coding迪斯尼,我的愿景是:让天下没有难学的知识  这句话是跟马云学的,就算没马云的命,那就用马云的话,也是不错的。 阅读博客的朋友可以到我的网易云课堂中,通过视频的方式查看代码的...
  • tyler_download
  • tyler_download
  • 2016年03月08日 12:08
  • 1664

词法分析java

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...
  • zhaojianyin
  • zhaojianyin
  • 2017年03月28日 15:10
  • 379

也谈javascript词法分析

下周要做关于js的词法分析的技术分享,于是在脑子里过了下相关的知识,并看了当初的笔记,周末无事,便记了下来,以飨js初学者,高手勿哂,有错误敬请指出。 话说,编程语言分为编译型语言和解释型语言。前者执...
  • molaifeng
  • molaifeng
  • 2013年07月07日 11:10
  • 3029

词法分析 VS 语法分析

 词法分析阶段是编译过程的第一个阶段。这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号,如标识符、常数、运算符、定界符等...
  • jxst051665
  • jxst051665
  • 2009年11月20日 11:32
  • 4273

c++词法分析器的实现(编译原理实验)

词法分析
  • moon_sui
  • moon_sui
  • 2017年04月26日 17:02
  • 1136
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:中文词法分析的简单程序
举报原因:
原因补充:

(最多只允许输入30个字)