实验一、词法分析实验
专业:商业软件工程二班 姓名 :林凯盛 学号:201506110149
一、 实验目的
编制一个词法分析程序
二、 实验内容和要求
实验内容:1.对字符串表示的源程序
2.从左到右进行扫描和分解
3.根据词法规则
4.识别出一个一个具有独立意义的单词符号
5.以供语法分析之用
6.发现词法错误,则返回出错信息
实验要求:输入:源程序字符串
输出:二元组(种别,单词本身)
待分析语言的词法规则
三、 实验方法、步骤及结果测试
- 1. 源程序名:压缩包文件(rar或zip)中源程序名 yjw.c
 
可执行程序名:yjw.exe
- 2. 原理分析及流程图
 
1、设置全局变量
1)char sum[] 把用户输入字符存到数组里面的
2)char ch 判断输入的字符的组成部分
3)char token[] 存放sum[]以及ch
4)*keyword[] 存放关键字
2、关键字表
*keyword[18]={"begin","and","const","long","float","double","void","main","if", "else","then","break","int","char","include","for","while","printf"}
3、关键函数
void scaner() 词法扫描及其判断程序
void main() 用户输入与输出
种别码表
| 
 单词符号  | 
 种别码  | 
 单词符号  | 
 种别码  | 
 单词符号  | 
 种别码  | 
 单词符号  | 
 种别码  | 
 
| 
 begin  | 
 1  | 
 int  | 
 13  | 
 :  | 
 28  | 
 }  | 
 40  | 
 
| 
 end  | 
 2  | 
 char  | 
 14  | 
 :=  | 
 29  | 
 !  | 
 41  | 
 
| 
 const  | 
 3  | 
 include  | 
 15  | 
 <  | 
 30  | 
 @  | 
 42  | 
 
| 
 long  | 
 4  | 
 for  | 
 16  | 
 <=  | 
 31  | 
 $  | 
 43  | 
 
| 
 float  | 
 5  | 
 while  | 
 17  | 
 <>  | 
 32  | 
 %  | 
 44  | 
 
| 
 double  | 
 6  | 
 printf  | 
 18  | 
 >  | 
 33  | 
 ^  | 
 45  | 
 
| 
 void  | 
 7  | 
 l(l|d)*  | 
 21  | 
 >=  | 
 34  | 
 &  | 
 46  | 
 
| 
 main  | 
 8  | 
 dd*  | 
 22  | 
 =  | 
 35  | 
 #  | 
 0  | 
 
| 
 if  | 
 9  | 
 +  | 
 24  | 
 ;  | 
 36  | 
 
  | 
 
  | 
 
| 
 else  | 
 10  | 
 -  | 
 25  | 
 (  | 
 37  | 
 
  | 
 
  | 
 
| 
 then  | 
 11  | 
 *  | 
 26  | 
 )  | 
 38  | 
 
  | 
 
  | 
 
| 
 break  | 
 12  | 
 /  | 
 27  | 
 {  | 
 39  | 
 
  | 
 
  | 
 
- 3. 主要程序段及其解释:
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char prog[100],ch,token[8];
int p=0,syn,n,i;
char *keyword[6]={"begin","then","if","while","do","end"};
void scaner();
void Irparse();
void statement();
void expression_r();
void term();
void factor();
void main()
{
int select=-1;
p=0;
printf("please input sentence, end of '#' !\n");
do
{
ch=getchar();
prog[p++]=ch;
}while(ch!='#');
p=0;
do
{
scaner();
switch(syn)
{
case -1:printf("词法分析 出错\n");break;
default :printf("<%d,%s>\n",syn,token);break;
}
}while(syn!=0);
printf("词法分析 成功\n");
getchar();
}
void scaner()
{
for(n=0;n<8;n++)
{token[n]='\0';}
n=0;
ch=prog[p++];
while(ch==' '){ch=prog[p++];}
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
{
do{
token[n++]=ch;
ch=prog[p++];
}while((ch>='a'&&ch<='z')||(ch>='a'&&ch<='z')||(ch>='0'&&ch<='9'));
syn=10;
for(n=0;n<6;n++)
{if(strcmp(token,keyword[n])==0)
{
syn=n+1;
}
}
p--;
//return;
}
else if(ch>='0'&&ch<='9')
{
p--;
do
{
token[n++]=prog[p++];
ch=prog[p];
}while(ch>='0'&&ch<='9');
syn=11;
return;
}
else
{
//ch=prog[p++];
switch(ch)
{
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=17;token[0]=ch;
ch=prog[p++];
if(ch=='='){token[1]=ch;syn++;}
else p--;
break;
case '<':syn=20;token[0]=ch;
ch=prog[p++];
if(ch=='>'){token[1]=ch;syn++;}
else if(ch=='='){token[1]=ch;syn=syn+2;}
else p--;
break;
case '>':syn=23;token[0]=ch;
ch=prog[p++];
if(ch=='='){token[1]=ch;syn++;}
else p--;
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=0;token[0]=ch;break;
default: printf("词法分析出错! 请检查是否输入非法字符\n");syn=-1;break;
}
//return;
}
}
void statement()
{
if(syn==10)
{
scaner();
if(syn==18)
{
scaner();
expression_r();
}
else
{
printf("语法分析出错! 请检查表达式是否正确\n");return;
}
}
else
{
printf("语法分析出错! 请检查语句是否正确\n");return;
}
}
void expression_r()
{
term();
while(syn==13||syn==14)//+ -
{
scaner();
term();
}
}
void term()
{
factor();
while(syn==15||syn==16)//* /
{
scaner();
factor();
}
}
void factor()
{
if(syn==10||syn==11)
{
scaner();
}
else if(syn==27)
{
scaner();
expression_r();
if(syn==28)
{
scaner();
}
else {printf("语法分析出错! 请检查是否缺少')'\n");return;}
}
else {printf("语法分析出错! 请检查是否输入非法字符\n");return;}
}
4. 运行结果及分析
 
四、 实验总结
                    
                
                
            
        
浙公网安备 33010602011771号