编译器练习:找出C程序中声明的变量,关键字和自然数

1.源代码

//glovar.h

#ifndef _GLOVAR_H_

#define _GLOBAR_H_


#include <stdio.h>

#include <stdlib.h>

#include <ctype.h>


#define MAXTOKEN 40

extern FILE *fps;

extern FILE *fpt;


char tokenStr[MAXTOKEN+1];


typedef enum  {

        INIT,

        INNUM,

        INID,

        IN_MARK,

        IN_MARK_SEG,IN_MARK_SEG1,

        IN_MARK_LINE,

        DONE

}TokenState;


typedef enum  {


  ID,NUM,/*JUDGE SYMBOL*/

  IF,ELSE,DO,WHILE,SWITCH,CASE,INT,LONG,DOUBLE,FLOAT,CHAR,BREAK,

  EQ,LS,LE,GT,GE,NE, //EQ =,LS <,LE <= ,GT >, GE >=, NE !=

  ASSIGN, //'='

  ADD,SUB,MUL,DIV,//OP + , - , * , / ,

  INC,DEC,

  LC,RC, //  '('  ')'

  LR,RR, //  '['  ']'

  LS,RS, //  '{'  '}'

  OR,AND,NOT, // '|' '&' '!'

  SEMI,// ';'

  SHARP,//'#'

  ENDFILE

 }TokenType;

#endif





//scan.h


#ifndef _SCAN_H_

#define _SCAN_H_

TokenType GetToken(void);

#endif

//scan.c
#include "glovar.h"
#include "scan.h"
int line=1;
static struct {
    char *str;
    TokenType tok;
    }kw[12]={{"if",IF},{"else",ELSE},{"do",DO},{"while",WHILE},{"break",BREAK}, {"switch",SWITCH},{"case",CASE},
{"int",INT},{"char",CHAR},{"float",FLOAT},{"double",DOUBLE},{"long",LONG}};
int reservelookup(char *s){
    int i;
    for(i=0;i<12;i++){
        if(strcmp(s,kw[i].str)==0)
         return 1;
         }
    return 0;
    }
