예제 #1
0
std::string getOperator(std::string &exp)
{
    if (exp.size() == 0)
        return "";
    
    if (exp.size() >= 2)
    {
        if (exp[0] == '&' && exp[1] == '&')
        {
            exp.erase(0, 2);
            return "&&";
        }
        if (exp[0] == '|' && exp[1] == '|')
        {
            exp.erase(0, 2);
            return "||";
        }
    }
    
    if (exp.size() == 1 && isOpSym(exp[0]))
    {
        std::string s;
        s += exp[0];
        exp.erase(0, 1);
        return s;
    }
    if (exp[1] == '=' && isOpSym(exp[0]))
    {
        
        std::string s;
        s += exp[0];
        s += "=";
        exp.erase(0, 2);
        return s;
    }
    if (isOpSym(exp[0]))
    {
        std::string s;
        s += exp[0];
        exp.erase(0, 1);
        return s;
    }
    
    return "";
}
int main(){

	LINKED_STACK myStack1 = linked_stack_init();


	char myChar[] = "[((a+(b+c)))]";

	int myVar;

	bool isWellformed = true;

	for (myVar = 0; myVar < sizeof(myChar); myVar++) {

        if(isOpSym(myChar[myVar])== true){

            DATA myData = malloc(sizeof(DATA_t));
			myData->mybalancingsymbol = myChar[myVar];
			linked_stack_push(myStack1, myData);

		}else if(isCloseSym(myChar[myVar])== true){

            if (myStack1->head!=NULL) {

                DATA mytmpData = linked_stack_pop(myStack1);
                char myTmpChar = mytmpData->mybalancingsymbol;

                if(isMatches(myTmpChar, myChar[myVar]) == false){

                    printf("Something wrong with %c, at index %d\n",myChar[myVar], myVar);
                    isWellformed = false;

                }else{
                    //printf("index %d Good\n",myVar);
                }
            }
        }
	}

	if(isWellformed && myStack1->head==NULL){
		printf("Well Balanced");
	}else{
		printf("Not well balanced");
	}


    linked_stack_free(myStack1);

    return 1;
}
예제 #3
0
TokenType nextTokenType(std::string exp)
{
    if (exp.size() == 0)
        return TT_UNDEFINED;
    if (exp[0] == '&')
        return TT_OPERATOR;
    if (exp[0] == '|')
        return TT_OPERATOR;
    if (iswhiteSp(exp[0]))
        return TT_WHITESPACE;
    if (isChar(exp[0]) || exp[0] == '_')
        return TT_IDENTIFIER;
    if (isNum(exp[0]))
        return TT_NUMBER;
    if (exp[0] == '\"')
        return TT_STRING;
    
    if (exp.size() == 1)
    {
        if (isLangSym(exp[0]))
            return TT_LANGSYM;
        if (isOpSym(exp[0]))
            return TT_OPERATOR;
    }
    else
    {
        if (exp[0] == '.' && isNum(exp[1]))
            return TT_NUMBER;
        else if (isLangSym(exp[0]))
            return TT_LANGSYM;
        else if (isOpSym(exp[0]))
            return TT_OPERATOR;
    }
    
    return TT_UNDEFINED;
}