实验一、词法分析实验
专业:商业软件 姓名:韦兴纳 学号:201506110242
一、 实验目的
编写一个词法分析程序模拟编译器分析解释程序字符串的过程。
二、 实验内容和要求
输入:源程序字符串
输出:二元组(种别,单词本身)
各种单词符号对应的种别码
单词符号 |
种别码 |
单词符号 |
种别码 |
Begin |
1 |
: |
17 |
If |
2 |
:= |
18 |
Then |
3 |
< |
20 |
While |
4 |
<= |
21 |
Do |
5 |
<> |
22 |
End |
6 |
> |
23 |
|(||d)* |
10 |
>= |
24 |
Dd* |
11 |
= |
25 |
+ |
13 |
; |
26 |
- |
14 |
( |
27 |
* |
15 |
) |
28 |
/ |
16 |
# |
0 |
三、 实验方法、步骤及结果测试
- 1. 源程序名:压缩包文件(rar或zip)中源程序.c
可执行程序名:词法分析.exe
- 2. 原理分析及流程图
- 3. 主要程序段及其解释:
1、接收用户输入:getchar()和do…while循环的组合
do{
ch=getchar();
prog[p++]=ch;
}while(ch!='#'); //输入以#号键结束
2、对输入的字符串进行数字字符和字母字符的分析判断,并保存相应单词的种别码
void scaner(){
int m=0;
sum=0;
char *keyword[7]={"begin","if","then","for","while","do","end"};//数组存放关键字
for(n=0;n<9;n++)
token[n]='\0';
ch=prog[p++];
while(ch==' ')
ch=prog[p++];
if(isalpha(ch)) /*ch为字母字符*/{
while(isalpha(ch)||isdigit(ch)) /*ch 为字母字符或者数字字符*/{
token[m++]=ch;
ch=prog[p++];}
token[m++]='\0';
ch=prog[p--];
syn=10;
for(n=0;n<7;n++)
if(strcmp(token,keyword[n])==0) /*字符串的比较*/{
syn=n+1;
break;}}
else
if(isdigit(ch)) /*ch是数字字符*/{
while(isdigit(ch)) /*ch是数字字符*/{
sum=sum*10+ch-'0';
ch=prog[p++];}
ch=prog[p--];
syn=11;}
else
switch(ch){
case'<':
m=0;token[m++]=ch;ch=prog[p++];
if(ch=='>'){
syn=21;
token[m++]=ch;}
else if(ch=='='){
syn=22;
token[m++]=ch;}
else{
syn=20;
ch=prog[p--];}
break;
case'>':
m=0;token[m++]=ch;ch=prog[p++];
if(ch=='='){
syn=24;
token[m++]=ch;}
else{
syn=23;
ch=prog[p--];}
break;
case':':
m=0;token[m++]=ch;ch=prog[p++];
if(ch=='='){
syn=18;
token[m++]=ch;}
else{
syn=17;
ch=prog[p--];}
break;
case'+':
syn=13;token[0]=ch;
break;
case'-':
syn=14;token[0]=ch
;break;
case'*':
syn=15;token[0]=ch;
break;
case'/':
syn=16;token[0]=ch;
break;
case'=':
syn=25;token[0]=ch;
break;
case';':
syn=26;token[0]=ch;
break;
case'(':
syn=27;token[0]=ch;
break;
case')':
syn=28;token[0]=ch;
break;
case'!':
syn=29;token[0]=ch;
break;
case'#':
syn=0;token[0]=ch;
break;
default:syn=-1;}
}
- 4. 运行结果及分析
四、 实验总结
心得体会,实验过程的难点问题及其解决
做词法分析程序时遇到了很多困难,因为其中涉及很多分析判断。编程之前必须对题目有清晰的思路。先用getchar()和do…while循环的组合接受用户输入的字符串,再用isalpha(ch)||isdigit(ch)对读取的字符串进行字母字符和数字字符的判断。接着逐个读取字符进行词法分析。