📄 wordres.cpp
字号:
//蔡的程序中,要改动的函数:FreeNode(加入口参数,指明要释放的对象)
//SearchWord(去长度入口参数,对新的成员变量置初值), 返回指向DictNode的指针
//即使没有原型, 即m_bIsExistOrig=FALSE, 也将 m_pszEnglish 赋给 m_pszOrig
//DictNode中增加:BYTE m_byMaxPhraseLen;
//表示:如果 m_pszEnglish为一个单词,记录短语第一个为该词的短语最大长度
/*
int m_byMaxPhraseLen; //如果 m_pszEnglish为一个单词,记录短语第一个为该词的短语最大长度
DictNode *m_pNextWordNode; //下一个 词结点
DictNode *m_pPrevWordNode; //前一个 词结点
int m_byDictForm;
BYTE m_byDictGenetive; //1:所有格
char m_cDictTense; //时态:0现在,1过去,2将来,3过去将来
char m_cDictAspect; //体态:0一般,1进行,2完成,3完成进行
char m_cDictVoice; //0:主动,1:被动
char m_cDictNegative; //0:肯定,1:否定,
BYTE m_bDictyPerson; //1:第一人称,2:第二人称,3:第三人称
BYTE m_byDictNumber; //0:单数,1:复数
*/
#include "StdAfx.h"
//#include "MAINSTRU.H"
//#include "lxh.h"
//Xuned Change Begin
#include "dictdef.h"
#include "Diction.h"
#define Tail_s 1
#define Tail_d 2
#define Tail_re 3
#define Tail_ll 4
#define Tail_ve 5
#define Tail_m 6
#define Tail_t 7
//Xuned Change End
#define MaxWordNo 150
#define MaxWordLength 200//xuned change
#define TooManyWords -1
#define WordIsTooLong -2
#define SenIsOK 1
#define Orig_Form STYLE_ORIG
#define Ed1_Form STYLE_ED1
#define Ed2_Form STYLE_ED2
#define Ing_Form STYLE_ING
#define S_Form STYLE_S
#define Ed1_2_Form STYLE_ED
#define Ing_Form STYLE_ING
#define Er_Form 906
#define Est_Form 907
#define Is_Has_Form 908 //'s 可能是is, 也可能是has
#define Would_had_Form 909 //'s 可能是would, 也可能是had
#define Unknown_Form 910
#define Number_Form 911
#define Sing_Number 0
#define Multi_Number 1
#define Pre_Tense 0
#define Past_Tense 1
#define Future_Tense 2
#define Pastfuture_Tense 3
#define Simple_Aspect 0
#define Progressive_Aspect 1
#define Perfect_Aspect 2
#define PerfectProgressive_Aspect 3
#define Declarative_Mood 0
#define General_Question_Mood 1
#define Special_Question_Mood 2
#define Exclaim_Mood 3
#define Imperative_Mood 4
#define Active_Voice 0
#define Passive_Voice 1
#define Positive 0
#define Negative 1
#define First_Person 1
#define Second_Person 2
#define Third_Person 3
#define No_Genetive 0
#define Have_Genetive 1
//extern DictSearch g_objLexSearch;
//LookUp的返回信息尚未利用
//BTNode的m_pszAmbig属性不需从词典中读的未写,
SentenceType g_objMorSent;
char * Mystrcpy(DictNode *pDictNode,char *Word,int Option);
void ModifyPreWord();
DictNode* CreateNewWord(char * Word);
DictNode* CreateComposeWord(DictNode *pDictNode2,
DictNode *pDictNode3,
char * ComposeWord); // cdq add
DictNode* CreateOrdinalWord(DictNode *pDictNode2,char *Word);// cdq add
DictNode* WordRestore(char *inputword, int nSearchMod);
BOOL SearchCate(DictNode *pDictNode,int Cate);
void DictWordInit(DictNode* pDictNode); //called by Caim
int MorphorAnalyze(char *sen);//?int
//void PhraseCombine();
BOOL IsDigitalWord(char *Word,int WordLen);
void FreeSentence(SentenceType * Sen);
void SearchLxh();
void OutputDictInformation(DictNode * pDict, FILE *fpres);
extern void SetDefTense();
#define Cate_v Cate_END+100
BOOL bNoTranCapStr=TRUE;
DictNode* WordRestore(char *inputword, int nSearchMod)
{
// word:输入字符串中的词
// wordth:还原以后,信息放入BTNode[wordth]中
DictNode *pDictNode1, *pDictNode2;
char head[128],tail[30],*p;
char Word[150];
int WordLen;
BOOL Restore = TRUE;
strcpy(Word,inputword);
WordLen = strlen(inputword);
if(WordLen == 0)
return NULL;
if(IsDigitalWord(Word, WordLen))
{
if ( (p=strstr(Word,"st"))!=NULL ||
(p=strstr(Word,"nd"))!=NULL ||
(p=strstr(Word,"rd"))!=NULL ||
(p=strstr(Word,"th"))!=NULL )
{
pDictNode1 = CreateNewWord(Word);
pDictNode1->m_nChinNum = 1;
pDictNode1->m_pFirstChin = new DictChin;
p[0]='\0';
pDictNode1->m_pFirstChin->m_pszChinese = new char[strlen(Word)+1];
strcpy(pDictNode1->m_pFirstChin->m_pszChinese,Word);
pDictNode1->m_pFirstChin->m_nChineseLen =
strlen(pDictNode1->m_pFirstChin->m_pszChinese);
pDictNode1->m_pFirstChin->m_nCate = Cate_number;
pDictNode1->m_pFirstChin->m_nSlotNum = 1;
pDictNode1->m_pFirstChin->m_pwSlotLink =
new WORD[pDictNode1->m_pFirstChin->m_nSlotNum*2+1];
memcpy( pDictNode1->m_pFirstChin->m_pwSlotLink,&Sem_OrdnlNU,sizeof(WORD));
Mystrcpy(pDictNode1,"number",3);
}
else
{
pDictNode1 = CreateNewWord(Word);
pDictNode1->m_nChinNum = 1;
pDictNode1->m_pFirstChin = new DictChin;
pDictNode1->m_pFirstChin->m_nCate = Cate_dig;
Mystrcpy(pDictNode1,"dig",3);
}
return pDictNode1;
}
else
if((pDictNode1=g_objLexSearch.SearchWord(Word,nSearchMod)) != NULL)
{ //读入词典信息:词性,译文
if(strcmp(Word,"May") ==0 && nSearchMod==SEARCH_FIRSTCH)
{
g_objLexSearch.FreeNode(pDictNode1);
pDictNode1=g_objLexSearch.SearchWord("may",nSearchMod);
}
if(!pDictNode1->m_bIsExistOrig )
{
Restore = FALSE; //原形,不还原
}
else if(pDictNode1->m_nWordStyle == STYLE_ED ||
pDictNode1->m_nWordStyle == STYLE_ED1 ||
pDictNode1->m_nWordStyle == STYLE_ED2 )
{ //ed形式,
if (SearchCate(g_objMorSent.m_pWordLast,Cate_adet) ||
SearchCate(g_objMorSent.m_pWordLast,Cate_adj)) //cdq changed 12.29
Restore = FALSE; //前一个单词为冠词或形容词, 则该词为n,不还原
else if(SearchCate(pDictNode1,Cate_adj) == NULL)
Restore = TRUE; //非形容词,还原
else if (SearchCate(g_objMorSent.m_pWordLast,Cate_n) ||
SearchCate(g_objMorSent.m_pWordLast,Cate_pron))
Restore = TRUE; //前面为代词、名词,还原
else if(HaveWord(g_objMorSent.m_pWordLast,"have",-1)!=NULL)
Restore = TRUE; //have done
else if(g_objMorSent.m_pWordLast !=NULL &&
HaveWord(g_objMorSent.m_pWordLast->m_pPrevWordNode,"have",-1)!=NULL)
Restore = TRUE; //have ... done
else if(HaveWord(g_objMorSent.m_pWordLast,"be",-1)!=NULL)
Restore = TRUE; //be done
else if(g_objMorSent.m_pWordLast !=NULL &&
HaveWord(g_objMorSent.m_pWordLast->m_pPrevWordNode,"be",-1)!=NULL)
Restore = TRUE; //be ... done
else if(g_objMorSent.m_pWordLast !=NULL &&
(HaveWord(g_objMorSent.m_pWordLast->m_pPrevWordNode,"very",-1)!=NULL ||
HaveWord(g_objMorSent.m_pWordLast->m_pPrevWordNode,"so",-1)!=NULL ))
{
Restore = FALSE; //前一个单词为so, very, 则该词为adj
Mystrcpy(pDictNode1,"adj",3);
}
else if((pDictNode2=g_objLexSearch.SearchWord(pDictNode1->m_pszOrig,nSearchMod)) != NULL &&
SearchCate(pDictNode2,Cate_vt) != NULL)
{
Restore = FALSE; //ved为最后一个词,且其动词为vt,作adj.
Mystrcpy(pDictNode1,"adj",3);
g_objLexSearch.FreeNode(pDictNode2);
}
else
{
if(pDictNode2 != NULL)
g_objLexSearch.FreeNode(pDictNode2);
Restore = TRUE;
}
if(Restore)
Mystrcpy(pDictNode1,"!Cate=adj",3);
}
else if(pDictNode1->m_nWordStyle == STYLE_ING && SearchCate(pDictNode1,Cate_adj)!=NULL)
{//ing形式,可能形容词
/*
if(HaveWord(g_objMorSent.m_pWordLast,"be",-1)!=NULL)
Restore = FALSE; //be adj
else if(g_objMorSent.m_pWordLast != NULL &&
HaveWord(g_objMorSent.m_pWordLast->m_pPrevWordNode,"be",-1)!=NULL)
Restore = FALSE; //be ... adj
else //old rules
*/
//new rules
if((pDictNode2=g_objLexSearch.SearchWord(pDictNode1->m_pszOrig,nSearchMod)) != NULL &&
SearchCate(pDictNode2,Cate_vi) != NULL)
{
Restore = TRUE; //ving为最后一个词,且其动词为Vi,作ving
g_objLexSearch.FreeNode(pDictNode2);
}
else
{
if(pDictNode2 != NULL)
g_objLexSearch.FreeNode(pDictNode2);
Restore = FALSE;
}
if(Restore)
Mystrcpy(pDictNode1,"!Cate=adj",3);
else
Mystrcpy(pDictNode1,"adj",3);
}
if(! Restore ) //不还原
{
if(pDictNode1->m_pszOrig == NULL)
pDictNode1->m_pszOrig = Mystrcpy(pDictNode1,pDictNode1->m_pszEnglish,2);
pDictNode1->m_byDictForm = Orig_Form;
}
else
{ //不规则变化的词,二次查词典:
if(g_objLexSearch.SearchWord(pDictNode1->m_pszOrig,nSearchMod) != NULL)
{
g_objLexSearch.m_pDictNode->m_pszEnglish =
Mystrcpy(g_objLexSearch.m_pDictNode,inputword,1); //98.3.10
g_objLexSearch.m_pDictNode->m_pszOrig =
Mystrcpy(g_objLexSearch.m_pDictNode,pDictNode1->m_pszOrig,2);
g_objLexSearch.m_pDictNode->m_byDictForm = pDictNode1->m_byDictForm;
g_objLexSearch.m_pDictNode->m_byDictNumber = pDictNode1->m_byDictNumber;
g_objLexSearch.m_pDictNode->m_bIsExistOrig = TRUE;
g_objLexSearch.FreeNode(pDictNode1);
pDictNode1 = g_objLexSearch.m_pDictNode;
}
}
if((pDictNode1->m_byDictForm == Ed2_Form ||
pDictNode1->m_byDictForm == Ed1_2_Form) )
ModifyPreWord();
return pDictNode1;
}
else if((p=strchr(Word,'\''))!=NULL)
{ //有符号'
if(strcmp(Word,"Let's")==0 || strcmp(Word,"let's")==0)
{ //let's
pDictNode1 = g_objLexSearch.SearchWord("let",nSearchMod);
pDictNode2 = g_objLexSearch.SearchWord("us",nSearchMod);
pDictNode1->m_pNextWordNode = pDictNode2;
pDictNode2->m_pPrevWordNode = pDictNode1;
pDictNode1->m_byDictForm = Orig_Form;
pDictNode2->m_byDictForm = Orig_Form;
/*g_objMorSent.m_cDictAspect=Pre_Tense;
g_objMorSent.m_cDictAspect=Simple_Aspect;
g_objMorSent.m_cMood=Imperative_Mood;*/
}
else if(strcmp(Word,"can't")==0 || strcmp(Word,"Can't")==0)
{ //can't
pDictNode1 = g_objLexSearch.SearchWord("can",nSearchMod);
pDictNode2 = g_objLexSearch.SearchWord("not",nSearchMod);
pDictNode1->m_pNextWordNode = pDictNode2;
pDictNode2->m_pPrevWordNode = pDictNode1;
pDictNode1->m_byDictForm = Orig_Form;
pDictNode2->m_byDictForm = Orig_Form;
//g_objMorSent.m_cDictNegative=Negative;
}
else if(strcmp(Word,"won't")==0 || strcmp(Word,"Won't")==0)
{ //won't
pDictNode1 = g_objLexSearch.SearchWord("will",nSearchMod);
pDictNode2 = g_objLexSearch.SearchWord("not",nSearchMod);
pDictNode1->m_pNextWordNode = pDictNode2;
pDictNode2->m_pPrevWordNode = pDictNode1;
pDictNode1->m_byDictForm = Orig_Form;
pDictNode2->m_byDictForm = Orig_Form;
//g_objMorSent.m_cDictAspect=Future_Tense;
//g_objMorSent.m_cDictAspect=Simple_Aspect;
//g_objMorSent.m_cDictNegative=Negative;
}
else if(strcmp(Word,"I'm")==0 )
{ //I'm
pDictNode1 = g_objLexSearch.SearchWord("I",nSearchMod);
ASSERT(pDictNode1 != NULL);
pDictNode2 = g_objLexSearch.SearchWord("am",nSearchMod);
//pDictNode2->m_pszOrig = new char[3];
pDictNode2->m_pszOrig= Mystrcpy(pDictNode2,"be",2);
pDictNode1->m_pNextWordNode = pDictNode2;
pDictNode2->m_pPrevWordNode = pDictNode1;
pDictNode1->m_byDictForm = Orig_Form;
pDictNode2->m_byDictForm = Orig_Form;
/*g_objMorSent.m_cDictAspect=Pre_Tense;
g_objMorSent.m_cDictAspect=Simple_Aspect;
g_objMorSent.m_byDictPerson=First_Person;
g_objMorSent.m_byDictNumber=Sing_Number; */
}
else
{
strcpy(tail,p+1);
p[0]='\0';
strcpy(head,Word);
if( tail[0] == '\0')
{ //Ws'
if(head[p-Word-1]=='s')
{
head[p-Word-1] = '\0';
if((pDictNode1 = g_objLexSearch.SearchWord(head,nSearchMod))!=NULL)
{
pDictNode1->m_pszEnglish = Mystrcpy(pDictNode1,inputword,1);
head[p-Word-1]=='\0';
//pDictNode1->m_pszOrig = new char[strlen(head)+1];
pDictNode1->m_pszOrig = Mystrcpy(pDictNode1,head,2);
pDictNode1->m_byDictGenetive = Have_Genetive;
Mystrcpy(pDictNode1,"ns",3);
pDictNode1->m_byDictNumber = Multi_Number;
pDictNode1->m_byDictForm = Orig_Form;
}
else
return CreateNewWord(inputword);
}
}
else if(strcmp(tail,"t")==0)
{ //n't
if(Word[WordLen-3] == 'n')
{
Word[WordLen-3] = '\0';
pDictNode1 = WordRestore(Word,SEARCH_FIRSTCH);
if(pDictNode1 != NULL)
{
//pDictNode1->m_cDictNegative = Negative;
pDictNode2 = g_objLexSearch.SearchWord("not",nSearchMod);
pDictNode1->m_pNextWordNode = pDictNode2;
pDictNode2->m_pPrevWordNode = pDictNode1;
return pDictNode1;
}
}
}
else if(strcmp(tail,"s")==0)
{ //W's
if( strcmp(head,"it")==0 || strcmp(head,"It")==0 ||
strcmp(head,"that")==0 || strcmp(head,"That")==0 ||
strcmp(head,"this")==0 || strcmp(head,"This")==0 ||
strcmp(head,"there")==0|| strcmp(head,"There")==0 ||
strcmp(head,"what")==0 || strcmp(head,"What")==0 ||
strcmp(head,"where")==0|| strcmp(head,"Where")==0)
{
pDictNode1 = g_objLexSearch.SearchWord(head,nSearchMod);
pDictNode1->m_byDictForm = Orig_Form;
ASSERT(pDictNode1 != NULL);
pDictNode2 = g_objLexSearch.SearchWord("is",nSearchMod);
//pDictNode2->m_pszOrig = new char[3];
pDictNode2->m_pszOrig = Mystrcpy(pDictNode2,"be",2);
pDictNode1->m_byDictForm = Orig_Form;
pDictNode1->m_byDictNumber = Sing_Number;
pDictNode1->m_pNextWordNode = pDictNode2;
pDictNode2->m_pPrevWordNode = pDictNode1;
}
else if(strcmp(head,"he")==0 ||strcmp(head,"He")==0 ||
strcmp(head,"she")==0 || strcmp(head,"She")==0 )
{
pDictNode1 = g_objLexSearch.SearchWord(head,nSearchMod);
ASSERT(pDictNode1 != NULL);
pDictNode2 = g_objLexSearch.SearchWord("is",nSearchMod);
//pDictNode2->m_pszOrig = new char[3];
pDictNode2->m_pszOrig = Mystrcpy(pDictNode2,"be",2);
pDictNode1->m_pNextWordNode = pDictNode2;
pDictNode2->m_pPrevWordNode = pDictNode1;
pDictNode2->m_byDictForm = Is_Has_Form;
pDictNode2->m_byDictNumber = Sing_Number;
}
else
{ //Word's
if((pDictNode1 =g_objLexSearch.SearchWord(head,nSearchMod)) != NULL)
{
pDictNode1->m_byDictGenetive = Have_Genetive;
Mystrcpy(pDictNode1,"ns",3);
pDictNode1->m_byDictNumber = Sing_Number;
Mystrcpy(pDictNode1,inputword,1);
}
else
return CreateNewWord(inputword);
}
}
else if(strcmp(tail,"ve")==0)
{ //W've
pDictNode1 = g_objLexSearch.SearchWord(head,nSearchMod);
if(pDictNode1 != NULL)
{
pDictNode2 = g_objLexSearch.SearchWord("have",nSearchMod);
pDictNode1->m_pNextWordNode = pDictNode2;
pDictNode2->m_pPrevWordNode = pDictNode1;
pDictNode2->m_byDictNumber=Multi_Number;
}
else
return CreateNewWord(inputword);
}
else if(strcmp(tail,"ll")==0)
{ //W'll
pDictNode1 = g_objLexSearch.SearchWord(head,nSearchMod);
if(pDictNode1 != NULL)
{
pDictNode2 = g_objLexSearch.SearchWord("will",nSearchMod);
pDictNode1->m_pNextWordNode = pDictNode2;
pDictNode2->m_pPrevWordNode = pDictNode1;
}
else
return CreateNewWord(inputword);
}
else if(strcmp(tail,"re")==0)
{ //W're
pDictNode1 = g_objLexSearch.SearchWord(head,nSearchMod);
if(pDictNode1 != NULL)
{
pDictNode2 = g_objLexSearch.SearchWord("are",nSearchMod);
pDictNode2->m_pszOrig = Mystrcpy(pDictNode2,"be",2);
pDictNode1->m_pNextWordNode = pDictNode2;
pDictNode2->m_pPrevWordNode = pDictNode1;
}
else
return CreateNewWord(inputword);
}
else if(strcmp(tail,"d")==0)
{ //W'd
if((pDictNode1=g_objLexSearch.SearchWord(head,nSearchMod)) != NULL)
{
pDictNode2 = g_objLexSearch.SearchWord("would",nSearchMod);
pDictNode1->m_pNextWordNode = pDictNode2;
pDictNode2->m_pPrevWordNode = pDictNode1;
pDictNode2->m_byDictForm = Would_had_Form;
}
else
return CreateNewWord(inputword);
}
else
return CreateNewWord(inputword);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -