C语言词法分析器构造实验
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
词法分析器构造实验报告
学院: 计算机学院
班级: 计科七班
姓名: 曾楠
学号: 2010301500222
一、题目要求:
完成一个C语言的词法分析器的构造。此词法分析器能识别附值语句、循环语句、条件语句、并
能处理注释。
二、
设计方案
关于薪酬设计方案通用技术作品设计方案停车场设计方案多媒体教室设计方案农贸市场设计方案
:
这个词法分析器分析的主要关键字有:main, int, float, char, if, else, for, while, do, switch, case, break;
default。选择要分析的c文件,首先对其去掉注释和与空格处理,再根据字符的不同类型分析。
1、全局数据结构:
字符数组 set[ ]:存放从文件中读到的所有字符;
str[ ]:存放经过注释处理和预空格处理的字符;
strtoken[ ]:存放当前分析的字符;
结构体 KEYTABLE:存放关键字及其标号;
全局字符变量 ch:当前读入字符;
全局整型变量 sr, to:数组str, strtoken 的指针。
2、以层次图形式描述模块的组成及调用关系
Main ( )
Analysis ( )
Set32()
Openfile ( ) Reflesh() Concat()
GetBC() GetChar() Process()
Reserve() IsDigit() GetChar()
IsLetter() Retract()
3、主要函数的设计要求(功能、参数、返回值):
openfile:打开文件;
GetChar:将下一个输入字符读到ch中,搜索指示器前移一字符位置;
GetBC:检查ch中的字符是否为空白。若是,则调用GetChar直至ch中进入一个非空白字符;
Concat:将ch中的字符连接到strtoken之后;
IsLetter 和IsDigit:布尔函数过程,分别判断ch中的字符是否为字母和数字;
Reserve:整型函数过程,对strtoken中的字符串查找关键字表,若是关键字则返回编码,否则返回-1;
Retract:将搜索指示器回调一个字符位置,将ch置为空白字符;
reflesh:刷新,把strtoken数组置为空;
prearrange1:将注释部分置为空格;
prearrange2:预处理空格,去掉多余空格;
analysis:词法分析;
main:主函数。
4、状态转换图:
1 6 字母或数字
字母 非字母或数字
数字 数字 2 7 0 非数字
字符a 3 8 字符a
字符b
4 9 ‘ = ’
字符c
5
字符a包括:= , & , | , + , --
字符b包括:-- , < , > , | , *
字符c包括:, , : , ( , ) , { , } , [ , ] , ! ,# , % , ” , / , * , + , -- , > , <, .
三、源代码如下:
#include
#include
#include
#include
using namespace std;
char ch;
//关键字表
string keyword[50]={"bool","break","case","include","char","const",
"continue", "default", "do","double","else","false",
"float","for","if","int","long", "namespace","new","return",
"short","signed","struct","switch","true","using","void","while" ,"then"};
int gjz(string c){
int i;
for(i=0;i<50;i++)
{
if(keyword[i].compare(c)==0)
return 1;
}
return 0;
}
int zm(char c){
if(((c<='z')&&(c>='a')&&(c<='Z')&&(c>='z')))
return 1;
else return 0;
}
int number(char c){
if(c>='0'&&c<='9')
return 1;
else return 0;
}
void caculate(FILE *fpin){
ofstream out("mytest.txt",ios::out);
string arr="";
while ((ch=fgetc(fpin))!=EOF){
arr="";
if(ch==' '||ch=='\t'||ch=='\n'){}
else if(zm(ch)){
while(zm(ch)||number(ch)){
arr=arr+ch;
ch=fgetc(fpin);
}
fseek(fpin,-1L,SEEK_CUR);
if(gjz(arr)){out<='a'))||((ch<='Z')&&(ch>='A'))){fseek(fpin,-1L,SEEK_CUR);
out<<"<"<<" \t5"<<"\t 界限符"<')out<<"<>"<<" \t4"<<"\t运算符"<':{ch=fgetc(fpin);
if(ch=='=')out<<">="<<" \t4"<<"\t 运算符"<')out<<">>"<<" \t7"<<"\t控制符"<"<<" \t5"<<"\t 界限符"<')out<<"<>"<<" \t4"<<"\t运算符"<"<<" \t4"<<"\t运算符"<>x;cout<>x;
cout.width(20);
cout<>x;
cout.width(20);
cout<>in_fn;
if((fpin=fopen(in_fn,"r"))!=NULL)break;
else cout<<"源文件名错误,请再次输入:";
}
cout<<"\n****************词法分析如下********************"<
总结
初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf
:
这个程序主要参考书上关于词法分析器的设计。在设计过程中仍有遇到很多困难,但经请教同学后,好多问题都并不是想象中的困难。尽管如此,分析考虑还不全面,例如没有创建符号表和常数表。这些情况将在在语法和语义分析时进行完善。