词法分析程序<二>

#include "conio.h"
#include "string.h"
#include "ctype.h"
#include <stdlib.h>
char save[20];/*定义暂存函数*/
char *p;
char count[200];
int total;
char *sum[13]={"const","var","procedure","begin","end","odd","if","then","call","while","do","read","write"};/*定义13个关键字*/

char alpha()/*分析标识符*/
{ int i,j;
  char *opp;
  i=0;
  j=0;/*j=0是标识符,j=1是关键字*/
  while(isalnum(*p))/*检查是字母还是数字,如果是字母返回1,是数字返回2*/
	 { save[i]=*p;
	   p++;i++; 
}
  opp=save;
  for(i=0;i<=12;i++)/*把字母与关键字表核对,如果是关键字就设置j=1*/
    if(!(strcmp(opp,sum[i])))/*比较两个字符串*/
    { printf(" %d  keyword  %s\n",total,opp); /*识别关键字*/
	  j=1;
    }
  if(j==0) printf(" %d  captionsign  %s\n",total,opp); /*识别标识符*/
  p--; /*回退多读进的字符*/
  return 0;
}

char digit()/*分析数字*/
{ int i;
  i=0;
  while(isdigit(*p))/*检查是否数字(0-9)*/
	{ save[i]=*p;
	  i++;p++;
	 }
  printf(" %d  digit  %s\n",total,save);
  p--;
  return 0;
}
int main()

{ int i,j;
  total=1;/*计数器等于一*/
  memset(count,0,200);/*把count所指内存区域的前200个字节设置成字符0*/
  system("cls");
  strcpy(count,"const a=10;var b,c;procedure p; begin c:=b+a end;begin read(b);while b#0 do begin call p;write(2*c);read(b) end end.");
  printf("The source program is:\n");
  puts(count);
  printf("\n");
  p=count;
  while(*p!='\0')/*检查源程序是否结束*/
    { memset(save,0,20);
   while(*p==' '||*p=='\n'||*p=='\t')p++;/*检查是否是空白字符,如果是直接跳过*/
      if(isalpha(*p)) alpha();/*识别关键字或标识符*/
      else if(*p==';')//识别分号
           printf(" %d  boundarysign   %c\n",total,*p);
          else if(*p==',')//识别逗号
               printf(" %d  boundarysign  %c\n",total,*p);
				else if(*p=='>')//识别大于号
                    printf(" %d  boundarysign  %c\n",total,*p);
				else if(*p=='<')//识别小于号
					 printf(" %d  boundarysign  %c\n",total,*p);
				else if(*p=='>=')//识别大于等于号
					printf(" %d  boundarysign  %s\n",total,*p);
				else if(*p=='<=')//识别小于等于号
                 printf(" %d  boundarysign  %s\n",total,*p);
				   else if(*p=='*')//识别乘号
					 printf(" %d  boundarysign  %c\n",total,*p);
				   else if(*p=='/')//识别除号
               printf(" %d  boundarysign  %c\n",total,*p);
				   else if(*p=='#')//识别井号
               printf(" %d  boundarysign  %c\n",total,*p);
             else if(*p==':')//识别冒号
			    	{p++;
				     if(*p=='=')//识别等号
				  printf(" %d  airthmeticsign  %s\n",total,":=");/*识别赋值号*/
		           else
					  { printf(" %d airthmeticsign %s\n",total,":");/*识别冒号*/
                     p--; /*回退多读进字符*/
					  }
				    }
				   else if(*p=='+')//识别加号
                      printf(" %d  arithmeticsign  %c\n",total,*p);
                     else if(*p=='.')//识别减号
                         printf(" %d  boundarysign  %c\n",total,*p);
                         else if(*p=='(')//识别左括号
                              printf(" %d  boundarysign  %c\n",total,*p);
                             else if(*p==')')//识别右括号
                                printf(" %d  boundarysign  %c\n",total,*p);
						            else if(isdigit(*p))/*识别整数*/
                                     digit();
    total=total+1;p++;  /*准备识别下一个单词*/
  }
  printf("\npress any key to return");
  getch();
  return 0;
}


实验一  手工构造简单词法分析程序(必修) 一、实验目的 了解词法分析程序的基本构造原理,掌握简单词法分析程序的手工构造方法。 、实验内容 对从键盘输入或从文件读入的形如: “const count=10,sum=81.5,char1=’f’,string1=”hj”, max=169;”的常量说明串进行处理,分析常量说明串中各常量名、常量类型及常量值,并统计各种类型常量个数。 三、实验要求 1、输入的常量说明串,要求最后以分号作结束标志; 2、根据输入串或读入的文本文件中第一个单词是否为“const”判断输入串或文本文件是否为常量说明内容; 3、识别输入串或打开的文本文件中的常量名。常量名必须是标识符,定义为字母开头,后跟若干个字母,数字或下划线; 4、根据各常量名紧跟等号“=”后面的内容判断常量的类型。其中:字符型常量定义为放在单引号内的一个字符;字符串常量定义为放在双引号内所有内容;整型常量定义为带或不带+、- 号,不以0开头的若干数字的组合;实型常量定义为带或不带+、- 号,不以0开头的若干数字加上小数点再后跟若干数字的组合; 5、统计并输出串或文件中包含的各种类型的常量个数; 6、以元组(类型,值)的形式输出各常量的类型和值; 7、根据常量说明串置于高级语言源程序中时可能出现的错误情况,模仿高级语言编译器对不同错误情况做出相应处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值