📄 tense.cpp
字号:
if(CompareForm(end,Ed2_Form)) //ed2
{
pDict->m_cDictVoice = Passive_Voice;//state 18,19 一般(过去)将来时,被动
pDict = CombineNodes(pDict,end,end);
return pDict;
}
else if(CompareWord(end,"being"))//being
{
end = end->m_pNextWordNode;
if(CompareForm(end,Ed2_Form)) //ed2
{//state 20,21 一般(过去)将来进行时,被动
pDict->m_cDictAspect=Progressive_Aspect;
pDict->m_cDictVoice = Passive_Voice;//state 20,21
pDict = CombineNodes(pDict,end,end);
return pDict;
}
else
return pDict; //may have erro
}
else if(CompareForm(end,Ing_Form)) //ing
{ //state 22,23 一般(过去)将来进行时,主动
pDict->m_cDictAspect=Progressive_Aspect;
pDict = CombineNodes(pDict,end,end);
return pDict;
}
}
else if(CompareWord(CurPosOuter->m_pNextWordNode,"have"))//have
{
end = CurPosOuter->m_pNextWordNode->m_pNextWordNode;
if(CompareWord(end,"been"))//been
{
end = end->m_pNextWordNode;
if(CompareForm(end,Ed2_Form)) //ed2
{ //state 26,27 一般(过去)将来完成时,被动
pDict->m_cDictAspect=Perfect_Aspect;
pDict->m_cDictVoice = Passive_Voice;
pDict = CombineNodes(pDict,end,end);
return pDict;
}
else
if(CompareForm(end,Ing_Form)) //ing
{ //state 26,27 一般(过去)将来完成进行时,主动
pDict->m_cDictAspect=PerfectProgressive_Aspect;
pDict->m_cDictVoice = Active_Voice;
pDict = CombineNodes(pDict,end,end);
return pDict;
}
else
return pDict; //may have erro
}
else
if(CompareForm(end,Ed2_Form)) //ed2
{ //24,25 一般(过去)将来完成时,主动
pDict->m_cDictAspect=Perfect_Aspect;
pDict = CombineNodes(pDict,end,end);
return pDict;
}
}
if(SearchCate(pDict->m_pNextWordNode,Cate_v))
{
if(pDict->m_pNextWordNode != NULL)
pDict = CombineNodes(pDict,pDict->m_pNextWordNode,pDict->m_pNextWordNode);
return pDict;
}
}
else if(CompareWord(pDict,"did"))
{
CurPosOuter = pDict;
if(CompareWord(CurPosOuter->m_pNextWordNode,"not")) //negative
{
pDict->m_cDictNegative=Negative;
CurPosOuter = CurPosOuter->m_pNextWordNode;
}
pDict->m_cDictTense=Past_Tense; //state 31 一般过去时
if(SearchCate(CurPosOuter->m_pNextWordNode,Cate_v))
{ //did not mind; 应判断not后是否有动词
CurPosOuter = CurPosOuter->m_pNextWordNode;
pDict = CombineNodes(pDict,CurPosOuter,CurPosOuter);
}
else
pDict = CombineNodes(pDict,CurPosOuter,pDict);
return pDict;
}
else if(CompareWord(pDict,"do") || CompareWord(pDict,"does"))
{ //state 32
CurPosOuter = pDict;
if(CompareWord(CurPosOuter,"does"))
{
pDict->m_byDictPerson=Third_Person;
pDict->m_byDictNumber=Sing_Number;
}
if(CompareWord(CurPosOuter->m_pNextWordNode,"not")) //negative
{
pDict->m_cDictNegative=Negative;
CurPosOuter = CurPosOuter->m_pNextWordNode;
}
if(SearchCate(CurPosOuter->m_pNextWordNode,Cate_v))
{ //do not mind
CurPosOuter = CurPosOuter->m_pNextWordNode;
pDict = CombineNodes(pDict,CurPosOuter,CurPosOuter);
}
else //do not
pDict = CombineNodes(pDict,CurPosOuter,pDict);
return pDict; //一般现在时
}
else if((CurPosOuter=HaveWord(pDict,NULL,Ed1_2_Form))!=NULL) //ed1
{ //state 30 一般过去时
pDict->m_cDictTense=Past_Tense;
return pDict;
}
return pDict;
}
*/
//蔡的程序中,要改动的函数: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:复数
*/
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_pszChinese = new char[10];
strcpy(pDictNode1->m_pFirstChin->m_pszChinese,pDictNode1->m_pszEnglish);
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,"here")==0|| strcmp(head,"Here")==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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -