Bedingung aus String ermitteln

Alles rund um die Programmierung mit Qt
Antworten
Okeanos
Beiträge: 14
Registriert: 16. Juli 2009 20:19

Bedingung aus String ermitteln

Beitrag von Okeanos »

Gibt es eine Möglichkeit Bedingungen, die als QString vorliegen, mit Qt auszuwerten?

Ich habe mehrere Strings in einer QStringList, welche ungefähr nach folgendem Format aufgebaut sind

"Bezeichnung;(HDL < 15 && LDL < 10) || BMI>25"

Dabei soll die Bedingnung nach dem ";" mit Werten, die mir als Integer zur Verfügung stehen vergliechen werden. Ist der Ausdruck wahr, soll "Bezeichnung" in eine neue QStringList aufgenommen werden, ist er falsch, soll das unterlassen werden.

Dabei richtet sich der Ausdruck nach dem ";" an die Syntax der logischemn Operatoren von C++: &&, || etc.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Nein - zum Interpretieren einer Syntax muss man schon einen Parser schreiben.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Man könnte es mit QtScript auswerten lassen.
Okeanos
Beiträge: 14
Registriert: 16. Juli 2009 20:19

Beitrag von Okeanos »

Ich habe selbst einen Parser geschrieben und das Problem so gelöst. Wer Interesse an dieser Lösung hat:

Code: Alles auswählen

StringBoolParser::tToken StringBoolParser::nextToken(){
    actualToken = ERROR;

    if (*srcPos==0) 
        actualToken = END;
    else {
        switch (*srcPos) {
            case '(': actualToken=LPAR;	break;
            case ')': actualToken=RPAR;	break;
        }
        if (*srcPos == '&') {
			srcPos++;
			if (*srcPos=='&')
				actualToken=AND;
			else
				srcPos--;
        }
        if (*srcPos=='|') {
			srcPos++;
			if (*srcPos=='|')
				actualToken=OR;
        }
        if (*srcPos=='=') {
			srcPos++;
			if (*srcPos=='=')
				actualToken=EQUAL;
        }
        if (*srcPos=='!') {
			srcPos++;
			if (*srcPos=='=')
				actualToken=NOT;
        }
        if (*srcPos=='>') {
            actualToken=GREATER;
			srcPos++;
			if (*srcPos=='=') 
				actualToken=GREATEREQUAL;
			else
				srcPos--;
        }
        if (*srcPos=='<') {
            actualToken=SMALLER;
			srcPos++;
			if (*srcPos=='=') 
				actualToken=SMALLEREQUAL;
			else
				srcPos--;
        }
        if (*srcPos >= '0' && *srcPos <= '9') {
            actualToken=NUMBER;
            tokenNumberValue = 0;
        }
        while (*srcPos >= '0' && *srcPos <= '9') {
            tokenNumberValue *= 10;
            tokenNumberValue += *srcPos - '0';
            srcPos++;
        }
        if (actualToken != NUMBER) {
            srcPos++;
        }
    }
    return actualToken;
}

bool StringBoolParser::compare(){
	bool result;
	int numberA = tokenNumberValue;

	nextToken();

    if (actualToken==GREATER)    {
        nextToken();
        result = (numberA > tokenNumberValue);
    }
    else if (actualToken==SMALLER)    {
		nextToken();
		result = (numberA < tokenNumberValue);
    }
    else if (actualToken==GREATEREQUAL)    {
		nextToken();
		result = (numberA >= tokenNumberValue);
    }
    else if (actualToken==SMALLEREQUAL)    {
		nextToken();
		result = (numberA <= tokenNumberValue);
    }
    else if (actualToken==EQUAL)    {
		nextToken();
		result = (numberA == tokenNumberValue);
    }
    else if (actualToken==NOT)    {
		nextToken();
		result = (numberA != tokenNumberValue);
    }
	else
		result = false;

    return result;
}


bool StringBoolParser::paranthesis(){
    bool result;

    switch(actualToken){
        case NUMBER:
            result = compare();
			return result;

		case LPAR:
			nextToken();
			result = operatorAND();

			if (actualToken != RPAR) 
				return true;

			return result;

		case END:
			return false;
    }
    return error("primary expected");
}

bool StringBoolParser::operatorOR(){
    bool result;

    result = paranthesis();

	nextToken();

	while (actualToken == OR) {
		nextToken();
		result = operatorAND() || result;
	}
    return result;
}

bool StringBoolParser::operatorAND(){
    bool result;

    result = operatorOR();

    while (actualToken == AND) {
        nextToken();
        result = operatorAND() && result;
    }
    return result;
}

bool StringBoolParser::validate(QString checkString){
	checkString.remove(QRegExp("\\s"));
	QByteArray saveAsBytes = checkString.toAscii();
	char *ptr = saveAsBytes.data();

	srcPos = ptr;
    nextToken();      
    return operatorAND();
}
Antworten