实验一: 词法分析器
-----------------------------------------
分界符, ; . := ( )
-----------------------------------------
算术运算符
(code,运算符)
10H +
11H-
20H *
21H /
------------------------------------------
cin>>str; //输入要检测的字符串
//p=str;
//cout<<str;
judge(str);
cout<<"do u want to continue? 'y'or'n'"<<endl;
cin>>c;
}
return;
}
源程序(二)
此程序实现对一段pascal代码的词法分析,显示结果:
关键字begin do else end if then var while
主要的几个函数是:
bool Is_keyword(char str1[])判断是否为关键字
bool Is_signword(char str1[])判断是否为标志符
bool Is_digit(char str1[])判断是否为数字
bool Is_special(char str1[])判断是否为特殊符号
实验一:词法分析器
实验要求:
输入一段源程序或者是字符序列,判断它属于关键字或者是标志符等类型,
通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。
掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
实验说明:
本实验里面设计了两个程序,第一个非常简单,只有最简单的判断功能,即输入一个字符,判断它是属于关键字,或者标志符,或者数字,或者特殊字符,然后输出到屏幕它的类型,实现方法和编写的代码都很简单.
}
else if(!(isdigit(*p))==0) ///判断是否为数字
{
if(Is_digit(str)==1)
cout<<"数字"<<p<<endl;p=str;
}
else if (Is_special(str)==1) //判断是否为特殊符号
{
cout<<"特殊符号"<<str<<endl;
int tempi; /*循环过程中用到指针*/
/*返回结果形式的结构体*/
typedef struct
{
int CODE;
int TYPE;
}RetCT;
/*各个子过程*/
void GetChar() /*取得一个字符*/
{
ch=instring[searchi];
searchi=searchi+1;
/*标识符和常数数组,最好是弄成动态分配*/
int maski=-1,consi=-1; /*上述数组对应的指针*/
/*词法分析用到的一些变量*/
char strToken[8],ch,instring[500]; /*字符串、字符、文件缓冲变量*/
int si=0,searchi=0; /*对应的指针*/
{
for(i=0;i<17;i++)
{
if(strcmp(special[i],q)==0)
return(1);
}
q++;
}
return 0;
}
void judge(char str[])
{
char *p;
p=str;
if(!(isalpha(*p))==0)//判断是否为关键字//
{
if(Is_keyword(str)==1)
}
elsecout<<"输入错误"<<endl;//判断是否为输入错误
}
void main()
{
char str[M];
//char *p;
char c;
c='y';
//cout<<c<<endl;
while((c='y'||'Y')
{
cout<<"please input the str:"<<endl;
实验过程:
本实验中用到c中自带的几个判断字母和数字的函数,他们包含在ctype.h
主要用到其中的几个函数如下:
oisalnum - 是否為英文字母或數字字元(A~Z, a~z, 0~9)
oisalpha - 是否為英文字母(A~Z, a~z)
oisdigit - 是否為數字字元(0~9)
当其为真时,则返回非零值,由此可以由其返回的布尔值判断字符,为字符的类型判断提供了很大的方便。
关系运算符
(code,运算符)
00H <
01H <=
02H =
03H >
04H >=
05H <>
------------------------------------------
字符种类code type
关键字指针,0
分界符指针,1
算术运算符code,2
关系运算符code,3
标识符指针,4
常数表指针,5
char* key[6]={"begin","if","then","while","do","end"};
/*定义关键字*/
char* par[6]={",",";",".",":=","(",")"}; /*定义分界符*/
typedef struct /*定义运算符结构体*/
{
int ISN; /*内部编码*/
Main()主函数部分用最简单的if else 结构,形成多个If….Else if 的嵌套,顺次判断字符是否为某个函数中的真值,是则输出对应的显示,否则继续向下运行,如果最后还得不到匹配的话就输出提示错误的信息,整个实现的方法和思路都很简单。
实验流程图:
试验结果:
源程序(一)
///////////////////////////////////////////////
//////////////////////关键字定义//////////////////////////////
bool Is_keyword(char str1[])
{
int i;
char *keyword[]={"int","char","double","float","unsigned"}; ////////未完成的关键字排列
bool Is_special(char str1[])
{
int i;
char *q;
q=str1;
char *special[]={"~","!","@","#","$","%","^","&","*","(",")","-","+","?","<",">","/"};
while((*q)!='\0')
{
char *q;
for(q=str1;(*q)!='\0';q++)
{
if((*q=='_')||(!isalnum(*q)==0))
continue;
else
{return 0;}
}
return 1;
}
////////////////////数字定义/////////////////////////////////////
cout<<"关键字"<<p<<endl;
}
p=str;
if(!(isalpha(*p))==0||(*p=='_'))//判断是否为标志符/
{
if((Is_signword(str)==1)&&(Is_keyword(str)==0))
cout << "标志符" <<p<< endtrToken,RelOpe[tempi].Oper)==0){return RelOpe[tempi].ISN;}
{
if((ch<='Z'&& ch>='A')||(ch<='z'&&ch>='a'))
return 1;
else return 0;
}
int IsDigit() /*判断某个字符是否为数字*/
{
if(ch<='9'&&ch>='0') return 1;
else return 0;