Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>
  1. tokenrizer
  2. 토큰라이저
  3. [acidd15]
  4. Version 0.1
  5. 2005/02/23

설명

토큰라이저.잘라내는것.이를 바탕으로 응용하면 소스파서같은것을 만들수 있다.

사용방법

컴파일 gcc -o source source.c 사용방법은 소스에.

코드

/*  Main configuration
   VIM variables:
   vim600: noet sw=4 expandtab fdm=marker nu
   vim<600: noet sw=4 expandtab ts=4 nu
*/
#include <stdio.h>

#define TOK_TOKEN_O 0x01
#define TOK_TOKEN_X 0x10

typedef struct tokened_st{
  int type;
  char *sta;
  char *end;
  struct tokened_st *next;
} tokened;

const char *token="~`!@#$%^&*()-_+=|\\{}[]:\"<>,.?/\n\t ";

int tokenrizer(const char *,const char *,tokened **);

int main(int argc,char **argv){

  int size=0;
  tokened *tokened_head=NULL,*cur=NULL;
  const char *str="int tokenrizer(char *str,char *token,tokened **tokened_head){elice";
  char *buf=NULL;

  printf("TOKENS: >>%s<<\n",token);
  printf("STRINGS: >>%s<<\n",str);
  printf("TOKEN_O is a token else not a token\n");
  printf("\n");

  tokenrizer(str,token,&tokened_head);

  cur=tokened_head;

  while(cur!=NULL){

    size=(cur->end - cur->sta);
    buf=(char *)malloc(sizeof(char)*size+1);
    buf[size+1]='\0';
    memcpy(buf,cur->sta,size);

    printf("%s : '%s'\n",((cur->type==TOK_TOKEN_O) ? "TOKEN_O" : "TOKEN_X"),buf);

    cur=cur->next;

  }

  tokenrizer_free(tokened_head);

  return 0;

}

int tokenrizer(const char *str,const char *token,tokened **tokened_head){

  tokened *cur=NULL,*prev=NULL;
  char chr;
  int i=0,cnt=0;
  int token_len=0;
  char *last_token_occur=NULL;

  if(str==NULL){

    return 1;

  }

  if(token==NULL){

    return 2;

  }

  token_len=strlen(token);
  last_token_occur=(char *)str;

  while((chr=*(str+cnt))!='\0'){

    for(i=0;token_len>i;++i){

      if(chr==token[i]){

        if(str+cnt>last_token_occur){

          cur=(tokened *)malloc(sizeof(tokened));
          memset(cur,0x0,sizeof(tokened));
          cur->type=TOK_TOKEN_X;
          cur->sta=last_token_occur;
          cur->end=(char *)(str+cnt);

          if((*tokened_head)==NULL){

            (*tokened_head)=cur;

          }else{

            prev->next=cur;

          }

          prev=cur;

        }

        cur=(tokened *)malloc(sizeof(tokened));
        memset(cur,0x0,sizeof(tokened));
        cur->type=TOK_TOKEN_O;
        cur->sta=(char *)(str+cnt);
        cur->end=(char *)(str+cnt+1);

        if((*tokened_head)==NULL){

          (*tokened_head)=cur;

        }else{

          prev->next=cur;

        }

        prev=cur;

        last_token_occur=(char *)(str+cnt+1);

        break;

      }

    }

    ++cnt;

  }

  if(str+cnt>last_token_occur){

    cur=(tokened *)malloc(sizeof(tokened));
    memset(cur,0x0,sizeof(tokened));
    cur->type=TOK_TOKEN_X;
    cur->sta=last_token_occur;
    cur->end=(char *)(str+cnt);

    if((*tokened_head)==NULL){

      (*tokened_head)=cur;

    }else{

      prev->next=cur;

    }

    prev=cur;

  }

  return 0;

}

int tokenrizer_free(tokened *tokened_head){

  tokened *cur=NULL,*next=NULL;

  cur=tokened_head;

  while(cur!=NULL){

    next=cur->next;
    free(cur);
    cur=next;

  }

  return 0;

}

변경사항

2004/01/08