?? tense.cpp
字號:
#include "stdafx.h"
#include "PosTag.h"
#include "ChildFrm.h"
#include "mainstru.h"
#ifndef _LXH_H
#include "lxh.h"
#endif
#ifndef DICTDEF_H
#include "dictdef.h"
#endif
#define Cate_v Cate_END+100
/*
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_byDictPerson; //1:第一人稱,2:第二人稱,3:第三人稱
BYTE m_byDictNumber; //0:單數,1:復數
*/
extern char * Mystrcpy(DictNode *pDictNode,char *Word,int Option);
//DictNode *CombineNodes(DictNode *Begin,DictNode *End,DictNode *Center);
DictNode *HaveWord(struct DictNode *begin, char *word, int form);
#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
int MorphorAnalyze(char *sen);
DictNode* WordRestore(char *inputword, int nSearchMod);
BOOL SearchCate(DictNode *pDictNode,int Cate);
void DictWordInit(DictNode* pDictNode); //called by Caim
//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 *HaveWord(struct DictNode *begin, char *word, int form)
{ // 在句子第begin個詞是否為具有形態form的單詞word,,失敗返回-1,
if(begin == NULL)
return NULL;
if(word==NULL)
{
if(begin->m_byDictForm==form ||
((form==Ed1_Form || form ==Ed2_Form)&& begin->m_byDictForm==Ed1_2_Form))
return begin;
}
else if(form!=-1) //查特定形態的詞
{
if((begin->m_byDictForm==form ||
((form==Ed1_Form || form ==Ed2_Form)&& begin->m_byDictForm==Ed1_2_Form)) &&
strcmp(begin->m_pszEnglish,word)==0)
return begin;
}
else //form=-1 //查特定的詞,形態任意
{
if((begin->m_pszOrig != NULL && strcmp(begin->m_pszOrig,word)==0) ||
(begin->m_pszEnglish != NULL && strcmp(begin->m_pszEnglish,word)==0))
return begin;
}
return NULL;
}
/*
BOOL CompareWord(struct DictNode *Node,char *word)
{
// 句子第pos個詞是否等于單詞word
if(Node==NULL)
return FALSE;
return( !strcmp(Node->m_pszEnglish,word));
}
BOOL CompareForm(struct DictNode *Node,int form)
{ // 句子第pos個詞是否為詞形form
if(Node==NULL)
return FALSE;
if(Node->m_byDictForm==form ||
((form==Ed1_Form || form ==Ed2_Form)&& Node->m_byDictForm==Ed1_2_Form))
return TRUE;
else
return FALSE;
}
void SetDefTense()
{
g_objMorSent.m_cTense=Pre_Tense; //default value
g_objMorSent.m_cAspect=Simple_Aspect;
g_objMorSent.m_cMood =Declarative_Mood;
g_objMorSent.m_cVoice = Active_Voice;
g_objMorSent.m_cNegative=Positive;
g_objMorSent.m_byPerson=Third_Person;
g_objMorSent.m_byNumber=Sing_Number; //default value
}
DictNode *CombineNodes(DictNode *Begin,DictNode *End,DictNode *Center)
{
DictNode * TobeDelete, *PrevNode, *NextNode;
char Phrase[150],PhraseOrig[150];
Center->m_byDictForm = Begin->m_byDictForm ;
Center->m_byDictGenetive= Begin->m_byDictGenetive;
Center->m_cDictTense = Begin->m_cDictTense ;
Center->m_cDictAspect = Begin->m_cDictAspect ;
Center->m_cDictVoice = Begin->m_cDictVoice ;
Center->m_cDictNegative = Begin->m_cDictNegative;
Center->m_byDictPerson = Begin->m_byDictPerson ;
Center->m_byDictNumber = Begin->m_byDictNumber ;
//cdq changed 12.10
if ( strcmp(Begin->m_pszOrig,"have")==0 &&
strcmp(End->m_pszEnglish,"been")==0 )
{
Mystrcpy(Center,"@Cate=be",3);
}
else
{
Mystrcpy(Center,"@Cate=v",3);
}
PrevNode = Begin->m_pPrevWordNode;
NextNode = End->m_pNextWordNode;
strcpy(Phrase,"\0");
strcpy(PhraseOrig,"\0");
while(Begin != End && Begin!=NULL)
{
TobeDelete = Begin;
strcat(Phrase,Begin->m_pszEnglish);
strcat(Phrase," ");
strcat(PhraseOrig,Begin->m_pszOrig);
strcat(PhraseOrig," ");
Begin = Begin->m_pNextWordNode;
if(TobeDelete != Center)
g_objLexSearch.FreeNode(TobeDelete);
}
strcat(Phrase,End->m_pszEnglish);
strcat(PhraseOrig,End->m_pszOrig);
Mystrcpy(Center,Phrase,1);
Mystrcpy(Center,PhraseOrig,2);
if(End != Center)
g_objLexSearch.FreeNode(End);
Center->m_pPrevWordNode = PrevNode;
Center->m_pNextWordNode = NextNode;
if(PrevNode != NULL)
PrevNode->m_pNextWordNode = Center;
if(NextNode != NULL)
NextNode->m_pPrevWordNode = Center;
return Center;
}
DictNode *TenseAnalyse(DictNode *pDict)
{
//int CurPosOuter,CurPosMiddle,CurPosInner;
struct DictNode *CurPosOuter,*CurPosMiddle,*end;
if((CurPosOuter=HaveWord(pDict,"be",-1))!=NULL)
{ //is, am, are, was,were
if(CompareForm(CurPosOuter,Ed1_Form)) //was,were
{
pDict->m_cDictTense=Past_Tense;
if(CompareWord(CurPosOuter,"was")) //was
{
pDict->m_byDictPerson=Third_Person;
pDict->m_byDictNumber=Sing_Number;
}
else //were
{
pDict->m_byDictNumber=Multi_Number;
}
}
else if(CompareForm(CurPosOuter,Ed2_Form)) //been
return pDict;
else
{
if(CompareWord(CurPosOuter,"is")) //is
{
pDict->m_byDictPerson=Third_Person;
pDict->m_byDictNumber=Sing_Number;
}
else if(CompareWord(CurPosOuter,"am")) //am
{
pDict->m_byDictPerson=First_Person;
pDict->m_byDictNumber=Sing_Number;
}
else if(CompareWord(CurPosOuter,"are")) //are
{
pDict->m_byDictNumber=Multi_Number;
}
}
if(CompareWord(CurPosOuter->m_pNextWordNode,"not")) //negative
{
pDict->m_cDictNegative=Negative;
CurPosOuter = CurPosOuter->m_pNextWordNode;
}
if((CurPosMiddle=HaveWord(CurPosOuter->m_pNextWordNode,NULL,Ed2_Form))!=NULL) //ed2
{
pDict->m_cDictVoice = Passive_Voice;
pDict = CombineNodes(pDict,CurPosMiddle,CurPosMiddle);
return pDict; //state = 2 or 6, 一般現在(過去)被動
}
else if(CompareWord(CurPosOuter->m_pNextWordNode,"being"))//being //cdq changed 12.22
{
end = CurPosOuter->m_pNextWordNode->m_pNextWordNode;
if((HaveWord(end,NULL,Ed2_Form))!=NULL) //ed2
{
pDict->m_cDictAspect=Progressive_Aspect;
pDict->m_cDictVoice = Passive_Voice;
pDict = CombineNodes(pDict,end,end);
return pDict; //state = 4 or 8 現在(過去)進行時,被動
}
}
else if((CurPosMiddle=HaveWord(CurPosOuter->m_pNextWordNode,NULL,Ing_Form))!=NULL)//ing
{
pDict->m_cDictAspect=Progressive_Aspect;
pDict = CombineNodes(pDict,CurPosMiddle,CurPosMiddle);
return pDict; //state = 3 or 7 現在(過去)進行
}
}
else if((CurPosOuter=HaveWord(pDict,"have",-1))!=NULL) //have,has,had
{
if(CompareForm(CurPosOuter,Ed1_2_Form)) //had
pDict->m_cDictTense=Past_Tense;
else
{
pDict->m_cDictTense=Pre_Tense;
if(CompareWord(CurPosOuter,"has")) //has
{
pDict->m_byDictPerson=Third_Person;
pDict->m_byDictNumber=Sing_Number;
}
else //have
{
pDict->m_byDictNumber=Multi_Number;
}
}
if(CompareWord(CurPosOuter->m_pNextWordNode,"not")) //negative
{
pDict->m_cDictNegative=Negative;
CurPosOuter = CurPosOuter->m_pNextWordNode;
}
if(CompareWord(CurPosOuter->m_pNextWordNode,"been"))//been
{
end = CurPosOuter->m_pNextWordNode->m_pNextWordNode;
if(CompareForm(end,Ed2_Form))//ed2
{
pDict->m_cDictAspect =Perfect_Aspect;
pDict = CombineNodes(pDict,end,end);
return pDict; //state = 12 or 13 現在(過去)完成時,被動
}
else
if(CompareForm(end,Ing_Form))//ing
{
pDict->m_cDictAspect =PerfectProgressive_Aspect;
pDict = CombineNodes(pDict,end,end);
return pDict; //state = 14 or 15 現在(過去)完成進行時
}
//cdq changed
/*
else
if(CompareWord(end,"to"))
{
DictNode* pDictNode;
int i;
pDictNode = new DictNode;
i = strlen("been to");
pDictNode->m_nLxhCate = NULL;
pDictNode->m_pszEnglish = new char[i+1];
pDictNode->m_pszOrig = new char[i+1];
strcpy(pDictNode->m_pszEnglish,"been to");
strcpy(pDictNode->m_pszOrig,"been to");
pDictNode->m_byDictForm = STYLE_ORIG;
pDictNode->m_byDictNumber = Sing_Number;
pDictNode->m_byMaxPhraseLen = DefaMaxPhraseLen;
pDictNode->m_pNextWordNode = end->m_pNextWordNode;
pDictNode->m_pPrevWordNode = CurPosOuter;
pDictNode->m_nEnglishLen = i;
pDictNode->m_bIsExistOrig = TRUE;
pDictNode->m_nOrigLen = i;
pDictNode->m_nWordStyle = 0;
pDictNode->m_bIsExistAmbig = 0;
pDictNode->m_pszAmbig = NULL;
pDictNode->m_nAmbigLen = 0;
pDictNode->m_nChinNum = 1;
pDictNode->m_pFirstChin = new DictChin;
pDictNode->m_pFirstChin->m_pszChinese=new char[6];
strcpy(pDictNode->m_pFirstChin->m_pszChinese,"去過");
pDictNode->m_pFirstChin->m_nChineseLen=
strlen(pDictNode->m_pFirstChin->m_pszChinese);
pDictNode->m_pFirstChin->m_nCate=Cate_vt;
end=pDictNode;
CurPosOuter->m_pNextWordNode=end;
CurPosOuter->m_pNextWordNode->m_pNextWordNode->m_pPrevWordNode=end;
pDict->m_cDictAspect =PerfectProgressive_Aspect;
pDict = CombineNodes(pDict,end,end);
return pDict;
}
*/
/* else
{
pDict->m_cDictAspect =Perfect_Aspect;
end =CurPosOuter->m_pNextWordNode;
pDict = CombineNodes(pDict,end,end);
return pDict; //state = 10 or 11 現在(過去)完成時
}
}
else if((CurPosMiddle=HaveWord(CurPosOuter->m_pNextWordNode,NULL,Ed2_Form))!=NULL) //ed2
{
pDict->m_cDictAspect =Perfect_Aspect;
pDict = CombineNodes(pDict,CurPosMiddle,CurPosMiddle);
return pDict; //state = 10 or 11 現在(過去)完成時
}
}
else if((CurPosOuter=HaveWord(pDict,"will",-1))!=NULL) //will,would
{
if(CompareForm(CurPosOuter,Ed1_Form))
pDict->m_cDictTense=Pastfuture_Tense;
else
pDict->m_cDictTense=Future_Tense;
if(CompareWord(CurPosOuter->m_pNextWordNode,"not")) //negative
{
pDict->m_cDictNegative=Negative;
CurPosOuter = CurPosOuter->m_pNextWordNode;
}
if(CompareWord(CurPosOuter->m_pNextWordNode,"be")) //be
{
end = CurPosOuter->m_pNextWordNode->m_pNextWordNode;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -