Мне нужно разработать токенизатор на C/C++, который будет анализировать строку типа
Код:
char pSignature[] = "work.\\top =>\\p1 =:5:p2=:10:=>interface_ports:=dut";
Может ли кто-нибудь предоставить достойный метод?
Проблема с использованием strtok заключается в том, чтобы определить, как его завершить до того, как произойдет => интерфейсные порты. Код, который я написал, выглядит следующим образом:
Код:
int main() {
char pSignature[] = "work.\\top =>\\p1 =:5:p2=:10:=>interface_ports:=dut";
char* mParamName = NULL;
char* mParamVal = NULL;
char* sTemp = pSignature;
bool bIsLibState = true;
bool bIsModState = false;
bool bIsEscaped = false;
while (*sTemp != '\0') {
// Extract library ..
if (bIsLibState) {
if (*sTemp == '.') {
bIsLibState = false;
bIsModState = true;
}
sTemp++;
}
else if (bIsModState) {
// Extract moduleName..
if (*sTemp == '\\') {
bIsEscaped = true;
}
if (bIsEscaped) {
if (*sTemp == ' ') {
bIsModState = false;
bIsEscaped = false;
sTemp++;
sTemp += 2;
break;
}
else
sTemp++;
}
else {
if (*(sTemp+1) == '=' && *(sTemp+2) == '>') {
bIsModState = false;
sTemp++;
sTemp += 2;
break;
}
else
sTemp++;
}
}
}
char* tmp = sTemp;
char* mStr = sTemp;
bool bEscaped = false;
while(tmp != NULL)
{
if (*tmp == '\\') {
tmp = strtok(mStr, " ");
bEscaped = true;
}
else
tmp = strtok(mStr, "=:");
if (!strcmp(tmp,">interface_ports"))
break;
mStr = NULL;
mParamName = tmp;
tmp = strtok(mStr, "=:");
if (!strcmp(tmp,">interface_ports"))
break;
mParamVal = tmp;
cout << mParamName <<" " << mParamVal << endl;
//if (mParamName && mParamVal) {
// symCharPair* paramPair = new symCharPair(VeIntern(mParamName), mParamVal);
// pParamValueList->AddTail(paramPair);
//}
}
return 0;
}
Согласно этому веб-сайту, второй параметр strtok представляет собой набор разделителей. Когда вы пишете strtok(mStr, "=:");, следующим токеном является любой символ между mStr и '=' или ':' (или '0'). Кроме того, мы не уверены, как вы хотите токенизировать эту строку. Это правильно?
Социальные закладки