void testSymbol() { #if 0 // Operator int i = 0; for(; i < KeywordsCount; ++i) { printf("%s\n", Operators[i]); } #endif // test: isKeyword isLiteral isVar isSemicolon symbol_construct symbol_deconstruct #if 0 // not ok char *symbol[] = {"int", "i", "=", "12", ";"}; for(int i = 0; i < sizeof(symbol) / sizeof(symbol[0]); ++i) { // ok printf("symbol %s : isKeyword:%s isLiteral:%s isVar:%s isSemicolon:%s\n", symbol[i], TO_BOOL_STR(isKeyword(symbol[i])), TO_BOOL_STR(isLiteral(symbol[i])), TO_BOOL_STR(isVar(symbol[i])), TO_BOOL_STR(isSemicolon(symbol[i]))); Symbol *sb = symbol_construct(symbol[i]); if(sb) { // not ok printf("%x %x %x %x \n", IS_KEYWORD(sb->type), IS_LITERAL(sb->type), IS_VAR(sb->type), IS_SEMICOLON(sb->type)); symbol_deconstruct(sb); } } #endif // test: isCharLiteral isStringLiteral isDecNumber isOctNumber isHexNumber isFloatNumer // tes: isDoubleNumber #if 0 // ok int i = 0; const char *strArr[] = {"\'c\'", "\"abc\"", "453", "0453", "781", "a90", "0x34", "0X56", "9.34", "9.4e2", "9.5E5", "9e+2", "9e-3", "9.34f", "9.34F" }; for(; i < sizeof(strArr) / sizeof(strArr[0]); ++i) { printf("%s: isCharLiteral(%s)\n\t", strArr[i], TO_BOOL_STR(isCharLiteral(strArr[i]))); printf("isStringLiteral(%s)\n\t", TO_BOOL_STR(isStringLiteral(strArr[i]))); printf("isDecNumber(%s)\n\t", TO_BOOL_STR(isDecNumber(strArr[i]))); printf("isOctNumber(%s)\n\t", TO_BOOL_STR(isOctNumber(strArr[i]))); printf("isHexNumber(%s)\n\t", TO_BOOL_STR(isHexNumber(strArr[i]))); printf("isFloatNumber(%s)\n\t", TO_BOOL_STR(isFloatNumber(strArr[i]))); printf("isDoubleNumber(%s)\n", TO_BOOL_STR(isDoubleNumber(strArr[i]))); } /* // I don't know why, but it can't output all strings for(; i < sizeof(strArr) / sizeof(strArr[0]); ++i) { printf("%s: isCharLiteral(%s)\n\t isStringLiteral(%s)\n\t isDecNumber(%s)\n\t isOctNumber(%s)\n\t isHexNumber(%s)\n\t isFloatNumber(%s)\n\t isDoubleNumber(%s)\n", strArr[i], TO_BOOL_STR(isCharLiteral(strArr[i])), TO_BOOL_STR(isStringLiteral(strArr[i])), TO_BOOL_STR(isDecNumber(strArr[i])), TO_BOOL_STR(isOctNumber(strArr[i])), TO_BOOL_STR(isHexNumber(strArr[i])), TO_BOOL_STR(isFloatNumber(strArr[i])), TO_BOOL_STR(isDoubleNumber(strArr[i]))); } */ #endif }
Symbol *symbol_construct(const char *str) { SYMBOL_TYPE type; Symbol *sb = (Symbol *)malloc(sizeof(Symbol)); if(!sb) return NULL; char *sbStr = (char *)malloc(strlen(str) + 1); if(!sbStr) return NULL; type = 0; if(isKeyword(str)) type |= SYMBOL_TYPE_KEYWORD; if(isVar(str)) type |= SYMBOL_TYPE_VAR; if(isSemicolon(str)) type |= SYMBOL_TYPE_SEMICOLON; if(isLiteral(str)) type |= SYMBOL_TYPE_LITERAL; sb->type = type; strcpy(sbStr, str); sb->str = sbStr; return sb; }
void Parser::processAssignment(std::pair<int,string> pair, list<int>& modifiesList, list<int>& usesList) { string str = pair.second; int stmtNumber = pair.first; string::iterator it; string variable = ""; modifiesList.clear(); usesList.clear(); for (it = str.begin(); it != str.end(); ++it) { if (isMathSymbol(*it) || isSemicolon(*it)) { if (isVariable(variable)) { VarTable& varTable = pkb.getVarTable(); int varID = varTable.get_ID(variable); if (modifiesList.empty()) { modifiesList.push_back(varID); } else { usesList.push_back(varID); } } variable = ""; } else { variable += *it; } } }
bool isVar(const char *str) { int i = 1; if(isKeyword(str) || isSemicolon(str)) return false; if(str[0] != '_' && !isalpha(str[0])) return false; for(; i < strlen(str); ++i) if(!isalpha(str[i])) return false; return true; }
Token_type getTokenTypeByName(const char *name) { if(isKeyword(name)) return Token_type_keyword; if(isCharLiteral(name)) return Token_type_literal; if(isStringLiteral(name)) return Token_type_literal; if(isVar(name)) return Token_type_var; if(isOperator(name)) return Token_type_operator; if(isDecNumber(name) || isHexNumber(name) || isOctNumber(name) || isFloatNumber(name) || isDoubleNumber(name)) return Token_type_num; if(isSemicolon(name)) return Token_type_semicolon; return Token_type_err; }
bool isValidChar(char c) { return (isLetter(c) || isDigit(c) || isOperator(c) || isSemicolon(c)); }
int getState(char c) { prevState = currentState; if ( isLetter(c) ) { if ( currentState == START_STATE || currentState == VARIABLE_STATE || currentState == END_OPERATOR_STATE ) { currentState = VARIABLE_STATE; } else { currentState = ERROR_STATE; } } else if ( isDigit(c) ) { if ( currentState == VARIABLE_STATE ) { currentState = VARIABLE_STATE; } else if ( currentState == INTEGER_STATE || currentState == END_OPERATOR_STATE ) { currentState = INTEGER_STATE; } else { currentState = ERROR_STATE; } } else if ( isOperator(c) ) { if ( currentState == VARIABLE_STATE ) { // Save the left hand side variable strcpy(leftIdentifier, token); currentState = OPERATOR_STATE; switch(c) { case '+': operatorType = ADD_OP; break; case '-': operatorType = SUBTRACT_OP; break; case '*': operatorType = MULT_OP; break; case '/': operatorType = DIV_OP; break; } } else { currentState = ERROR_STATE; } } else if ( isEqual(c) ) { if ( currentState == OPERATOR_STATE ) { currentState = END_OPERATOR_STATE; } else { currentState = ERROR_STATE; } } else if ( isSemicolon(c) ) { if ( currentState == VARIABLE_STATE ) { currentState = START_STATE; strcpy(rightIdentifier, token); insertSymbolWithVariable(leftIdentifier, operatorType, rightIdentifier); } else if ( currentState == INTEGER_STATE ) { currentState = START_STATE; rightValue = atoi(token); insertSymbolWithValue(leftIdentifier, operatorType, rightValue); } // Reset all values; memset(leftIdentifier, 0, 100); memset(rightIdentifier, 0, 100); } else if ( c == '\0' ) { if ( currentState == START_STATE ) { currentState = FINAL_STATE; } else { currentState = ERROR_STATE; } } else { currentState = ERROR_STATE; } return currentState; }