词法分析

编译原理的试验,小弟自己写的,百分百元创。

#include<stdio.h>
#include<conio.h>
#include<string.h>
FILE *fp;
typedef struct
{
 char temp[100][100];
 int result[100];
}number;
typedef struct
{
  char chara[100][50];
}ch;
 /*全局变量begin*/
   number num; 
   ch  character;
   int  r = 0;/*整数型变量计数器*/
   char key[100][50] =
   {
 {"wang"},
 {"liang"}
   }; /*定义关键字*/
   char customer[100][50];/*用户自定义*/
   char keyword[100][50];/*关键字*/
   int  cus = 0; /*customer计数器*/
   int kw=0; /*keyword的计算器*/  
 /*全局变量end*/
              

void initKey()
{
 *(key+2)[0] = NULL;
}
void getCustomer(char *s1) /*在把输入的串分类后用于把字符串存到customer数组中*/
{
      strcpy(customer[cus],s1);
      cus++;
      customer[cus][0] = NULL;
}
int  getKeyWord(char *s1)/*在把输入的串分类后用于把字符串存到keyword数组中*/
{
   int k = 0;
   while(key[k][0] != NULL)
   {
    if(0 == strcmp(key[kw],s1))
     {
    strcpy(keyword[kw],s1);
      kw++;
      keyword[kw][0]=NULL;
      return 1;
     }
     k++;
   }
   return 0;
}
void parseInt(char *p )/*把字符串转换成int*/
{
 int temp=0;
   while( *p != '#')
   {
  temp =( temp + (*p - '0') ) * 10;
  p++;
   }
  num.result[r] = temp/10;
  r++;
  num.result[r] = NULL;
}
void classify(char c ,int *i, int *j, int *w, int *q,int *flag)/*用于把数值字符串,和字符串分开*/
{
     

      if( 0 == *q && 0 == *j )
       {
        if(c>='0' && c<='9')
         {
            *flag = 1;
         }
        if((c >= 'A' && c <= 'z') || (c >='a' && c <= 'z'))
         {
            *flag = 2;
         }
       }
      if(c>='0' && c<='9' && 1 == *flag)
       {
        num.temp[*i][*j] = c;
        (*j)++;
       }
  if(((c >= 'A' && c <= 'z') || (c >='a' && c <= 'z') || ( c >= '0' && c <= '9')) && *flag ==2)
       {
        character.chara[*w][*q] = c;
      (*q)++;
       }
  if(c == ' ' || c == EOF)
        {
         if(1 == *flag)
           {
           printf("/n/n");

      num.temp[*i][*j] = '#';
      parseInt(num.temp[*i]);
      (*j) = 0;
           (*i)++;
          }
          else if(2 == *flag)
          {

      character.chara[*w][*q] = '/0';
      if(getKeyWord(character.chara[*w])==0)
       {
        getCustomer(character.chara[*w]);
       }
           *q = 0;
           (*w)++;
          }
            else
      *flag = -1;

        }
}
void  getOnebyOne(FILE *fp) /*逐个取文件中的字符*/
{
   int i = 0 , j = 0 , w = 0, q = 0, flag = -1;
      char c;
      c = getc(fp);
      while(c !=EOF )
      {
       /*printf("%c",c);*/
       classify(c, &i, &j, &w, &q, &flag);
      c = getc(fp);
           }
           classify(c, &i, &j, &w, &q, &flag);
}


void main()
{
    int n = 0;
    clrscr();

    if(NULL == fopen("D://wl.txt","r"))
     {
      printf("can not open the file");
      getch();
      return ;
     }
      else
  fp = fopen("D://wl.txt","r");
  initKey();
   getOnebyOne(fp);
 
   printf("int ");
   printf("/n/n");
   while(num.result[n] != NULL)
   {
    printf("%d ",num.result[n]);
       n++;
   }
   n = 0;
   printf("/n/n");
   printf("keyword");
   printf("/n/n");
   while(keyword[n][0] != NULL)
   {
  printf("%s", keyword[n]);
  n++;
   }
   n = 0;
  
   printf("/n/n");
   printf("customer");
   printf("/n/n");
   while(customer[n][0] != NULL)
   {
    printf("%s",customer[n]);
    n++;
   }
     getch();

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值