编译原理课程设计-词法分析器

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机与信息学院编译原理课程设计
实验报告
专业班级
计算机科学与技术专业08-4班
学生姓名及学号
胡义涛20082645
课程教学班号
0001
任课教师
王仲宾
实验指导教师
王仲宾
实验地点
逸夫楼507
2010~2011 第三学年第一学期
一、实验目的和要求:
设计并实现一个C语言(或C++语言)的词法分析程序,加深对词法分析原理的理解。

二、试验设计和算法分析:
实验原理:
程序流程:
置初值→调用扫描子程序→输出串结束→输出单词二元组→是→否→结束
词法分析主程序示意图
待分析的简单语言的词法
(1) 关键字:
begin if then while do end
所有关键字都是小写。

(2)运算符和界符:
:= + - * / < > <= <> >= ; ( ) #
(3)空格由空白、制表符和换行符组成。

词法分析程序的算法思想
算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。

三、源代码:
#include "stdio.h"
#include "string.h"
#include "conio.h"
#include "ctype.h"
char prog[80]={'\0'},
token[8]; /*存放构成单词符号的字符串*/
char ch;
int syn, /*存放单词字符的种别码*/
n,
sum, /*存放整数型单词*/
m,p; /*p是缓冲区prog的指针,m是token的指针*/
char
*rwtab[6]={"begin","if","then","while","do","end" };
void scaner(){
m=0;
sum=0;
for(n=0;n<8;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<6;n++)
{ if(strcmp(token,rwtab[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'10':syn=12;token[0]='n';break;
case'11':syn=12;token[0]='n';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=0 ;token[0]=ch;break;
default:syn=-1;}
}
main()
{
printf("\n\n对应信息:\n"
"1.1-6为关键字\n"
"2.10-11为字符或常量\n"
"3.12-28为表示符\n");
p=0;
printf("\nplease input string:\n");
do {
ch=getchar();
prog[p++]=ch;
}while(ch!='#');
p=0;
do{
scaner();
switch(syn){
case 11: printf("(%d,%d)\n",syn,sum);break;
case -1: printf("\n ERROR;\n");break;
default: printf("(%d,%s)\n",syn,token); }
}while(syn!=0);
getch();
}
四、实验结果及总结:
输出:
总结:
通过该实验,主要有以下几方面收获:
一、对实验原理有更深的理解。

二、对词法分析在实践中的应用有深刻的理解。

在实践的基础上,把所学过的知识应用于实际应用,更深刻的理解了词法分析以及编译原理的实际应用。

相关文档
最新文档