示例#1
0
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
}
示例#2
0
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;
}
示例#3
0
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;
		}
	}
}
示例#4
0
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;
}
示例#5
0
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;
}
示例#6
0
文件: ProblemSet1_2.c 项目: dw6/NUS
bool isValidChar(char c) { return (isLetter(c) || isDigit(c) || isOperator(c) || isSemicolon(c)); }
示例#7
0
文件: ProblemSet1_2.c 项目: dw6/NUS
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;
}