TokenType GetToken(void){
int tokenBufferIndex=0;
    char ch;
    TokenType tt;
    TokenState state=INIT;
    while(state!=DONE){
        ch=getc(fps);
        switch(state){
            case INIT: if(isdigit(ch))
                          {
                              state=INNUM;
                              tokenStr[tokenBufferIndex++]=ch;
                              }
                      else if (isalpha(ch)){
                            state=INID;
                            tokenStr[tokenBufferIndex++]=ch;}
                      else if((ch==' ')||ch=='/t') state=INIT;
                      else {
                        switch(ch){
                            case '=' : ch=getc(fps);
                                        if(ch=='=') tt=EQ;
                                        else {
                                        ungetc(ch,fps);
                                        tt= ASSIGN;
                                        }
                                        break;
                            case '<' : ch=getc(fps);
                                        if(ch=='=') tt=LE;
                                        else if(ch=='>') tt=NE;
                                        else {
                                        ungetc(ch,fps);
                                        tt= LS;
                                        }
                                        break;
                            case '>' : ch=getc(fps);
                                        if(ch=='=') tt= GE;
                                        else {
                                        ungetc(ch,fps);
                                        tt= GT;
                                        }
                                        break;
                            case '|':  tt=OR;
                                       state=DONE;
                                       break;
                            case '&':  tt=AND;
                                       state=DONE;
                                       break;
                            case '!':  tt=NOT;
                                       state=DONE;
                                       break;
                            case '+': ch=getc(fps);
                                        if(ch=='+') tt= INC;
                                        else{
                                        ungetc(ch,fps);
                                        tt= ADD;
                                        break;
                                        }
                            case '-': ch=getc(fps);
                                        if(ch=='-') tt= DEC;
                                        else{
                                        ungetc(ch,fps);
                                        tt=SUB;
                                        break;
                                        }
                            case '*':
                                       tt= MUL;
                                       state=DONE;
                                       break;
                            case '/':  state=IN_MARK;
                                       break;
                            case '/n': line++;
                                       break;
                            case  '#': tt=SHARP;
                                       break;
                            case ';' : tt= SEMI;
                                       state=DONE;
                                       break;
                            case '(' : tt= LC;
                                       state=DONE;
                                       break;
                            case ')' : tt= RC;
                                       state=DONE;
                                       break;
                            case '[' : tt= LR;
                                       state=DONE;
                                       break;
                            case ']' : tt= RR;
                                       state=DONE;
                                       break;
                            case '{' : tt= LS;
                                       state=DONE;
                                       break;
                            case '}' : tt= RS;
                                       state=DONE;
                                       break;
                            case EOF:
                                       tt=ENDFILE;
                                       state=DONE;
                                       break;
                            default :  break;
                            }
                      }
                      break;
            case IN_MARK:
                            if(ch=='*') state= IN_MARK_SEG;
                            else if(ch=='/') state= IN_MARK_LINE;
                            else {
                                ungetc(ch,fps);
                                tt=DIV;
                                state=DONE;
                            }
                             break;
            case IN_MARK_SEG:
                              if(ch=='*') state=IN_MARK_SEG1;
                              break;
            case IN_MARK_SEG1:
                                if(ch=='/') state=INIT;
                                break;
            case IN_MARK_LINE:
                               if(ch=='/n') state=INIT;
                               break;
            case INNUM: if(isdigit(ch))
                            tokenStr[tokenBufferIndex++]=ch;
                        else
                           { tokenStr[tokenBufferIndex]='/0';
                            state=DONE;
                            ungetc(ch,fps);
                            tt=NUM;
                            }
                             break;
            case INID: if(isalpha(ch))
                            tokenStr[tokenBufferIndex++]=ch;
                        else{
                            tokenStr[tokenBufferIndex]='/0';
                            state=DONE;
                            ungetc(ch,fps);
                            tt=ID;
                            }
                             break;
            case DONE: break;
                     }
      }
      if(tt==ID){
          if(reservelookup(tokenStr))
             fprintf(fpt,"Get Keywords -->%s/n/n",tokenStr);
       else
             fprintf(fpt,"Get ID -->%s/n/n",tokenStr);
       }
      else if(tt==NUM)
       fprintf(fpt,"Get NUM -->%s/n",tokenStr);
     return tt;
    }
//main.c
#include "glovar.h"
#include "scan.h"
/*
programed by:alex shoal
edit date:2009-4-22, Sunday
revision:2
****************
*Question:gettoken practice
****************
*/
FILE *fps; //* file point of source
FILE *fpt;  //* file point of target
int main(int argc, char *argv[]){
TokenType tp;
int i=0;
fpt=stdout;
    if (argc != 2){
        printf("Usage: %s filename/n", argv[0]);
        exit(1);
    }
    if ((fps = fopen(argv[1], "r")) == NULL){
        printf("Can't open file :%s/n", argv[1]);
        exit(1);
    }
     if ((fpt = fopen("out.txt", "w+")) == NULL){
        printf("Can't open file :out.txt /n");
        exit(1);
    }
while (((tp = GetToken()) != ENDFILE)){
     fprintf(fpt,"Token %d= %d/n",i++,tp);
}
    fclose(fps);
  return 0;
}
2.编译
code block 8.02编译
3.输入文件
//filename app.c
 //ANSI C exit() prototype
