// 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 ); } }
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; } }
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; } }
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; } }
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; } }