bool Hugs::ShowError(LPCTSTR Input, LPCTSTR Result) { LPCTSTR UndefVar = "ERROR - Undefined variable \""; int iUndefVar = (int) strlen(UndefVar); LPCTSTR UntermStr = "ERROR - Improperly terminated string"; LPCTSTR UntermChr = "ERROR - Improperly terminated character constant"; if (strncmp(Result, UndefVar, iUndefVar) == 0) { LPTSTR Name = (LPTSTR) &Result[iUndefVar]; LPTSTR NameEnd = strchr(Name, '\"'); NameEnd[0] = 0; Lexer lex(Input); LexList ll(&lex); for (LexList* i = ≪ i != NULL; i = i->Next) { if (strcmp(i->Str, Name) == 0) i->Lex = LexError; } NameEnd[0] = '\"'; output->AppendLex(&ll); return true; } else if (IsPrefix(UntermStr, Result) || IsPrefix(UntermChr, Result)) { Lexer lex(Input); LexList ll(&lex); for (LexList* i = ≪ i != NULL; i = i->Next) { if (i->Lex == LexString && (i->Length <= 1 || i->Str[0] != i->Str[i->Length-1])) i->Lex = LexError; } output->AppendLex(&ll); return true; } else return false; }
// CLemmatizer::LemmatizeWord should return true if // the word was found in the dictionary, if it was predicted, then it returns false bool CLemmatizer::LemmatizeWord(string& InputWordStr, const bool cap, const bool predict, vector<CAutomAnnotationInner>& results, bool bGetLemmaInfos) const { RmlMakeUpper (InputWordStr, GetLanguage()); size_t WordOffset = 0; m_pFormAutomat->GetInnerMorphInfos(InputWordStr, 0, results); bool bResult = !results.empty(); if (results.empty()) { if (m_bUsePrediction) { PredictBySuffix(InputWordStr, WordOffset, 4, results); // the length of the minal suffix is 4 if (InputWordStr[WordOffset-1] != '-') // and there is no hyphen { size_t KnownPostfixLen = InputWordStr.length()-WordOffset; size_t UnknownPrefixLen = WordOffset; if (KnownPostfixLen < 6)// if the known part is too short //if (UnknownPrefixLen > 5)// no prediction if unknown prefix is more than 5 { if (!IsPrefix(InputWordStr.substr(0, UnknownPrefixLen))) results.clear(); }; }; // отменяем предсказание по местоимениям, например "Семыкиным" for (size_t i=0; i<results.size(); i++) if (m_NPSs[results[i].m_ModelNo] == UnknownPartOfSpeech) { results.clear(); break; }; }; }; if (!results.empty()) { if (bGetLemmaInfos) GetLemmaInfos(InputWordStr, WordOffset, results); } else if (m_bUsePrediction) { PredictByDataBase(InputWordStr, results,cap); }; return bResult; }
VOID MakeDelta2(INT *Delta2, BYTE *pSign, DWORD dwSignLen) { INT iI, iSuffixLen; INT LastPrefixIndex = dwSignLen - 1; for (iI = dwSignLen - 1; iI >= 0; iI--) { if (IsPrefix(pSign, dwSignLen, iI + 1)) { LastPrefixIndex = iI + 1; } Delta2[iI] = LastPrefixIndex + (dwSignLen - 1 - iI); } for (iI = 0; iI<dwSignLen - 1; iI++) { iSuffixLen = SuffixLength(pSign, dwSignLen, iI); if (pSign[iI - iSuffixLen] != pSign[dwSignLen - 1 - iSuffixLen]) { Delta2[dwSignLen - 1 - iSuffixLen] = dwSignLen - 1 - iI + iSuffixLen; } } }
void scan(Trienode* var_map, char* stmt) { char *_temp_id = (char *)malloc(LINE_LENGTH_MAX * sizeof(char)); char *_type = (char *)malloc(WORD_LENGTH_MAX * sizeof(char)); void *_value = NULL; char *_stmt_o = stmt; if (IsPrefix(&stmt, "int") || IsPrefix(&stmt, "double")) { //variables declaration int _tt = 0; double _ff = 0.0; if (IsPrefix(&_stmt_o, "int")) { _type = "int"; _value = &_tt; } else { _type = "double"; _value = &_ff; } _temp_id = strtok(stmt, ","); while (_temp_id != NULL) { if (!IdCheck(&_temp_id)) { printf("Invalid identifier!\n"); break; } AddToTrie(var_map, _temp_id, _type, _value); _temp_id = strtok(NULL, ","); } } else if (IsPrefix(&stmt, "print")) { //print statements char* _temp_stmt = (char*)malloc(LINE_LENGTH_MAX * sizeof(char)); int _pos_i = 0, _pos_j = strlen(stmt); while (stmt[_pos_i] != '(') _pos_i++; while (stmt[_pos_j] != ')') _pos_j--; if (strchr(stmt, '(') == NULL) printf("\"(\" is missing here!\n"); if (strchr(stmt, ')') == NULL) printf("\")\" is missing here!\n"); _temp_stmt = GetSubstring(stmt, _pos_i + 1, _pos_j - _pos_i - 1); //printf("%s\n", _temp_stmt); Expression* _expr = GetAssign(&_temp_stmt); GetResult(_expr, var_map); PrintExprResult(_expr); } else { //normal statements Expression* _expr = GetAssign(&stmt); while (*stmt == ' ' || *stmt == ';') { stmt++; } if (strlen(stmt) != 0) { free(_expr); printf("Extra characters!\n"); } else { GetResult(_expr, var_map); /* PrintRPN(_expr); printf("\n"); PrintExprResult(_expr); */ } } return; }