|
实验一、词法分析实验
商业软件工程 曾颖鑫 学号 201506110229
一、 实验目的
编写一个词法分析。
二、 实验内容和要求
输入:源程序字符串
输出:二元组(种别,单词本身)
各种单词符号对应的种别码:
|
单词符号 |
种别码 |
单词符号 |
种别码 |
|
bagin |
1 |
: |
17 |
|
If |
2 |
:= |
18 |
|
Then |
3 |
< |
20 |
|
while |
4 |
<> |
21 |
|
do |
5 |
<= |
22 |
|
end |
6 |
> |
23 |
|
lettet(letteet|digit) |
10 |
>= |
24 |
|
digit digit* |
11 |
= |
25 |
|
+ |
13 |
; |
26 |
|
- |
14 |
( |
27 |
|
* |
15 |
) |
28 |
|
/ |
16 |
# |
0 |
三、 实验方法、步骤及结果测试
1. 源程序名:词法分析.c
2. 主要程序段及其解释:
#include<stdio.h>
#include<string.h>
char ch,token[8],prog[80];
int syn,p,m,n,sum;
char *rwtab[6]={"begin","if","then","while","do","end"};
void scaner();
main()
{
p=0;
printf("请输入一个字符串(输入#表示结束):");
do{
scanf("%c",&ch);
prog[p++]=ch;
}while(ch!=#);
p=0;
do{
scaner();
switch(syn)
{
case 11:printf("%-10d%5d\n",sum,syn);
break;
case -1:printf("输入的字符串有误!\n");
getch();
exit(0);
default:printf("%-10s%5d\n",token,syn);
break;
}
}while(syn!=0);
getch();
}
void scaner()
{
sum=0;
for(m=0;m<8;m++)
token[m++]=NULL;
ch=prog[p++];
m=0;
while((ch==‘ ‘)||(ch==‘\n‘))
ch=prog[p++];
if(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘)))
{
while(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘))||((ch>=‘0‘)&&(ch<=‘9‘)))
{
token[m++]=ch;
ch=prog[p++];
}
p--;
syn=10;
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
{
syn=n+1;
break;
}
}
else if((ch>=‘0‘)&&(ch<=‘9‘))
{
while((ch>=‘0‘)&&(ch<=‘9‘))
{
sum=sum*10+ch-‘0‘;
ch=prog[p++];
}
p--;
syn=11;
}
else switch(ch)
{
case ‘<‘:token[m++]=ch;
ch=prog[p++];
if(ch==‘=‘)
{
syn=22;
token[m++]=ch;
}
else
{
syn=20;
p--;
}
break;
case ‘>‘:token[m++]=ch;
ch=prog[p++];
if(ch==‘=‘)
{
syn=24;
token[m++]=ch;
}
else
{
syn=23;
p--;
}
break;
case ‘+‘: token[m++]=ch;
ch=prog[p++];
if(ch==‘+‘)
{
syn=17;
token[m++]=ch;
}
else
{
syn=13;
p--;
}
break;
case ‘-‘:token[m++]=ch;
ch=prog[p++];
if(ch==‘-‘)
{
syn=29;
token[m++]=ch;
}
else
{
syn=14;
p--;
}
break;
case ‘!‘:ch=prog[p++];
ch=prog[p++];
if(ch==‘=‘)
{
syn=21;
token[m++]=ch;
}
else
{
syn=31;
p--;
}
break;
case ‘=‘:token[m++]=ch;
ch=prog[p++];
if(ch==‘=‘)
{
syn=25;
token[m++]=ch;
}
else
{
syn=18;
p--;
}
break;
case ‘*‘:syn=15;
token[m++]=ch;
break;
case ‘/‘:syn=16;
token[m++]=ch;
break;
case ‘(‘:syn=27;
token[m++]=ch;
break;
case ‘)‘:syn=28;
token[m++]=ch;
break;
case ‘{‘:syn=5;
token[m++]=ch;
break;
case ‘}‘:syn=6;
token[m++]=ch;
break;
case ‘;‘:syn=26;
token[m++]=ch;
break;
case ‘\"‘:syn=30;
token[m++]=ch;
break;
case ‘#‘:syn=0;
token[m++]=ch;
break;
case ‘:‘:syn=17;
token[m++]=ch;
break;
default: syn=-1;
break;
}
token[m++]=‘\0‘;
}
3. 运行结果及分析
四、 实验总结
词法分析可以帮助自己更好地了解编译语言的编译工作原理,此次实验花了很多功夫才完成对编译器读取字符的工作有了一定了解。
原文:http://www.cnblogs.com/229zyx/p/5955654.html