实验一、词法分析实验
专业:商业软件工程二班 姓名 :林凯盛 学号: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. 运行结果及分析
四、 实验总结