디시인사이드 갤러리

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

갤러리 본문 영역

구문이해가 안된다

치킨맛맛폰갤로그로 이동합니다. 2011.11.06 11:51:35
조회 61 추천 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 - -
287109 소행성님 감사해여 ^^ 거칠게갤로그로 이동합니다. 11.11.09 34 0
287105 java 에서 사용하지 않는거 강제로 free 하는 방법 있나? [6] iljeomobolt갤로그로 이동합니다. 11.11.09 115 0
287103 객체지향 방향키이동...말이야 [2] 객체지향(123.141) 11.11.09 85 0
287100 전간디님이 출근합니다 [1] 전간디갤로그로 이동합니다. 11.11.09 50 0
287099 초보자인데 뭐가 잘못된건지 모르겠네요 [8] rnmn갤로그로 이동합니다. 11.11.09 158 0
287097 인생 헛살았다....공부 진짜 열심히 해야지 ㅠㅠ 으아....(222.117) 11.11.09 75 0
287096 이렇게 하믄요? [3] 씨플초보(59.21) 11.11.09 77 0
287095 아래꺼답 [1] 독학놈(222.107) 11.11.09 80 0
287094 중국개발자? 걱정마라~ [1] 이문동쮸쮸바갤로그로 이동합니다. 11.11.09 193 0
287093 중궈 개발자들 온다고 해도 뭐 대기업에서나 쓰지 않겠나... 호옹이(222.117) 11.11.09 72 0
287092 이렇게 하면 안대는건가여? [12] 씨플초보(59.21) 11.11.09 143 0
287090 이 늦은시간에 게시글이 올라오는거 뻔하징..ㅋ [1] 이문동쮸쮸바갤로그로 이동합니다. 11.11.09 92 0
287089 또 도와주세여 ㅜㅜ [7] 씨플초보(59.21) 11.11.09 80 0
287088 GPUPU는 졸라 강력한데... 이문동쮸쮸바갤로그로 이동합니다. 11.11.09 142 0
287087 스왑 이건 어떠냐 [1] ?(118.218) 11.11.09 52 0
287085 근데 여기 IOS개발하는 횽 있나여? [5] 독학놈(222.107) 11.11.09 105 0
287084 자바가 대세인가... [2] 이문동쮸쮸바갤로그로 이동합니다. 11.11.09 112 0
287083 밑에 씨플 답변달아준분 [6] 플밍(203.248) 11.11.09 68 0
287082 이거 왜 안대는거에요 ㅜㅜ [20] 씨플초보(59.21) 11.11.09 172 0
287081 난 대졸사람이 부럽다... [7] 이문동쮸쮸바갤로그로 이동합니다. 11.11.09 153 0
287080 아래 질문한 님아 정답은 바로!!!!! [11] 독학놈(222.107) 11.11.09 69 0
287079 드라이버 만들기 왜케 거지같냐 [22] 어슐러르귄갤로그로 이동합니다. 11.11.09 179 0
287078 루아 고수 형들 봐줘 안고수 형들도 봐ㅣ줘 [1] 루아찡(114.202) 11.11.09 64 0
287077 오래간만에 입개르~ [2] 로하로하알로하갤로그로 이동합니다. 11.11.09 54 0
287076 토익점수가 프로그래머 연봉에 미치는 영향은?! [1] 독학놈(222.107) 11.11.09 205 0
287075 코드를 바꿨는데 안되요 ㅠ 도와주세요 횽들 귀요미(183.104) 11.11.09 38 0
287074 c++ [5] 플밍(203.248) 11.11.09 83 0
287073 쿠캬캬님 아래글 관심좀부탁드릴게요 (냉무)ㅠㅠ 플밍(203.248) 11.11.09 41 0
287071 디버깅끝나고 완벽하다 생각한 코드가 완벽하게 작동될땐 기분 째짐 [3] elwlwlwk갤로그로 이동합니다. 11.11.09 99 0
287070 c++프로그래밍 코드좀 봐주세요~~~~~~~~~~~~~~~~~~~~~ [17] 플밍(203.248) 11.11.09 161 0
287068 MFC좀 도와주세요 ㅁㄵㅇ(118.42) 11.11.09 114 0
287065 우리나라는 뭐 만드는 직업은 잘되는게 하나 없나봐 Aven갤로그로 이동합니다. 11.11.09 42 0
287064 다독여준 형들 고마워 Dawnwalkre갤로그로 이동합니다. 11.11.09 35 0
287062 한국 SW 진흥방법.txt (211.222) 11.11.09 82 0
287060 정말 궁금한건데... 에필로스갤로그로 이동합니다. 11.11.09 31 0
287059 아직 안자고 있는 형들 [17] Dawnwalkre갤로그로 이동합니다. 11.11.09 135 0
287057 오르가즘!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! [2] McHello갤로그로 이동합니다. 11.11.09 148 0
287054 이 바닥에서 제일 돈 많이 주는데가 어디임? [2] MS똥꼬빨이(121.150) 11.11.09 85 0
287053 님들 우리 다 망했음 [6] daasz(121.172) 11.11.09 225 0
287052 국내에서 값싼개발자쓰면... 三didas갤로그로 이동합니다. 11.11.09 90 0
287051 여자들 화장 무섭다 이모군(175.114) 11.11.09 66 0
287050 프로그래머가 많이 홀대받음? ㅈㅈㅈㅈ(118.47) 11.11.09 62 0
287048 애플 아이디 삽니다. [8] 애플꾼(221.146) 11.11.08 90 0
287047 브라우저에서 웹 페이지 볼 때 큰 그림 파일이 있으면 느려지는 이유가? [25] 마법사게이맨(218.235) 11.11.08 150 0
287046 Cㄱㅣ본중 기본 질문 [2] ㆍ엘마갤로그로 이동합니다. 11.11.08 57 0
287045 형들 ㅜㅜ 자바 질문있어!! 도와줘... [5] 게루밥갤로그로 이동합니다. 11.11.08 70 0
287043 프로그래머 현실 ㅈ같은데도 하는 이유가 머냐? [5] ㅅㅅ(125.181) 11.11.08 250 0
287042 퇴갤요 증인닉고갤로그로 이동합니다. 11.11.08 26 0
287041 자바에서 메소드를 C의 함수로 이해해도 되는거지? [3] ㅇㅇ(59.30) 11.11.08 73 0
287040 아 진짜 씨쁠 개같아서 못해먹겠다 기초를 모르니깐 넘어갈수가없네 [1] asd(121.137) 11.11.08 70 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2