📄 wordres.cpp
字号:
pDictNode->m_pFirstChin->m_nCate=Cate_number;
pDictNode->m_pFirstChin->m_nSlotNum = 1;
pDictNode->m_pFirstChin->m_pwSlotLink =
new WORD[pDictNode->m_pFirstChin->m_nSlotNum*2+1];
memcpy( pDictNode->m_pFirstChin->m_pwSlotLink,&Sem_OrdnlNU,sizeof(WORD));
Mystrcpy(pDictNode,"number",3);
return pDictNode;
}//cdq add end
void DictWordInit(DictNode* pDictNode) //called by Caim
{ //in diction.cpp DictWordInit(m_pDictNode);
pDictNode->m_pNextWordNode = NULL;
pDictNode->m_pPrevWordNode = NULL;
pDictNode->m_byDictForm = Orig_Form;
pDictNode->m_nLxhCate = NULL;
pDictNode->m_nLxhCateLen = 0;
pDictNode->m_byDictGenetive = No_Genetive; //1:所有格
pDictNode->m_cDictTense = Pre_Tense; //时态:0现在,1过去,2将来,3过去将来
pDictNode->m_cDictAspect = Simple_Aspect; //体态:0一般,1进行,2完成,3完成进行
pDictNode->m_cDictVoice = Active_Voice; //0:主动,1:被动
pDictNode->m_cDictNegative = Positive; //0:肯定,1:否定,
pDictNode->m_byDictPerson = Third_Person; //1:第一人称,2:第二人称,3:第三人称
pDictNode->m_byDictNumber = Sing_Number; //0:单数,1:复数
if(pDictNode->m_bIsExistOrig != FALSE)
pDictNode->m_byDictForm = pDictNode->m_nWordStyle;
else
pDictNode->m_byDictForm = Orig_Form;
pDictNode->m_byDictNumber = Sing_Number;
pDictNode->m_byDictGenetive = No_Genetive;
if(pDictNode->m_bIsExistOrig == FALSE ||
pDictNode->m_pszOrig==NULL)
{
pDictNode->m_pszOrig = Mystrcpy(pDictNode,
pDictNode->m_pszEnglish,2);
}
}
void LxhFreeDictNode(DictNode *pDictNode) //called by Caim
{
if(pDictNode != NULL && pDictNode->m_nLxhCate != NULL)
{
delete pDictNode->m_nLxhCate;
pDictNode->m_nLxhCate = NULL;
pDictNode->m_nLxhCateLen = 0;
}
}
BOOL SearchCate(DictNode *pDictNode,int Cate)
{
DictChin *m_pChin;
if(pDictNode == NULL)
return FALSE;
m_pChin = pDictNode->m_pFirstChin;
while(m_pChin != NULL)
{
if(Cate == Cate_v)
{
if(m_pChin->m_nCate == Cate_vd)
return TRUE;
else if(m_pChin->m_nCate == Cate_ved)
return TRUE;
else if(m_pChin->m_nCate == Cate_vi)
return TRUE;
else if(m_pChin->m_nCate == Cate_ving)
return TRUE;
else if(m_pChin->m_nCate == Cate_vl)
return TRUE;
else if(m_pChin->m_nCate == Cate_vt)
return TRUE;
}
else
if(m_pChin->m_nCate == Cate)
return TRUE;
m_pChin = m_pChin->m_pNextChin;
}
return FALSE;
}
BOOL SearchHead(DictNode *pDictNode,int Head)
{
DictChin *m_pChin;
if(pDictNode == NULL)
return FALSE;
m_pChin = pDictNode->m_pFirstChin;
while(m_pChin != NULL)
{
if(m_pChin->m_nHead == Head)
return TRUE;
else
m_pChin = m_pChin->m_pNextChin;
}
return FALSE;
}
BOOL SearchCase(DictNode *pDictNode,int Case)
{
DictChin *m_pChin;
int i;
if(pDictNode == NULL)
return FALSE;
m_pChin = pDictNode->m_pFirstChin;
while(m_pChin != NULL)
{
for(i=0;i<m_pChin->m_nSlotNum;i++)
if(m_pChin->m_pwSlotLink[i] == Case)
break;
if(i < m_pChin->m_nSlotNum)
return TRUE;
else
m_pChin = m_pChin->m_pNextChin;
}
return FALSE;
}
char * Mystrcpy(DictNode *pDictNode,char *Word,int Option)
{ //Option:1, resource; 2: Original, 3: LxhCate
int StrLen = strlen(Word)+1;
if(Option == 1)
{
if(pDictNode->m_pszEnglish != NULL)
delete pDictNode->m_pszEnglish;
pDictNode->m_pszEnglish = new char[StrLen];
strcpy(pDictNode->m_pszEnglish,Word);
pDictNode->m_nEnglishLen = StrLen-1;
return pDictNode->m_pszEnglish;
}
else if (Option ==2)
{
if(pDictNode->m_pszOrig != NULL)
delete pDictNode->m_pszOrig;
pDictNode->m_pszOrig = new char[StrLen];
strcpy(pDictNode->m_pszOrig,Word);
pDictNode->m_nOrigLen = StrLen-1;
return pDictNode->m_pszOrig;
}
else if (Option == 3)
{
if(pDictNode->m_nLxhCate != NULL)
delete pDictNode->m_nLxhCate;
pDictNode->m_nLxhCate = new char[StrLen];
strcpy(pDictNode->m_nLxhCate,Word);
pDictNode->m_nLxhCateLen = StrLen-1;
return pDictNode->m_pszOrig;
}
return NULL;
}
void FreeSentence(SentenceType * Sen)
{ //释放句子结点
DictNode * pDict1, *pDict2;
pDict1 = Sen->m_pWordFirst;
while(pDict1 != NULL)
{
pDict2 = pDict1->m_pNextWordNode;
g_objLexSearch.FreeNode(pDict1);
pDict1=pDict2;
}
}
void ModifyPreWord()
{ //确定为is或has, had或would
if(g_objMorSent.m_pWordLast==NULL)
return;
if(g_objMorSent.m_pWordLast->m_byDictForm==Is_Has_Form)
{
Mystrcpy(g_objMorSent.m_pWordLast, "has",1);
//g_objMorSent.m_pWordLast->m_pszOrig = new char[strlen("have")+1];
g_objMorSent.m_pWordLast->m_pszOrig =
Mystrcpy(g_objMorSent.m_pWordLast, "have",2);
g_objMorSent.m_pWordLast->m_byDictNumber=Sing_Number;
}
else if(g_objMorSent.m_pWordLast->m_byDictForm==Would_had_Form)
{
Mystrcpy(g_objMorSent.m_pWordLast, "had",1);
g_objMorSent.m_pWordLast->m_pszOrig =
Mystrcpy(g_objMorSent.m_pWordLast, "have",2);
g_objMorSent.m_pWordLast->m_byDictForm = Past_Tense;
g_objMorSent.m_pWordLast->m_byDictNumber=Multi_Number;
}
}
/*void OutputDictInformation(DictNode * pDict, FILE *fpres)
{
//fputc('\n',fpres);
fputs(" Tense:",fpres);
switch(pDict->m_cDictTense)
{
case Pre_Tense:
fputs("现在",fpres);
break;
case Past_Tense:
fputs("过去",fpres);
break;
case Future_Tense:
fputs("将来",fpres);
break;
case Pastfuture_Tense:
fputs("过去将来",fpres);
break;
}
fputs(" Aspect:",fpres);
switch(pDict->m_cDictAspect)
{ //0一般,1进行,2完成,3完成进行
case Simple_Aspect:
fputs("一般",fpres);
break;
case Progressive_Aspect:
fputs("进行",fpres);
break;
case Perfect_Aspect:
fputs("完成",fpres);
break;
case PerfectProgressive_Aspect:
fputs("完成进行",fpres);
break;
}
fputs(" Voice:",fpres);
switch(pDict->m_cDictVoice)
{ //0:主动,1:被动
case Active_Voice:
fputs("主动",fpres);
break;
case Passive_Voice:
fputs("被动",fpres);
break;
}
fputs(" Negative:",fpres);
switch(pDict->m_cDictNegative)
{ //0:肯定,1:否定
case Positive:
fputs("肯定",fpres);
break;
case Negative:
fputs("否定",fpres);
break;
}
fputs("\n Person:",fpres);
switch(pDict->m_byDictPerson)
{ //1:第一人称,2:第二人称,3:第三人称
case First_Person:
fputs("第一人称",fpres);
break;
case Second_Person:
fputs("第二人称",fpres);
break;
case Third_Person:
fputs("第三人称",fpres);
break;
}
fputs(" Number:",fpres);
switch(pDict->m_byDictNumber)
{ //0:单数,1:复数
case Sing_Number:
fputs("单数",fpres);
break;
case Multi_Number:
fputs("复数",fpres);
break;
}
fputc('\n',fpres);
fputs(" Ambig:",fpres);
if(pDict->m_pszAmbig !=NULL)
fputs(pDict->m_pszAmbig, fpres);
fputs(" ",fpres);
fputs(" LxhCate:",fpres);
if(pDict->m_nLxhCate != NULL)
fputs(pDict->m_nLxhCate, fpres);
fputc('\n',fpres);
}
*/
int MorphorAnalyze(char *sen)
{ //分析单个句子
int i=0,j=0,WordNo=0,IsWord[MaxWordNo];
char Words[MaxWordNo][MaxWordLength],*p,*head,str[32],numstr[128];
struct DictNode *NewDicNode,*pDict,*CurNode,*NumBegin,*NumEnd;
int NewWordNo = 0;
BOOL FirstCharacter;
g_objMorSent.m_pWordFirst=g_objMorSent.m_pWordLast = NULL;
p =head = sen; //切词
while(p[0] !=0)
{
FirstCharacter = TRUE;
while(p[0]!= ' ' && p[0]!= '(' && p[0]!= ')' &&
p[0]!= '\"' && p[0] !='\0')
{
if(p[0] == '-' && p[1] == '-')
{
p+=2;
break;
}
else if(p[0] == ':' || p[0]== ';' || p[0]== '!' || p[0]== '?')
{
if(p[1]==' ' || p[1]=='\n' || head[p-head+1]=='\0')
break;
}
else if(p[0] == '.' )
{
if(FirstCharacter && p[0] == '.')
{ //省略号的处理
while(p[0] == '.')
p++;
break;
}
if(head[p-head+1]==' ' || head[p-head+1]=='\n' || head[p-head+1]=='\0')
{ //句号
strncpy(str,head,p-head);
str[p-head]='\0';
if(IsAbreivWord(str))
p++;
break;
}
else if(head[p-head+1]=='.' && head[p-head+2]=='.')
break; //后为省略号
}
else if(p[0] == ',')
{
if(head[p-head+1]==' ' || head[p-head+1]=='\n' || head[p-head+1]=='\0')
break;
}
p++;
FirstCharacter = FALSE;
}
if(p-head < MaxWordLength)
{ //词不能太长
if(p == head)
p++; //标点
IsWord[WordNo] = TRUE;
strncpy(Words[WordNo],head,p-head);
Words[WordNo++][p-head] = '\0';
}
while((*p == ' ' || *p == '\r' ||*p == '\n' )&& p[0] !='\0')
p++;
if(p[0] == '\0') break;
head = p;
if(i>=MaxWordNo)
break; //词不能太多
} //切词
if(bNoTranCapStr)
{ // 不翻译连续大写的字符串
for(i=0;i<WordNo;i++)
{
if(isupper(Words[i][0]) && !isAppellation(Words[i]) && i!=0) //cdq changed 12.28
{
if(NewWordNo != i)
strcpy(Words[NewWordNo],Words[i]);
j = i+1;
while(j<WordNo && isupper(Words[j][0]) &&
!(j==1 && strcmp(Words[j],"I")==0 ))
{
strcat(Words[NewWordNo]," ");
strcat(Words[NewWordNo],Words[j]);
j++;
}
if(j<WordNo)
strcpy(Words[++NewWordNo],Words[j]);
i = j;
}
else
strcpy(Words[NewWordNo],Words[i]);
NewWordNo ++;
}
WordNo = NewWordNo;
} // 不翻译连续大写的字符串
for(i=0;i<WordNo;i++) //查词典,词形还原
{
//cdq changed 12.11
if(i==0)
{
if ( strcmp(Words[i],"May")==0 )
{
if ( strcmp(Words[i+1],"I")==0 ||
strcmp(Words[i+1],"we")==0 )
NewDicNode = WordRestore(Words[i],SEARCH_FIRSTCH);
else
NewDicNode = g_objLexSearch.SearchWord(Words[i]);
}
else
NewDicNode = WordRestore(Words[i],SEARCH_FIRSTCH);
}
else
NewDicNode = WordRestore(Words[i],SEARCH_ALLCH);
if(NewDicNode==NULL)
continue;
if(g_objMorSent.m_pWordFirst==NULL)
{
g_objMorSent.m_pWordFirst = g_objMorSent.m_pWordLast = NewDicNode;
while(g_objMorSent.m_pWordLast->m_pNextWordNode != NULL)
g_objMorSent.m_pWordLast=g_objMorSent.m_pWordLast->m_pNextWordNode;
}
else
{
g_objMorSent.m_pWordLast->m_pNextWordNode = NewDicNode;
NewDicNode->m_pPrevWordNode = g_objMorSent.m_pWordLast;
g_objMorSent.m_pWordLast = NewDicNode;
while(g_objMorSent.m_pWordLast->m_pNextWordNode != NULL)
g_objMorSent.m_pWordLast=g_objMorSent.m_pWordLast->m_pNextWordNode;
}
} //查词典,词形还原
/*CurNode = g_objMorSent.m_pWordFirst; //数字翻译
while(CurNode!=NULL)
{
strcpy(numstr,"\0");
i = Cate_number; //test
if(SearchCate(CurNode,Cate_number) && CurNode->m_byDictForm==Orig_Form
&& CurNode->m_byDictGenetive == No_Genetive
&& SearchCate(CurNode->m_pNextWordNode,Cate_number)) //数词
//&& !((CurNode->m_pszOrig,"one") == 0 && !SearchCate(CurNode->m_pNextWordNode,Cate_number))) //数词
{
NumBegin = CurNode;
strcpy(numstr,CurNode->m_pszEnglish);
CurNode = NumEnd= CurNode->m_pNextWordNode;
while(SearchCate(CurNode,Cate_number) && CurNode->m_byDictForm==Orig_Form
&& CurNode->m_byDictGenetive == No_Genetive) //数词
{
NumEnd = CurNode;
strcat(numstr," ");
strcat(numstr,CurNode->m_pszEnglish);
NumBegin->m_pNextWordNode = NumEnd->m_pNextWordNode;
if(NumEnd->m_pNextWordNode != NULL)
NumEnd->m_pNextWordNode->m_pPrevWordNode = NumBegin;
CurNode = CurNode->m_pNextWordNode;
g_objLexSearch.FreeNode(NumEnd); //释放
if(CurNode != NULL && strcmp(CurNode->m_pszEnglish,"and")==0)
CurNode = CurNode->m_pNextWordNode;
}
NumBegin->m_pszEnglish = Mystrcpy(NumBegin, numstr,1);
NumBegin->m_pszOrig = Mystrcpy(NumBegin, ltoa(OuterNumTran(numstr),numstr,10),2);
Mystrcpy(NumBegin,"dig",3);
}
if(CurNode != NULL)
CurNode = CurNode->m_pNextWordNode;
} //数字翻译
pDict = g_objMorSent.m_pWordFirst;
*/
/*while(pDict != NULL)
{
pDict = TenseAnalyse(pDict); //时态、语态分析
if(pDict == NULL)
break;
if(pDict->m_byDictForm == Ing_Form &&
pDict->m_cDictAspect != Progressive_Aspect &&
pDict->m_cDictAspect != PerfectProgressive_Aspect)
Mystrcpy(pDict,"ving",3);
if(pDict->m_pPrevWordNode== NULL)
g_objMorSent.m_pWordFirst = pDict;
if(pDict->m_pNextWordNode== NULL)
g_objMorSent.m_pWordLast = pDict;
pDict = pDict->m_pNextWordNode;
}*/
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -