디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

구문이해가 안된다

치킨맛맛폰갤로그로 이동합니다. 2011.11.06 11:51:35
조회 60 추천 0 댓글 0

  #include <stdio.h>
     #include <stdlib.h>
    #include <string.h>
     #include <ctype.h>
   #include <conio.h>
     typedef struct _command     Command;
     typedef enum _tokenType     TokenType;
    typedef void (*Callback)(void);
   
    /* 토큰의 type을 정의 */
    enum _tokenType
    {
        TOKEN_INIT,
  
        TOKEN_INT,          /* "int" */
        TOKEN_LONG,         /* "long" */
  
        TOKEN_EQ,           /* "=" */
        TOKEN_SEMICOLON,    /* ";" */
  
        TOKEN_NAME,         /* 일반 문자열 */
        TOKEN_NUMBER        /* 숫자 */
    };
  
    /* 명령어들의 속성을 정의하는 구조체 */
    struct _command
    {
        TokenType   type;
        char *      command;
        Callback    call;
    };
  
    void intFunction(void);
    void longFunction(void);
  
    /* 토큰 분리를 위한 정의 */
    #define MAX_TOKEN_LENGTH    128
  
    char tokenBuffer[MAX_TOKEN_LENGTH];
    char *token = tokenBuffer;
    char *_MP = NULL;
  
    void gettoken(void);
    int is_white( char ch );
    int is_delim( char ch );
    /* 토큰 분리를 위한 정의 끝 */
  
    Command command[] =
    {
        { TOKEN_INT,    "int",      intFunction },
        { TOKEN_LONG,   "long",     longFunction }
    };
  
    TokenType tokenType = TOKEN_INIT;
    int commandNumber = sizeof(command)/sizeof(command[0]);
  
  
    int main(void)
    {
        char *src = "int a = 10; long b = 1000000;";
        int i = 0;
  
        /* gettoken() 함수에 의해서 토큰들이 분리가 될 수 있도록
         * src의 주소를 _MP에 할당한다.
         * gettoken()함수는 _MP를 이용해서 토큰을 분리하기 때문이다.
         */
        _MP = src;
  
        do
        {
            /* 토큰을 받아들여서 그 토큰에 해당하는 함수를 호출한다.
             * 바로 여기에서 함수 포인터의 위력이 나타나는 것이다.
             */
            gettoken();
            for( i = 0 ; i < commandNumber ; i++ )
                if( command[i].type == tokenType )
                    command[i].call();
        } while( tokenType != TOKEN_INIT );
        getch();
        return 0;
    }
  
    /* intFunction
     *
     * "int" 명령이 들어왔을때 실행이 되는 함수
     */
    void intFunction(void)
    {
        char name[MAX_TOKEN_LENGTH];
        int  var = 0;
  
        /* 토큰을 받아들인다. 변수 이름이 와야 한다. */
        gettoken();
  
        /* 받아들인 토큰을 name 배열에 저장한다. 즉, 변수의 이름 */
        strcpy( name, token );
  
        gettoken();
        if( tokenType == TOKEN_EQ )
       {
           gettoken();
           var = atoi(token);
 
           gettoken();
           if( tokenType != TOKEN_SEMICOLON )
           {
               fprintf( stderr, "`;\' is missing in `int\' operation.\\n" );
               exit(1);
           }
       }
       else if( tokenType != TOKEN_SEMICOLON )
       {
           fprintf( stderr, "`;\' is missing in `int\' operation.\\n" );
           exit(1);
       }
 
       fprintf( stdout, "%s(%d;int) is created!\\n", name, var );
   }
 
   /* longFunction
    *
    * "long" 명령이 들어왔을때 실행이 되는 함수
    */
   void longFunction(void)
   {
       char name[MAX_TOKEN_LENGTH];
       long  var = 0;
 
       gettoken();
 
       strcpy( name, token );
 
       gettoken();
       if( tokenType == TOKEN_EQ )
       {
           gettoken();
           var = atol(token);
 
           gettoken();
           if( tokenType != TOKEN_SEMICOLON )
           {
               fprintf( stderr, "`;\' is missing in `long\' operation.\\n" );
               exit(1);
           }
       }
       else if( tokenType != TOKEN_SEMICOLON )
       {
           fprintf( stderr, "`;\' is missing in `long\' operation.\\n" );
           exit(1);
       }
 
       fprintf( stdout, "%s(%ld;long) is created!\\n", name, var );
   }
 
   /* gettoken
    *
    * 토큰을 받아들이는 함수
    */
   void gettoken(void)
   {
       register int i = 0;
       char *temp = tokenBuffer;
 
       while( is_white( *_MP ) ) _MP++;
 
       if( *_MP == \'\\0\' )
      {
           *temp = \'\\0\';
           tokenType = TOKEN_INIT;
           return;
       }
 
       *temp++ = *_MP++;
 
       switch( *(_MP - 1) )
       {
           case \'=\' :
               *temp = \'\\0\';
               tokenType = TOKEN_EQ;
               return;
           case \';\' :
               *temp = \'\\0\';
               tokenType = TOKEN_SEMICOLON;
               return;
           default :
               if( isdigit( *(_MP-1) ) )
               {
                   while( !is_delim(*_MP) ) *temp++ = *_MP++;
                   *temp = \'\\0\';
                   tokenType = TOKEN_NUMBER;
               }
               else
               {
                   while( !is_delim(*_MP) ) *temp++ = *_MP++;
                   *temp = \'\\0\';
 
                   for( i = 0 ; i < commandNumber ; i++ )
                   {
                       if( strcmp( command[i].command, token ) == 0 )
                       {
                           tokenType = command[i].type;
                           return;
                       }
                   }
                   tokenType = TOKEN_NAME;
                   return;
               }
       }
   }
 
   /* is_white
    *
    * ch가 공백문자이면 1, 그렇지 않으면 0을 리턴
    */
   int is_white( char ch )
   {
       if(ch == \' \' || ch == \'\\t\' || ch == \'\\r\' || ch == \'\\n\' ) return(1);
       else return(0);
   }
 
   /* is_delim
    *
    * ch가 분리자이면 1을 그렇지 않으면 0을 리턴
    */
   int is_delim( char ch )
   {
       if(strchr("=; \\t\\r\\n", ch) || ch == 0 )
           return(1);
       return(0);
   }

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 이제는 의미 없어진 것 같은 시상식은? 운영자 25/12/01 - -
AD 따뜻한 겨울나기! 방한용품 SALE 운영자 25/11/27 - -
286301 K-ON [3] 어떡해갤로그로 이동합니다. 11.11.06 113 0
286300 objective-c 초보질문좀요 ㅇㅇ [8] veritaxluxmeaest갤로그로 이동합니다. 11.11.06 98 0
286298 가상함수 땜에 돌아버리겠네 [1] 탐욕의두들리갤로그로 이동합니다. 11.11.06 49 0
286296 좋아결정했어!! [2] 알오티씨플머갤로그로 이동합니다. 11.11.06 83 0
286295 아 프로그래밍 너무 어려움 디클로로메탄갤로그로 이동합니다. 11.11.06 38 0
286294 형님들 C에서 배열을 함수로 넘길때 문제가 발생해염 [2] 우와앙(122.36) 11.11.06 100 0
286291 횽들은 어쩌다가 하고싶은걸 발견하게 됐어? [1] dd(59.30) 11.11.06 61 0
286287 형들.. 자바 호좁인데 ㅠ_ㅠ 5시간째 헤매구 있어요 도와주세요 [13] 32423(183.101) 11.11.06 179 0
286286 요즘에도 디씨 정모로 유인해서 장기 빼가나요? [2] 매직스틱(218.237) 11.11.06 139 0
286285 근데요 고민있츰./.. [8] 지잡거지(122.32) 11.11.06 153 0
286282 링크있음 짤리는건가 늅늅(203.250) 11.11.06 35 0
286281 여자들한테 결혼상대로 프로그래머는 어떻게 보일까? [4] 설치마법사갤로그로 이동합니다. 11.11.06 163 0
286280 흔한 겜돌이의 스펙 [6] 햏햏했갤로그로 이동합니다. 11.11.06 272 0
286279 밑에 짤린 face mash 글 잘만드셨네요 ^_^. 그리고 재밌었음 [1] Stan(220.244) 11.11.06 56 0
286278 아 슬프다 페이스매쉬 글짤렸네 [4] 늅늅(203.250) 11.11.06 89 0
286277 횽들.. 웹에서 정보가져올려면 뭘 알아야되? [3] 흠좀무(59.31) 11.11.06 63 0
286275 최종학력이 중요한거 아닌가? [13] 전간디갤로그로 이동합니다. 11.11.06 248 0
286272 학부 2학년 전공스펙 평가점 [26] 지잡거지(122.32) 11.11.06 325 0
286270 Will code for food. 1(121.182) 11.11.06 96 0
286269 학부생(2학년)C언어 공부 테크트리 알려준다. [8] ㄹㄹㄷ(14.32) 11.11.06 304 0
286268 형님들 이게 무슨말인지 잘모르겠어요 C언어 [2] ㅠㅠ(211.246) 11.11.06 87 0
286267 java 문자열 비교에 관한 질문이에요 [3] 최강전설그녀갤로그로 이동합니다. 11.11.06 108 0
286266 웹프로그래밍 어떤언어로 하는게 제일 실행속도 빠르냐? [4] 정수정•‿•갤로그로 이동합니다. 11.11.06 127 0
286265 http request를 socket의 send로 보내려하는데 어케하죠? [1] 듣보잉여(123.109) 11.11.06 54 0
286264 프로그래머하다 때려치면 닭집사장말고 피씨방 사장도되냐? [3] ekrclrhwjdcl갤로그로 이동합니다. 11.11.06 156 0
286263 니들 아이패드용 브라더 인 암스할 때 조심해라 분당살람갤로그로 이동합니다. 11.11.06 57 0
286260 형들 제가 c++ 한권을 끝냈습니다 [4] ㄱㄱ(223.222) 11.11.06 139 0
286259 형들 나누기를 비트 연산으로 하려면 어떻게 해야할까? [4] 회색사과갤로그로 이동합니다. 11.11.06 150 0
286256 아침부터 숙제글 ㅋㅋ 열심히 하시네 [2] [성대아싸]갤로그로 이동합니다. 11.11.06 79 0
286255 진짜 모르겠어요 이거좀 짜주세요 [2] 길동홀(175.125) 11.11.06 95 0
286254 자바 코딩중 질문입니다..(질문 수정) [3] 햐...(112.163) 11.11.06 74 0
구문이해가 안된다 치킨맛맛폰갤로그로 이동합니다. 11.11.06 60 0
286252 C언어좀 도와주세요 [1] 길동홀(175.125) 11.11.06 71 0
286249 활기찬 아침 프갤러들을 위한 은꼬리^^ [5] 얼빠진호랑이갤로그로 이동합니다. 11.11.06 157 0
286248 그러고 보니까 집에 핸드폰 놓고왔네 얼빠진호랑이갤로그로 이동합니다. 11.11.06 52 0
286247 학원에 일빠로 도착했다 얼빠진호랑이갤로그로 이동합니다. 11.11.06 77 0
286246 니들이라면 150만원으로 맥북에어삼? [9] 선행자갤로그로 이동합니다. 11.11.06 283 0
286245 야 c언어 맛야 [4] Adelposs갤로그로 이동합니다. 11.11.06 101 0
286244 늅늅이들을 위한 족집게 강좌를 준비했다. [4] 바보플머(59.14) 11.11.06 114 0
286243 형들 용산 캬라멜이나 들어 [3] 버틸수가없ㅋ다갤로그로 이동합니다. 11.11.06 47 0
286242 모레면 소행성이 떨어지는 군화... 거칠게갤로그로 이동합니다. 11.11.06 66 0
286241 미친 디시 어플 패치 좀 ㅡㅡ 거칠게갤로그로 이동합니다. 11.11.06 49 0
286240 일요일 아핌인데 비가 오네염 거칠게갤로그로 이동합니다. 11.11.06 32 0
286236 [ 혐짤 ] 시팔 아파치에 CURL라이브러리 설치해도안됨 [1] 레알폰님갤로그로 이동합니다. 11.11.06 95 0
286234 미쿡인이랑 대화할정도 영어 vs 뛰어난 프로그래밍 실력 [8] 전자후자(220.86) 11.11.06 253 0
286233 형들은 몇살에 졸업후 몇살에첫직장잡음? [1] 三didas갤로그로 이동합니다. 11.11.06 108 0
286232 형드라 생성자에서 객체만들어내거나 머 입력같은 거 받으면 개병신? [4] ^0^갤로그로 이동합니다. 11.11.06 85 0
286230 그니까 그니까 횽 횽 [2] 큐아큐아큥(125.131) 11.11.06 68 0
286229 아어.. ㅠㅜ 형들 다이렉트x 화면에 출력할 전면버퍼나 후면버퍼 [7] 큐아큐아큥(125.131) 11.11.06 80 0
286228 식당 어플을 하나 만들려고 하는데 도움부탁드립니다 [5] 강빛나(117.16) 11.11.06 133 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2