#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
#define _KEY_WORD_END "waiting fou your expanding"/*定义关键字的结束标志*/
typedef struct
{
int typenum; /*种别码*/
char *word;
}WORD;
char input[255]; /*源程序缓字符冲区*/
char token[255]=""; /*单词缓冲区*/
int p_input; /*源程序字符指针*/
int p_token; /*单词缓冲区指针*/
char ch;
char *rwtab[]={"begin","if","then","while","do","end",_KEY_WORD_END};
WORD *scaner(); /*词法扫描函数,获得一个单词*/
void main()
{
int over=1;
int count=0;
WORD *oneword = new WORD;
printf("Enter Your words(end with #):");
scanf("%[^#]s",input); /*输入源程序字符串到缓冲区,以#结束*/
p_input=0;
printf("词法分析结果是:\n\n");
while (over<1000 && over!= -1)
{
oneword=scaner();
if(oneword->word=="OVER")
break;
else if(oneword->typenum <1000)
printf("(%d,%s) ",oneword->typenum ,oneword->word );
over=oneword->typenum ;
count++;
if(count%6==0) printf("\n");//每六行输出
}
}
char m_getch() /*从输入源读一个字符到CH中*/
{
ch=input[p_input];
p_input=p_input+1;
return ch;
}
void getbc() /*去掉空白字符*/ {
while (ch == ' '|| ch== 10)
{
ch = input[p_input];
p_input=p_input+1;
}
}
void concat() /*拼接单词*/
{
token[p_token]=ch;
p_token=p_token+1;
token[p_token]='\0';
}
int letter()/*判断是否是字母*/
{
if(ch>='a' && ch<='z'|| ch >='A'&& ch <='Z')
return 1;
else return 0;
}
int digit()/*判断是否是数字*/
{
if(ch>='0'&& ch<='9')
return 1;
else return 0;
}
int reserve()/*检索关键字表格*/
{
int i=0;
while(strcmp(rwtab[i],_KEY_WORD_END))
{
if(!strcmp(rwtab[i],token))
{
return i+1;
}
i=i+1;
}
return 10;
}
void retract()/*回退一个字符*/
{
p_input=p_input-1;
}
char *dtb()
{ return NULL;
}
WORD *scaner()/*词法扫描程序*/
{
WORD *myword =new WORD;
myword->typenum=10;
myword->word=" ";
p_token=0;
m_getch();
getbc();
if(letter())
{
while(letter()||digit())
{
concat();
m_getch();
}
retract();
myword->typenum=reserve();
myword->word=token;
return myword;
}
else if(digit())
{
while(digit())
{
concat();
m_getch();
}
retract();
myword->typenum =11;
myword->word =token;
return myword;
}
else switch(ch)
{
case'=' : m_getch();
if(ch=='=')
{
myword->typenum =29;
myword->word ="==";
return myword;
} retract();
myword->typenum =25;
myword->word ="=";
return myword;
break;
case'+':myword->typenum =13;
myword->word ="+";
return myword;
break;
case'-':myword->typenum =14;
myword->word ="-";
return myword;
break;
case'*':myword->typenum =15;
myword->word ="*";
return myword;
break;
case'/':myword->typenum =16;
myword->word ="/";
return myword;
break;
case'(':myword->typenum =27;
myword->word ="(";
return myword;
break;
case')':myword->typenum =28;
myword->word =")";
return myword;
break;
case'[':myword->typenum =30;
myword->word ="[";
return myword;
break;
case']':myword->typenum =31;
myword->word ="]";
return myword;
break;
case'{':myword->typenum =32;
myword->word ="{";
return myword;
break;
case'}':myword->typenum =33;
myword->word ="}";
return myword; break;
case',':myword->typenum =34;
myword->word =",";
return myword;
break;
case':':
if(input[p_input]=='=')
{
myword->typenum =18;
myword->word =":=";
return myword;
}
else
myword->typenum =17;
myword->word =":";
return myword;
break;
case';':myword->typenum =26;
myword->word =";";
return myword;
break;
case'>':
m_getch();
if(ch=='=')
{
myword->typenum =24;
myword->word =">=";
return myword;
}
retract();
myword->typenum =23;
myword->word =">";
return myword;
break;
case'<':
m_getch();
if(ch=='=')
{
myword->typenum =22;
myword->word ="<=";
return myword;
}
retract(); myword->typenum =20;
myword->word ="<";
return myword;
break;
case'!':
m_getch();
if(ch=='=')
{
myword->typenum =40;
myword->word ="!=";
return myword;
}
retract();
myword->typenum =-1;
myword->word ="ERROR";
return myword;
break;
case'\0':
myword->typenum=100;
myword->word="OVER";
return myword;
break;
default:
myword->typenum=-1;
myword->word="ERROR";
return myword;
}
}
cifa.zip_quickl4m
版权申诉
125 浏览量
2022-09-23
00:07:36
上传
评论
收藏 2KB ZIP 举报
小波思基
- 粉丝: 74
- 资源: 1万+
最新资源
- tomcat安装及配置教程.md
- 51单片机贴片心形灯原理图PCB程序 亚克力外壳.dwg资料
- 户型为单家独院式图纸编号D068-三层-20.60&13.40米-施工图.dwg
- 农村小别墅图纸编号D067-三层-10.00&11.50米- 施工图.dwg
- 三层独栋别墅图纸编号D066-三层-12.00&12.00米- 施工图.dwg
- 农村小别墅图纸编号D065-三层-14.40&18.55米-施工图.dwg
- 基于YOLOv8检测高铁吊弦缺陷实现的系统的Python源码+文档说明+训练源文件+模型.zip
- 三层农村小别墅图纸编号D064-三层-13.80&22.20米-施工图.dwg
- 三层别墅图纸编号D063-三层-13.57&17.40米- 施工图.dwg
- STC IAP15F2K61S2单片机i2c 接口PCF8591-ADC实验+DAC实验 KEIL例程源码+开发板硬件原理图
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