// make a search for the user's input
// inside the database of the program
void CBot::find_match() 
{
	response_list.clear();
	
	// introduce thse new "string variable" to help 
	// support the implementation of keyword ranking 
	// during the matching process
	std::string bestKeyWord;
	std::vector<int> index_vector;

	for(int i = 0; i < nKnowledgeBaseSize; ++i) 
	{
		vstring keyWordList; // declaring variable for holding keywords

		// puting keywords from the current record to the keyWordList variable
		copy(KnowledgeBase[i].keyword, keyWordList, MAX_INP);

		for(int j = 0; j < keyWordList.size(); ++j)
		{
			std::string keyWord(keyWordList[j]);

			// we inset a space character
			// before and after the keyword to
			// improve the matching process
			insert_space(keyWord);
		
			// there has been some improvements made in
			// here in order to make the matching process
			// a littlebit more flexible
			if( m_sInput.find(keyWord) != std::string::npos ) 
			{
				if(keyWord.length() > bestKeyWord.length())
				{
					bestKeyWord = keyWord;
					index_vector.clear();
					index_vector.push_back(i);
				}
				else if(keyWord.length() == bestKeyWord.length())
				{
					index_vector.push_back(i);
				}
			}
		}	
	}
	if(index_vector.size() > 0)
	{
		m_sKeyWord = bestKeyWord;
		shuffle(index_vector, index_vector.size());
		copy( KnowledgeBase[index_vector[0]].response, response_list, MAX_RESP );
	}
}
Exemple #2
0
LexicalSymbol readLexem(void) {
  LexicalSymbol data;
  int identLen;
q0:
  switch( character) {
    case '{':
      readInput();
      goto q1;
    case '+':
      data.type = PLUS;
      readInput();

      return data;
    case '-':
      data.type = MINUS;
      readInput();

      return data;
    case '*':
      data.type = TIMES;
      readInput();

      return data;
    case '/':
      data.type = DIVIDE;
      readInput();

      return data;
    case '(':
      data.type = LPAR;
      readInput();

      return data;
    case ')':
      data.type = RPAR;
      readInput();

      return data;
    default:;
  }
  switch (input) {
    case WHITE_SPACE:
      readInput();
      goto q0;
    case END:
      data.type = EOI;
      return data;
    case LETTER:
      identLen = 1;
      data.ident[0] = character;
      readInput();
      goto q2;
    case NUMBER:
      data.number = character - '0';
      data.type = NUMB;
      readInput();
      goto q3;
    default:
      data.type = ERR;
      error("Invalid symbol.");
      return data;
  }

q1:
  switch(character) {
    case '}':
      readInput();
      goto q0;
    default:;
  }
  switch(input) {
    case END:
      data.type = ERR;
      error("Uneexpected end of file in a comment.");
      return data;
    default:
      readInput();
      goto q1;
  }

q2:
  switch(input) {
    case LETTER:
    case NUMBER:
      data.ident[identLen] = character;
      identLen++;
      readInput();
      goto q2;
    default:
      data.ident[identLen] = 0;
      data.type = keyWord(data.ident);
      return data;
  }

q3:
  switch(input) {
    case NUMBER:
      data.number = 10 * data.number + (character - '0');
      readInput();
      goto q3;
    default:
      return data;
  }

}
Exemple #3
0
LexicalSymbol readLexem ( void )
{
    LexicalSymbol data;
    int delkaId;

q0:
    switch ( character )
    {
        case '{':
            readInput ( );
            goto q1;

        case '+':
            data . type = PLUS;
            readInput ( );
            return data;

        case '-':
            data . type = MINUS;
            readInput ( );
            return data;

        case '*':
            data . type = TIMES;
            readInput ( );
            return data;

        case '/':
            data . type = DIVIDE;
            readInput ( );
            return data;

        case '(':
            data . type = LPAR;
            readInput ( );
            return data;

        case ')':
            data . type = RPAR;
            readInput ( );
            return data;

        case '=':
            data . type = EQ;
            readInput ( );
            return data;

        case '<':
            readInput ( );
            goto q4;

        case '>':
            readInput ( );
            goto q5;

        case ':':
            readInput ( );
            goto q6;

        case ',':
            data . type = COMMA;
            readInput ( );
            return data;

        case ';':
            data . type = SEMICOLON;
            readInput ( );
            return data;

        case '.':
            readInput ( );
            goto q10;

        case '0':
            data . number = 0;
            data . type = NUMB;
            readInput ( );
            goto q7;

        default:;
    }

    switch ( input )
    {
        case WHITE_SPACE:
            readInput ( );
            goto q0;

        case END:
            data . type = EOI;
            return data;

        case LETTER:
            delkaId = 1;
            data . ident [ 0 ] = character;
            readInput ( );
            goto q2;

        case NUMBER:
            data . number = character - '0';
            data . type = NUMB;
            readInput ( );
            goto q3;

        default:
            data . type = ERR;
            error ( "Nedovoleny znak." );
            return data;
    }

q1:
    switch ( character )
    {
        case '}':
            readInput ( );
            goto q0;

        default:;
    }

    switch ( input )
    {
        case END:
            data . type = ERR;
            error ( "Neocekavany konec souboru v komentari." );
            return data;

        default:
            readInput ( );
            goto q1;
    }

q2:
    switch ( input )
    {
        case LETTER:
        case NUMBER:
            data . ident [ delkaId ] = character;
            delkaId ++;
            readInput ( );
            goto q2;

        default:
            data . ident [ delkaId ] = 0;
            data . type = keyWord ( data . ident );
            return data;
    }

q3:
    switch ( input )
    {
        case NUMBER:
            data . number = 10 * data . number + ( character - '0' );
            readInput ( );
            goto q3;

        default:
            return data;
    }

q4:
    switch ( character )
    {
        case '=':
            data . type = LTE;
            readInput ( );
            return data;

        case '>':
            data . type = NEQ;
            readInput ( );
            return data;

        default:;
    }

    switch ( input )
    {
        default:
        data . type = LT;
        return data;
    }

q5:
    switch ( character )
    {
        case '=':
            data . type = GTE;
            readInput ( );
            return data;

        default:;
    }

    switch ( input )
    {
        default:
            data . type = GT;
            return data;
    }

q6:
    switch ( character )
    {
        case '=':
            readInput ( );
            data . type = ASSIGN;
            return data;

        default:;
    }

    switch ( input )
    {
        default:
            readInput ( );
            data . type = COLON;
            // data . type = ERR;
            // error ( "Ocekava se \'=\'." );
            return data;
    }

q7:
    switch ( character )
    {
        case 'x':
        case 'X':
            readInput ( );
            goto q8;

        default: ;
    }

    switch ( input )
    {
        case NUMBER:
            data . number = character - '0';
            readInput ( );
            goto q3;

        default:
            return data;
    }

q8:
    switch ( character )
    {
        case 'A': case 'a':
        case 'B': case 'b':
        case 'C': case 'c':
        case 'D': case 'd':
        case 'E': case 'e':
        case 'F': case 'f':
            data . number = 16 * data . number + toupper ( character ) - 'A' + 10;
            readInput ( );
            goto q9;

        default: ;
    }

    switch ( input )
    {
        case NUMBER:
            data . number = 16 * data . number + character - '0';
            readInput ( );
            goto q9;

        default:
            error ( "Chyba: V hexa zapisu ocekavam: 0x[a-fA-F0-9]+." );
    }


q9:
    switch ( character )
    {
        case 'A': case 'a':
        case 'B': case 'b':
        case 'C': case 'c':
        case 'D': case 'd':
        case 'E': case 'e':
        case 'F': case 'f':
            data . number = 16 * data . number + toupper ( character ) - 'A' + 10;
            readInput ( );
            goto q9;

        default: ;
    }

    switch ( input )
    {
        case NUMBER:
            data . number = 16 * data . number + character - '0';
            readInput ( );
            goto q9;

        default:
            return data;
    }

q10:
    switch ( character )
    {
        case '.':
            readInput ( );
            data . type = DOUBLEDOT;
            return data;
    }

    switch ( input )
    {
        default:
            data . type = DOT;
            return data;
    }

}
Exemple #4
0
LexicalSymbol readLexemInternal(void) {
	LexicalSymbol data;
	int delkaId;
	q0: switch (character) {
	case '{':
		data.type = LCURLY;
		readInput();
		return data;
	case '}':
		data.type = RCURLY;
		readInput();
		return data;
	case '+':
		readInput();
		if(character == '='){
			data.type = ADD_ASSIGN;
			readInput();
		}
		else if(character == '+'){
			data.type = INCREMENT;
			readInput();
		}
		else{
			data.type = PLUS;
		}
		return data;
	case '-':
		readInput();
		if(character == '='){
			data.type = SUB_ASSIGN;
			readInput();
		}
		else if(character == '-'){
			data.type = DECREMENT;
			readInput();
		}
		else{
			data.type = MINUS;
		}
		return data;
	case '*':
		readInput();
		if(character == '='){
			data.type = MUL_ASSIGN;
			readInput();
		}
		else{
			data.type = TIMES;
		}
		return data;
	case '/':
		readInput();
		goto q1;
	case '%':
		readInput();
		if(character == '='){
			data.type = MOD_ASSIGN;
			readInput();
		}
		else{
			data.type = MODULO;
		}
		return data;
	case '(':
		data.type = LPAR;
		readInput();
		return data;
	case ')':
		data.type = RPAR;
		readInput();
		return data;
	case '=':
		readInput();
		goto q6;
	case '<':
		readInput();
		goto q4;
	case '>':
		readInput();
		goto q5;
	case ':':
		data.type = COLON;
		readInput();
		return data;
	case ',':
		data.type = COMMA;
		readInput();
		return data;
	case ';':
		data.type = SEMICOLON;
		do{ // All following new lines ignored
			readInput();
		} while(input == NEW_LINE || input == WHITE_SPACE);
		return data;
	case '.':
		readInput();

		if (character == '.') {
			data.type = DOUBLE_DOT;
			readInput();
		} else {
			data.type = DOT;
		}
		return data;
	case '[':
		data.type = LBRAC;
		readInput();
		return data;
	case ']':
		data.type = RBRAC;
		readInput();
		return data;
	case '!':
		readInput();
		if(character == '='){
			data.type = NEQ;
			readInput();
		}
		else{
			data.type = LOG_NOT;
		}
		return data;
	case '|':
		readInput();
		if(character == '|'){
			data.type = LOG_OR;
			readInput();
		}
		else{
			data.type = BIT_OR;
		}
		return data;
	case '&':
		readInput();
		if(character == '&'){
			data.type = LOG_AND;
			readInput();
		}
		else{
			data.type = BIT_AND;
		}
		return data;
	case '^':
		data.type = XOR;
		readInput();
		return data;
	case '\"':
		delkaId = 0;
		readInput();
		goto q8;
	default:;
	}

	switch (input) {
	case NEW_LINE: // New line is treated as semicolon
		data.type = NEWLINE;
		do{ // All following new lines ignored
			readInput();
		} while(input == NEW_LINE || input == WHITE_SPACE);
		return data;
	case WHITE_SPACE:
		readInput();
		goto q0;
	case END:
		data.type = EOI;
		return data;
	case LETTER:
	case UNDERSCORE:
		delkaId = 1;
		data.ident[0] = character;
		readInput();
		goto q2;
	case NUMBER: {
		data.number = character - '0';
		data.type = NUMB;

		int zeroTest = data.number;

		readInput();

		if (zeroTest == 0 && input == LETTER && character == 'x') {
			/* read the 'x' symbol */
			readInput();
			goto q7;
		}

		goto q3;
	}
	default:
		data.type = ERR;
		error("Nedovoleny znak.");
		return data;
	}

	q1: //
	switch (character) {
	case '=':
		readInput();
		data.type = DIV_ASSIGN;
		return data;
	case '/': // One line comment
		do{
			readInput();
			if(input == END){
				error("Neocekavany konec souboru v komentari.");
				data.type = ERR;
				return data;
			}
		} while(input != NEW_LINE);
		readInput();
		goto q0;
	case '*': // Long comment
		readInput();
		goto q1a;
	default:
		data.type = DIVIDE;
		return data;
	}

	q1a: // Long comment
	switch (character) {
	case '*':
		readInput();
		if(character == '/'){
			readInput();
			goto q0;
		}
		goto q1a;
	case EOF:
		data.type = ERR;
		error("Neocekavany konec souboru v komentari.");
		return data;
	default:
		readInput();
		goto q1a;
	}

	q2: //
	switch (input) {
	case LETTER:
	case NUMBER:
	case UNDERSCORE:
		data.ident[delkaId] = character;
		delkaId++;
		readInput();
		goto q2;
	default:
		data.ident[delkaId] = 0;
		data.type = keyWord(data.ident);
		return data;
	}

	q3: //
	switch (input) {
	case NUMBER:
		data.number = 10 * data.number + (character - '0');
		readInput();
		goto q3;
	default:
		return data;
	}

	q4: //
	switch (character) {
	case '=':
		data.type = LTE;
		readInput();
		return data;
	case '<':
		data.type = LSHIFT;
		readInput();
		return data;
	default:
		break;
	}
	switch (input) {
	default:
		data.type = LT;
		return data;
	}

	q5: //
	switch (character) {
	case '=':
		data.type = GTE;
		readInput();
		return data;
	case '>':
		data.type = RSHIFT;
		readInput();
		return data;
	default:
		break;
	}
	switch (input) {
	default:
		data.type = GT;
		return data;
	}

	q6: //
	switch (character) {
	case '=':
		readInput();
		data.type = EQ;
		return data;
	default:
		data.type = ASSIGN;
		return data;
	}
	/*switch (input) {
	default:
		data.type = ERR;
		error("Ocekava se \'=\'.");
		return data;
	}*/

	q7: //
	switch (input) {
	case NUMBER:
		data.number = 16 * data.number + (character - '0');
		readInput();
		goto q7;
	case LETTER:
		switch (character) {
		case 'a':
		case 'b':
		case 'c':
		case 'd':
		case 'e':
		case 'f':
			data.number = 16 * data.number + (character - 'a' + 10);
			readInput();
			goto q7;
		case 'A':
		case 'B':
		case 'C':
		case 'D':
		case 'E':
		case 'F':
			data.number = 16 * data.number + (character - 'A' + 10);
			readInput();
			goto q7;
		default:
			fprintf(stderr, "Unknown hexadecimal symbol.\n");
			exit(1);
		}
		break;
	default:
		return data;
	}

	q8:
	switch (character) {
	case '\"':
		data.ident[delkaId] = 0;
		data.type = STR;
		readInput();
		return data;
	case '\\':
		readInput();
		goto q9;
	default:
		data.ident[delkaId] = character;
		delkaId++;
		readInput();
		goto q8;
	}

	q9:
	switch (character) {
	case 'n':
		data.ident[delkaId] = '\n';
		delkaId++;
		readInput();
		goto q8;
	case 't':
		data.ident[delkaId] = '\t';
		delkaId++;
		readInput();
		goto q8;
	case 'b':
		data.ident[delkaId] = '\b';
		delkaId++;
		readInput();
		goto q8;
	case 'r':
		data.ident[delkaId] = '\r';
		delkaId++;
		readInput();
		goto q8;
	default:
		data.ident[delkaId] = character;
		delkaId++;
		readInput();
		goto q8;
	}
}
Exemple #5
0
void compile(QString path,QStringList& import,QFile &out){
    QFile fp(path);
    if(fp.open(QFile::ReadOnly)){
        QDir dir(QFileInfo(fp).absoluteDir());
        QString modName = QFileInfo(fp).baseName();
        if(readLine(fp).trimmed()!=FILE_HEAD){
            qDebug("Indicated file is not a algorithm file of Uranus2");
            exit(0);
        }
        int pIndent,cIndent=0,functionIndent=0;
        Function* function=0;
        QRegExp keyWord("(\\s*)(\\w+)\\s",Qt::CaseInsensitive);
        QRegExp argHook("(<.+>)?(.+)?");
        QLinkedList<StackItem*> stack;
        while(!fp.atEnd()){
            QString line=QString::fromUtf8(fp.readLine());
            keyWord.indexIn(line);
            QString key=keyWord.cap(2).toLower();
            line=line.mid(keyWord.cap().length()).trimmed();
            pIndent = cIndent;
            cIndent=keyWord.cap(1).length();
            if(cIndent<functionIndent){
                if(function!=0){
                    function->write(out);
                    function=0;
                }
            }else if(cIndent<=pIndent){
                while(pIndent>=cIndent){
                    pIndent--;
                    if(!stack.isEmpty()){
                        stack.pop_back();
                    }
                }
            }
            StackItem* parent = (stack.isEmpty())?0:stack.back(),
                    *self=new StackItem(key,line,cIndent);
            stack.push_back(self);

            if(key=="import"){
                import.append(dir.absoluteFilePath(line));
            }else if(key=="function"){
                function=new Function(modName,line);
                functionIndent=cIndent+1;
            }else if(key=="hint"){
                if(function!=0){
                    if(parent->key=="function")
                        self->indent++;
                    self->outBegin="#"+line;
                    function->append(self);
                }
            }else if(key=="arg"){
                if(parent->key=="function"&&function){
                    function->args()<<line;
                }
            }else if(key=="assign"){
                self->outBegin=line+"=";
                function->append(self);
            }else if(key=="value"){
                if(parent->key=="assign"){
                    argHook.indexIn(line);
                    if(argHook.cap(1)=="<list>"){
                    }else if(argHook.cap(1)=="<function>"){
                    }else if(argHook.cap(1)=="<variable>"){
                        self->outBegin=argHook.cap(2).trimmed();
                    }else{
                        self->outBegin=line.trimmed();
                    }
                    parent->addChild(self);
                }
            }else if(key=="branch"){
                self->outBegin="if True:";
                function->append(self);
            }else if(key=="call"){
                QString fname;
                if(line.left(3)=="://"){
                    fname=Function::conv(modName,line.mid(3));
                }else{
                    QStringList f = line.split("/");
                    if(f.count()==2){
                        fname=Function::conv(f.at(0),f.at(1));
                    }
                }
                self->outBegin=fname+"(";
                self->outSep=",";
                self->outEnd=")";
                if(parent->key=="do"){
                    function->append(self);
                }else{
                    parent->addChild(self);
                }
            }else if(key=="conditional"){
                self->outBegin="if True:";
                function->append(self);
            }else if(key=="do"){
            }else if(key=="list"){
                self->outBegin="[";
                self->outSep=",";
                self->outEnd="]";
                parent->addChild(self);
            }else if(key=="item"){
                argHook.indexIn(line);
                if(argHook.cap(1)=="<list>"){
                }else if(argHook.cap(1)=="<function>"){
                }else if(argHook.cap(1)=="<variable>"){
                    self->outBegin=argHook.cap(2).trimmed();
                }else{
                    self->outBegin=line.trimmed();
                }
                parent->addChild(self);
            }else if(key=="loop"){
                self->outBegin="if True:";
                function->append(self);
            }else if(key=="traverseloop"){
                self->outBegin="if True:";
                function->append(self);
            }else if(key=="traverse"){
                self->outBegin="for traverse in ";
                self->outEnd=":";
                function->append(self);
            }else if(key=="condition"){
                self->outEnd=":";
                if(parent->key=="branch"){
                    if(parent->data==0){
                        self->outBegin="if ";
                    }else{
                        self->outBegin="elif ";
                    }
                    parent->data=1;
                }else if(parent->key=="loop"){
                    self->outBegin="while ";
                }
                argHook.indexIn(line);
                if(argHook.cap(1)=="<list>"){
                }else if(argHook.cap(1)=="<function>"){
                }else if(argHook.cap(1)=="<variable>"){
                    self->outBegin+=argHook.cap(2).trimmed();
                }else{
                    self->outBegin+=line.trimmed();
                }
                function->append(self);
            }else if(key=="return"){
                self->outBegin="return ";
                argHook.indexIn(line);
                if(argHook.cap(1)=="<list>"){
                }else if(argHook.cap(1)=="<function>"){
                }else if(argHook.cap(1)=="<variable>"){
                    self->outBegin+=argHook.cap(2).trimmed();
                }else{
                    self->outBegin+=line.trimmed();
                }
                function->append(self);
            }else if(key=="execute"){
                self->outBegin="exec(";
                self->outEnd=")";
                argHook.indexIn(line);
                if(argHook.cap(1)=="<list>"){
                }else if(argHook.cap(1)=="<function>"){
                }else if(argHook.cap(1)=="<variable>"){
                    self->outBegin+=argHook.cap(2).trimmed();
                }else{
                    self->outBegin+=line.trimmed();
                }
                function->append(self);
            }else if(key=="break"){
                self->outBegin = "break";
                function->append(self);
            }else if(key=="continue"){
                self->outBegin = "continue";
                function->append(self);
            }else{
                if(parent->key=="call"){
                    argHook.indexIn(line);
                    if(argHook.cap(1)=="<list>"){
                    }else if(argHook.cap(1)=="<function>"){
                    }else if(argHook.cap(1)=="<variable>"){
                        self->outBegin+=argHook.cap(2).trimmed();
                    }else{
                        self->outBegin+=line.trimmed();
                    }
                    parent->addChild(self);
                }
            }
        }
        if(function!=0)
            function->write(out);
    }else{
        qDebug()<<"Can not open file "+path;
    }
}