⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cifafenxi.c

📁 一个词法分析
💻 C
字号:
/*  HELLO.C -- Hello, world */
/**********************
student:LiPeng
Date : 2008-12-5
**********************/

#include "stdio.h"
#include "conio.h"
#include "string.h"

#define     BEGIN       1       /* The Token class for word begin */
#define     NUMB        2
#define     IDEN        3
#define     ADD         4
#define     MULT        5
#define     ASS         6
#define     READ        7
#define     WRITE       8
#define     SEMI        9
#define     OPEN        10
#define     CLOSE       11
#define     END         12
#define     MYEOF       -1

#define is_end_of_input(ch)     ((ch)=='\0')
#define is_lc_letter(ch)        ('a'<=(ch)&&(ch)<='z')
#define is_uc_letter(ch)        ('A'<=(ch)&&(ch)<='Z')
#define is_letter(ch)           ('a'<=(ch)&&(ch)<='z'||'A'<=(ch)&&(ch)<='Z')
#define is_digit(ch)            ('0'<=(ch)&&(ch)<='9')
#define is_letter_or_digit(ch)  (is_letter(ch)||is_digit(ch))
#define is_operator(ch)         ((ch)=='+'||(ch)=='-'||(ch)=='*')
#define is_layout(ch)           (!is_end_of_input(ch)&&(ch)<=' ')

FILE *fp;
char ch;

typedef struct{
    int class;
    char seman[100];
}Token_type;

Token_type Token;

/*
    function:next char
    in parameter:
    out parameter:
*/
void next_char(){
    
        ch=fgetc(fp);
}
/*
    function:error return
    in parameter:
    out parameter:
*/
void error(){
   printf("the unidentify char\n");
   Token.class=-2;strcpy(Token.seman,"");
   next_char();
}
/*
    function:
    in parameter:
    out parameter:
*/
void recognize_number(){
    int N=0;
    int pos =0;
    while(is_digit(ch)){
        N=N*10+(ch-'0');
        Token.seman[pos]= ch;
        pos++;
        next_char();}
    Token.class=NUMB;

}
/*
    function:
    in parameter:
    out parameter:
*/
void recognize_name(){
char name[1000];
int np=0;
name[np++]=ch;
next_char();
while(is_digit(ch)||is_letter(ch)){name[np++]=ch;next_char();}
name[np]='\0';
if(strcmp(name,"begin")==0){
    Token.class=BEGIN; strcpy(Token.seman,"");}
else if(strcmp(name,"end")==0){
    Token.class=END; strcpy(Token.seman,"");}
else if(strcmp(name,"read")==0){
    Token.class=READ; strcpy(Token.seman,"");}
else if(strcmp(name,"write")==0){
    Token.class=WRITE; strcpy(Token.seman,"");}
else {Token.class=IDEN; strcpy(Token.seman,name);}
}
/*
    function:
    in parameter:
    out parameter:
    return value
*/
void next_avail_char(){
while(is_layout(ch)){
next_char();
}
}
/*
    function:
    in parameter:
    out parameter:
    return value
*/
void next_token(){
next_avail_char();

switch(ch){
case '0' :
case '1' :
case '2' :
case '3' :
case '4' :
case '5' :
case '6' :
case '7' :
case '8' :
case '9' :
          recognize_number(); break;
case 'a' :
case 'b' :
case 'c' :
case 'd' :
case 'e' :
case 'f' :
case 'g' :
case 'h' :
case 'i' :
case 'j' :
case 'k' :
case 'l' :
case 'm' :
case 'n' :
case 'o' :
case 'p' :
case 'q' :
case 'r' :
case 's' :
case 't' :
case 'u' :
case 'v' :
case 'w' :
case 'x' :
case 'y' :
case 'z' :
case 'A' :
case 'B' :
case 'C' :
case 'D' :
case 'E' :
case 'F' :
case 'G' :
case 'H' :
case 'I' :
case 'J' :
case 'K' :
case 'L' :
case 'M' :
case 'N' :
case 'O' :
case 'P' :
case 'Q' :
case 'R' :
case 'S' :
case 'T' :
case 'U' :
case 'V' :
case 'W' :
case 'X' :
case 'Y' :
case 'Z' :
           recognize_name();break;
case '+' : Token.class=ADD;strcpy(Token.seman,"");next_char();break;
case '*' : Token.class=MULT;strcpy(Token.seman,"");next_char();break;
case ':' : next_char();if(ch!='=') error();
           else {Token.class=ASS;strcpy(Token.seman,"");next_char();}break;
case ';' : Token.class=SEMI;strcpy(Token.seman,"");next_char();break;
case '(' : Token.class=OPEN;strcpy(Token.seman,"");next_char();break;
case ')' : Token.class=CLOSE;strcpy(Token.seman,"");next_char();break;
case '\0' :Token.class=EOF;strcpy(Token.seman,"");next_char();break;
default : error();
}
}


main()
{

    if((fp=fopen(".\\code.txt","r"))==0){
    printf("open failed");
    }
    
        ch=fgetc(fp);
    

    while(ch != MYEOF)
    {
       next_token();
       printf("%d     %s\n",Token.class,Token.seman);

      }

    getch();

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -