? C语言词法分析器的设计与实现
?
C语言词法分析器的设计与实现
一.实验目的
1 .加强对系统软件综合工程实现能力、规划能力的培训;
2 .加强对词法分析原理、方法和基本实现技术的理解;
2 .实验内容
完成c语言(或c )作为宿主语言:
? 其中的具体要求:
1 .使用DFA实现词法分析器的设计
2 .实现c源程序中注释的过滤
3 .利用半环缓冲器从文件中一个接一个地读取单词;
4 .词法分析结果的属性字流存储在独立的文件中;
5 .统计源程序各行的单词数和整个源文件的单词数;
6 .具有报告词法错误和错误位置(源程序行号及其行文字)的功能;
7 .将属性字流输出到屏幕,每次显示10行,按ESC键可中途退出。 每行都有统计信息,最后是词法分析的所有信息。 也包括各属性单词的个数。
3 .实验检验和评分要求
? 1 .编写C语言词法分析器源程序并通过调试
2 .根据测试程序进行验收(测试程序名称: Test-Lexcial );
? 3 .提交简明扼要的书面实验报告。 内容为FA设计; 源程序的主要函数功能; 主要数据结构设计。
四.检验测试案例
1 .测试用例1 :统一检验测试用例
#包含
#包含
char buf[100],str[15];
int countdef=0;
FILE *fpmiddle;
结构定义
{
char with[30];
char des[30];
char filename[15];
}def[30];
char* getFileName () )
{
int i=0,k=0;
for(I=0; buf[i]!='
I;
wile(buf[I]!=''i30buf[i]!=' ' )
str[k ]=buf[i ];
str[k]=' ';
puts(str;
return str;
}
长读(file * FPT )。
{
if(fgets(buf,100,fpt )==NULL ) ) )。
{
puts(buf;
打印(readlineerrorreachfileend )! n ';
返回0;
}
puts(buf;
return(long ) strlen (buf ) 1;
}
void writeline () )
{
frintf(FPmiddle,' %s ',buf );
}
voidprocessdefine (char * filename ) )。
{
int i=8,j=0;
while (def [ count def ].des [ I-8 ]=buf [ I ]!=' ' ) I;
def[countdef].des[i-8]=' ';
while (def [ count def ].with [ j ]=buf [ I ]!=' ' )
{
I;
j;
}
def[countdef].with[j-1]=' ';
strcpy(def[countdef].filename,filename;
countdef;
}
长注释(文件* FPT ) )。
{
char prechar=buf[0],ch='* ';
int i=0,j=0;
for(I=0; buf[i]!=' '! (buf[i]=='/'buf[i 1]=='* ' ); I;
j=i;
buf[i]=' ';
if(I==strlen(buf ) ) return 0L;
do
{
prechar=ch;
if () ch=fgetc(FPT ) )==EOF ) ) ) )。
{
打印(in comment,end );
退出(0;
}
I;
}while (! (prechar=='*'ch=='/' );
return(long ) ) i-j 1;
}
是isin(char*p )
{
int i=0,j=0,temp=0;
wile (时间!=strlen(buf ) )
{
wile(buf[I]!=' 'buf[i]!=p[0] )
I;
temp=i;
while(buf[I]==p[j]p[j]!=' 'buf[i]!=' ' )
{
I;
j;
}
if(I-temp )==strlen(p ) )返回temp;
i=te