词法分析实验报告
2016-10-14 21:09 124杨锦达 阅读(345) 评论(2) 编辑 收藏 举报实验一、词法分析实验
专业商业软件工程 姓名杨锦达 学号201506110124
一、 实验目的
编织一个词法分析程序
二、 实验内容和要求
内容:
对字符串表示的源程序,从左到右进行扫描和分解,根据词法规则,识别出一个一个具有独立意义的单词符号,以供语法分析之用,发现词法错误,则返回出错信息
要求:
---输入:源程序字符串
---输出:二元组(种别,单词本身)
---待分析语言的此法规则
在源程序中,自动识别单词,把单词分为五种,并输出对应的单词种别码。
- 识别关键字:main if int for while do return break continue,该类的单词码为1.
- 识别标识符:表示各种名字,如变量名、数组名、函数名等,如char ch, int syn, token,sum,该类的单词码为2.
- 运算符:+、-、*、/、=、>、<、>=、<=、!=
- 分隔符:,、;、{、}、(、)
- 常数,如123,4587
三、 实验方法、步骤及结果测试
- 源程序名:编译原理实验报告中 源程序名 词法分析.c
可执行程序名:编译原理实验报告.exe
2.原理分析及流程图
3.主要程序段及其解释:
#include<stdio.h>
#include<string.h>
void F(char c,char b);
void word(char a[]);
void number(char a[]);
int i; //定义全局变量i
int s=1; //用来记录是否存在非法字符
main(){
char a[50];
printf("\n请您输入需要分析的字符串:\n");
gets(a);
printf("\n您要分析的字符串为:\n");
printf("\t%s",a);
printf("\n");
for(i=0;(a[i]!='\0')&&(i<50)&&s==1;i++){
if((a[i]>='a' && a[i]<='z')||(a[i]>='A' && a[i]<='Z'))
word(a);
else if(a[i]>='0' && a[i]<='9')
number(a);
else
F(a[i],a[i+1]);
}
printf("\n");
}
void number(char a[]) //对数字字符进行扫描分析
{
char b[50];
int m,k=0,t;
m=i;
while(a[m]>='0' && a[m]<='9')
{
b[k]=a[m]; //用数组b存放数组a中的数字
k++;
m++;
}
i=m-1;
printf("(11,");
for(t=0;t<k;t++)
printf("%c",b[t]);
printf(")");
printf("\n");
}
void word(char a[]) //对字母字符进行扫描分析,并识别保留字
{
int k=0,m,flag=0,t;
char b[50];
char *key[6]={"begin","if","then","while","do","end"};
m=i;
while((a[m]>='a'&&a[m]<='z')||(a[m]>='A'&&a[m]<='Z')) //用数组b存放数组a中的字母
{
b[k]=a[m];
k++;
m++;
b[k]='\0';
}
i=m-1;
for(t=0;t<6;t++)
{
if(strcmp(b,key[t])==0) //将数组b与关键字进行比较
{
printf("(%d,%s)",t+1,key[t]); //输出关键字
flag=1;
printf("\n");
}
}
if(flag==0)
{
printf("(10,%s)",b); //输出标识符
printf("\n");
}
}
void F(char c,char b) //对特殊字符进行扫描分析
{
switch(c){
case '+':
printf("(13,+)\n");
break;
case '-':
printf("(14,-)\n");
break;
case '*':
printf("(15,*)\n");
break;
case '/':
printf("(16,/)\n");
break;
case ':':
if(b=='=')
{
i++;
printf("(18,:=)\n");
}
else
printf("(17,:)\n");
break;
case ' ':
break;
case '<':
if(b=='>')
{
i++;
printf("(21,<>)\n");
}
else if(b=='=')
{
i++;
printf("(22,<=)\n");
}
else
printf("(20,<)\n");
break;
case '>':
if(b=='=')
{
printf("(24,>=)\n");
i++;
}
else
printf("(23,>)\n");
break;
case '=':
printf("(25,=)\n");
break;
case ';':
printf("(26,;)\n");
break;
case '(':
printf("(27,()\n");
break;
case ')':
printf("(28,))\n");
break;
case '#':
printf("(0,#)\n");
break;
default:
{
printf("\n存在字符 '%c',无法继续识别!\n",c);
s=0; //用s=0记录存在非法字符
break;
}
}
}
4.运行结果及分析
一般必须配运行结果截图,结果是否符合预期及其分析。
(截图需根据实际,截取有代表性的测试例子)
四、 实验总结
心得体会:实验一要理解并不是很难,但是其程序要为繁杂,需要对字符串逐个进行分析,这次的实验让我更加深刻的体会到了词法分析对于编程的重要性,并且懂得了编译原理的确是计算机领域的一大浪漫