词法分析
实验一、词法分析实验
专业:商业软件 姓名:韦兴纳 学号: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)对读取的字符串进行字母字符和数字字符的判断。接着逐个读取字符进行词法分析。
                    
                
                
            
        
浙公网安备 33010602011771号