Seite 1 von 1
Bedingung aus String ermitteln
Verfasst: 7. September 2009 23:17
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.
Verfasst: 7. September 2009 23:36
von Christian81
Nein - zum Interpretieren einer Syntax muss man schon einen Parser schreiben.
Verfasst: 8. September 2009 10:19
von upsala
Man könnte es mit QtScript auswerten lassen.
Verfasst: 14. September 2009 23:14
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();
}