Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
//   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;
}
Ejemplo n.º 3
0
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;
		}
	}
}
Ejemplo n.º 4
0
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;
}