实验一
词法分析
—
.实验的目的和要求:
1
.掌握自动机技术应用于词法分析的基本方法。
2
.自动机的实现原理。
3
.用自动机如何实现词法分析。
二
.实验的内容:
micro
语言中所用到的单词有:
(1)
标识符:字母打头的字母
/
数字串
(2)
整常数:数字打头的数字串
(3)
符号词:‘
+
’
‘:’‘:
=
’
‘;’ ‘<=’’<’
三、实现要求:
1
、构造能识别上述单词的自动机。
2
、用
C
语言实现所构造的自动机。要求:若输入一个自动机所不能接受的字符串,计算机输出相应的错误信息,若输入一个此自动机所能接收的字符串,计算机则输出此字符串的
TOKEN
码;并且每个单词的
TOKEN
码输出列表如下:
identifier------------------------(
§
id,Name)
number ------------------------(
§int,Numb)
+----------------------------------(
§plus,”)
; ----------------------------------(
§semi,”)
:=---------------------------------(
§assi,”)
: --------------------------------(
§colon,”)
<=---------------------------------(
§le,”)
< --------------------------------- (
§lt,”)
其中
Name
是标识符名,而
Numb
是正整数(未翻译)。
#include
"
iostream.h
"
#include
"
string.h
"
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
Getchars(
char
*
ch)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
cout<<"请输入一个字符串!"<<endl;
cin>>ch;
}
void
Identifier(
char
*
ch)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
int n=0;
n=strlen(ch);//计算字符串CH的(unsigned int型)长度
if(n==1)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
cout<<"($ id,"<<ch<<")"<<endl;
return;
}
for(int i=1;i<n;i++)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(ch[i]<48)...{cout<<"输入的字符串在此编译器中非法的!"<<endl;return;}//48=0
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(ch[i]>57&&ch[i]<65)...{cout<<"输入的字符串在此编译器中非法的!"<<endl;return;}//57=9@@67=A
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(ch[i]>90&&ch[i]<97)...{cout<<"输入的字符串在此编译器中非法的!"<<endl;return;}//90=Z@@97=a
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(ch[i]>122)...{cout<<"输入的字符串在此编译器中非法的!!"<<endl;return;}//122=小写Z
}
cout<<"($ identifier,"<<ch<<")"<<endl;
}
void
Numbers(
char
*
ch)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
int n=0;
n=strlen(ch);
for(int i=0;i<n;i++)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if(ch[i]<48||ch[i]>57)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
cout<<"输入的字符串在此编译器中非法的!!"<<endl;return;
}
}
cout<<"($ int,"<<ch<<")"<<endl;
}
void
Signs(
char
*
ch)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
int n=0;
n=strlen(ch);
if(n==1)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
switch(ch[0])
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
case '+':
cout<<"($ plus"<<")"<<endl;
break;
case ';':
cout<<"($ semi"<<")"<<endl;
break;
case ':':
cout<<"($ colon"<<")"<<endl;
break;
case '<':
cout<<"($ lt"<<")"<<endl;
break;
default:
cout<<"输入的字符串在此编译器中非法的!"<<endl;
return;
}
}
else if(n==2)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
switch(ch[0])
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
case ':':
if(ch[1]=='=')
cout<<"($ assi,:="<<")"<<endl;
else cout<<"输入的字符串在此编译器中非法的!"<<endl;
break;
case '<':
if(ch[1]=='=')
cout<<"($ le,<="<<")"<<endl;
else cout<<"输入的字符串在此编译器中非法的!"<<endl;
break;
case '>':
if(ch[1]=='=')
cout<<"($ he,>="<<")"<<endl;
else cout<<"输入的字符串在此编译器中非法的!"<<endl;
break;
default:
cout<<"输入的字符串在此编译器中非法的!"<<endl;
return;
}
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
cout<<"输入的字符串在此编译器中非法的!"<<endl;
return;
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
main()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
char ch[20];
int num=0;
for(;;)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
num++;
Getchars(ch);
if((ch[0]>=65&&ch[0]<=90)||(ch[0]>=97&&ch[0]<=122))Identifier(ch);
else if(ch[0]>=48&&ch[0]<=57)Numbers(ch);
else Signs(ch);
if(num>61)return;
}
}