int main(int argc, char *argv[])
{
    int ch;         // place to store each character as read
    FILE *fp;       // "file pointer"
    long count = 0;
    if (argc != 2)
    {
        printf("Usage: %s filename/n", argv[0]);
        exit(1);
    }
    if ((fp = fopen(argv[1], "r")) == NULL)
    {
        printf("Can't open %s/n", argv[1]);
        exit(1);
    }
    while ((ch = getc(fp)) != EOF)
    {   
       putchar(ch,stdout);  /*same as putchar(ch);
       count++;
    }
    fclose(fp);*/
    printf("File %s has %ld characters/n", argv[1], count);
    return 0; 
}
4.运行
temp app.c
8.结果
Get Keywords -->int
Token 0= 0
Get ID -->main
Token 1= 0
Token 2= 28
Get Keywords -->int
Token 3= 0
Get ID -->argc
Token 4= 0
Get Keywords -->char
Token 5= 0
Token 6= 24
Get ID -->argv
Token 7= 0
Token 8= 30
Token 9= 31
Token 10= 29
Token 11= 32
Get Keywords -->int
Token 12= 0
Get ID -->ch
Token 13= 0
Token 14= 37
Get ID -->FILE
Token 15= 0
Token 16= 24
Get ID -->fp
Token 17= 0
Token 18= 37
Get Keywords -->long
Token 19= 0
Get ID -->count
Token 20= 0
Get NUM -->0
Token 21= 1
Token 22= 37
Get Keywords -->if
Token 23= 0
Token 24= 28
Get ID -->argc
Token 25= 0
Token 26= 36
Get NUM -->2
Token 27= 1
Token 28= 29
Token 29= 32
Get ID -->printf
Token 30= 0
Token 31= 28
Get ID -->Usage
Token 32= 0
Get ID -->s
Token 33= 0
Get ID -->filename
Token 34= 0
Get ID -->n
Token 35= 0
Get ID -->argv
Token 36= 0
Token 37= 30
Get NUM -->0
Token 38= 1
Token 39= 31
Token 40= 29
Token 41= 37
Get ID -->exit
Token 42= 0
Token 43= 28
Get NUM -->1
Token 44= 1
Token 45= 29
Token 46= 37
Token 47= 33
Get Keywords -->if
Token 48= 0
Token 49= 28
Token 50= 28
Get ID -->fp
Token 51= 0
Get ID -->fopen
Token 52= 0
Token 53= 28
Get ID -->argv
Token 54= 0
Token 55= 30
Get NUM -->1
Token 56= 1
Token 57= 31
Get ID -->r
Token 58= 0
Token 59= 29
Token 60= 29
Get ID -->NULL
Token 61= 0
Token 62= 29
Token 63= 32
Get ID -->printf
Token 64= 0
Token 65= 28
Get ID -->Can
Token 66= 0
Get ID -->t
Token 67= 0
Get ID -->open
Token 68= 0
Get ID -->s
Token 69= 0
Get ID -->n
Token 70= 0
Get ID -->argv
Token 71= 0
Token 72= 30
Get NUM -->1
Token 73= 1
Token 74= 31
Token 75= 29
Token 76= 37
Get ID -->exit
Token 77= 0
Token 78= 28
Get NUM -->1
Token 79= 1
Token 80= 29
Token 81= 37
Token 82= 33
Get Keywords -->while
Token 83= 0
Token 84= 28
Token 85= 28
Get ID -->ch
Token 86= 0
Get ID -->getc
Token 87= 0
Token 88= 28
Get ID -->fp
Token 89= 0
Token 90= 29
Token 91= 29
Token 92= 36
Get ID -->EOF
Token 93= 0
Token 94= 29
Token 95= 32
Get ID -->putchar
Token 96= 0
Token 97= 28
Get ID -->ch
Token 98= 0
Get ID -->stdout
Token 99= 0
Token 100= 29
Token 101= 37
Get ID -->printf
Token 102= 0
Token 103= 28
Get ID -->File
Token 104= 0
Get ID -->s
Token 105= 0
Get ID -->has
Token 106= 0
Get ID -->ld
Token 107= 0
Get ID -->characters
Token 108= 0
Get ID -->n
Token 109= 0
Get ID -->argv
Token 110= 0
Token 111= 30
Get NUM -->1
Token 112= 1
Token 113= 31
Get ID -->count
Token 114= 0
Token 115= 29
Token 116= 37
Get ID -->return
Token 117= 0
Get NUM -->0
Token 118= 1
Token 119= 37
Token 120= 33

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值