Тема: C умный токенизатор

Ответить в теме
Показано с 1 по 1 из 1
  1. Вверх #1
    Новичок
    Пол
    Мужской
    Возраст
    24
    Сообщений
    7
    Репутация
    10

    По умолчанию C умный токенизатор

    Мне нужно разработать токенизатор на 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'). Кроме того, мы не уверены, как вы хотите токенизировать эту строку. Это правильно?


Ответить в теме

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения