C语言词法分析器设计与实现

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

> C语言词法分析器设计与实现
C语言词法分析器的设计与实现
一.实验目的
1.强化对系统软件综合工程实现能力、规划能力的训练;
2.加强对词法分析原理、方法和基本实现技术的理解;
二.实验内容
用C语言(或 C++ )作为宿主语言完成:
其中具体要求:
1.使用DFA实现词法分析器的设计;
2.实现对C源程序中注释的过滤;
3.利用两对半缓冲区从文件中逐一读取单词;
4.词法分析结果属性字流存放在独立文件中;
5.统计源程序每行单词的个数和整个源文件单词个数;
6.具有报告词法错误和出错位置(源程序行号和该行字符)的功能;
7.屏幕输出属性字流,每次显示10行,按ESC可中途退出,每行有统计信息,最后有词法分析的全
部信息,包括各种属性单词的个数。

三.实验验收与评分要求
1.编写C语言词法分析器的源程序并调试通过;
2.通过测试程序的验收 (测试程序名称:Test-Lexcial);
3.提交简明扼要的书面实验报告。

内容包括:FA设计;源程序主要函数功能;主要数据结构设计。

四. 验收测试用例
1. 测试用例一:统一验收测试用例;
#include<stdio.h>
#include<string.h>
char buf[100],str[15];
int countdef=0;
FILE *fpmiddle;
struct define
{
char with[30];
char des[30];
char filename[15];
}def[30];
char* getFileName()
{
int i=0,k=0;
for(i=0;buf[i]!='<'&&i<30&&buf[i]!='\0';i++);
i++;
while(buf[i]!='>'&&i<30&&buf[i]!='\0')
str[k++]=buf[i++];
str[k]='\0';
puts(str);
return str;
}
long readline(FILE *fpt)
{
if(fgets(buf,100,fpt)==NULL)
{
puts(buf);
printf("readline error or reach file end!\n");
return 0;
}
puts(buf);
return (long)(strlen(buf)+1);
}
void writeline()
{
fprintf(fpmiddle,"%s",buf);
}
void processDefine(char *filename)
{
int i=8,j=0;
while((def[countdef].des[i-8]=buf[i])!=' ') i++;
def[countdef].des[i-8]='\0';
while((def[countdef].with[j]=buf[i])!='\0')
{
i++;
j++;
}
def[countdef].with[j-1]='\0';
strcpy(def[countdef].filename,filename);
countdef++;
}
long comment(FILE *fpt)
{
char prechar=buf[0],ch='*';
int i=0,j=0;
for(i=0;buf[i]!='\0'&&!(buf[i]=='/'&&buf[i+1]=='*');i++) ;
j=i;
buf[i]='\0';
if(i==strlen(buf)) return 0L;
do
{
prechar=ch;
if((ch=fgetc(fpt))==EOF)
{
printf(" in comment, end");
exit(0);
}
i++;
}while(!(prechar=='*'&&ch=='/'));
return (long)(i-j+1);
}
isin(char *p)
{
int i=0,j=0,temp=0;
while(temp!=strlen(buf))
{
while(buf[i]!='\0'&&buf[i]!=p[0])
i++;
temp=i;
while(buf[i]==p[j]&&p[j]!='\0'&&buf[i]!='\0')
{
i++;
j++;
}
if((i-temp)==strlen(p)) return temp;
i=temp+1;
j=0;
}
return -1;
}
void includeAndDefine(FILE *fpt)
{
void add(char*);
void replace(char*);
while(readline(fpt))
{
if(isin("#include")>=0)
add(getFileName());
else if(isin("#define")>=0)
processDefine(str);
else
{
fseek(fpt,comment(fpt),1);
replace(str);
writeline();
}
}
}
void add(char *filename)
{
void replace(char*);
FILE *fpp;
if((fpp=fopen(filename,"r"))==NULL)
{
printf("file %s not found or open error!",filename);
exit(0);
}
fseek(fpp,-readline(fpp),1);
if(isin("#include")<0&&isin("#define")<0)
while(readline(fpp))
{
fseek(fpp,comment(fpp),1);
replace(filename);
writeline();
}
else
includeAndDefine(fpp);
fclose(fpp);
}
void replace(char *filename)
{
int i=0,start=0;
for(i=0;i<countdef;i++)
if(!strcmp(def[i].filename,filename))
break;
if(i>=countdef||(start=isin(def[i].des))==-1) return;
else
{
int lenOfWith=strlen(def[i].with);
int lenOfDes=strlen(def[i].des);
if(lenOfDes>=lenOfWith)
{
int k,j;
for(k=start; k<start+lenOfWith; k++)
buf[k]=def[i].with[k-start];
for(j=(start+lenOfWith); j<start+lenOfDes; j++) buf[j]=' ';
}
else
{
int offset=lenOfWith-lenOfDes;
int k,j;
for(k=offset+strlen(buf);k>start;k--)
buf[k]=buf[k-offset];
for(j=start;j<start+lenOfWith;j++)
buf[j]=def[i].with[j-start];
}
}
}
2. 自己编写的C语言词法分析器源码。

> Java语言语法语义分析器设计与实现
Java语言子集语法、语义分析器
一.实验目的
1.强化对系统软件综合工程实现能力、规划能力的训练;
2.增强对语法分析器、语义分析及代码生成器基本实现技术的理解;
二.实验内容
用C语言(或 C++ )作为宿主语言完成:
三.实验要求与试验验收
1. 完成对附录一中文法描述的Java源代码的语法分析、语义分析及代码生成。

代码生成的目标代码为MASM汇编代码;
2. 词法分析使用实验一完成的词法分析器(即与词法分析器有直接接口);
3. 课程考试前通过网络教室提交(包括源码和可执行文件的压缩文件),压缩文件命名:
“学号-姓名-语法语义”
4. 通过测试用例的验收;
附录一 Java语言子集文法
<Sw> -> while(Er)S;
<Er> -> Vc < Vc | Vc > Vc
<S> ->标识符= Ex; // 标识符使用词法分析识别结果
<Vc> ->标识符 | 整常数 // 标识符、整场数使用词法分析识别结果
<Ex> -> Vc P Ex | Vc
<P> -> +| -|*|/ // 运算符必须符合优先级和结合性
> Java语言词法分析器设计与实现
Java语言词法分析器的设计与实现
一.实验目的
1.强化对系统软件综合工程实现能力、规划能力的训练;
2.加强对词法分析原理、方法和基本实现技术的理解;
二.实验内容
用C语言(或 C++ )作为宿主语言完成:
其中具体要求:
1.使用DFA实现词法分析器的设计;
2.实现对Java源程序中注释的过滤;
3.利用两对半缓冲区从文件中逐一读取单词;
4.词法分析结果属性字流存放在独立文件(文件名:scanner_output)中;
5.统计源程序每行单词的个数和整个源文件单词个数;
6.具有报告词法错误和出错位置(源程序行号和该行字符)的功
注:附Java语言词法规则 (附件一);
附Java语言词法分析器的属性字设计 (附件二)
三.实验验收与评分要求
1.编写Java语言词法分析器的源程序并调试通过;
2.通过测试程序的验收 (测试程序名称:Test-Lexcial);
3.提交简明扼要的书面实验报告。

内容包括:FA设计;源程序主要函数功能;主要数据结构设计。

附件一
JAVA语言词法规则
关键字:
abstract boolean break byte case catch char
class
const continue default do double else extends false
final finally float for goto if implements
import
instanceof int interface long native new null package
private protected public return short static
super switch
synchronized this throw throws transient true try void
volatile while
标识符:
字母或美元符号“$”或下划线开头,连接字母或美元符号“$”或下划线或数字字符的串。

常量:
整型常量: 123, 0, -456, 0123 , 0x123, -0X12,123L
实型常量: 1.23, 0.123, .123, 123., 123.0, 123e3, 123E3, 12.3F 布尔常量: true、 false
字符串常量:"This is a constant string."。

字符常量:‘ a’ ,
转义字符描述
\ddd 1到3位8进制数据所表示的字符(ddd)
\uxxxx 1到4位16进制数所表示的字符(xxxx)
\' 单引号字符
\\ 反斜杠字符
\r 回车
\n 换行
\f 走纸换页
\t 横向跳格
\b 退格
界限符:
运算符:
附件二
JAVA词法分析器的属性字设计单词属性用十六进制表示:
错误的单词 0x100
注释0x101
空格0x102
关键字0x103
标识符0x104
布尔型0x105
字符型0x106
整型0x107
浮点型0x108
字符串0x109
= += -= *= /= %= &=
^= |= >>= <<= >>>= 0x110
: 0x111
|| 0x112
&& 0x113
| 0x114
^ 0x115
& 0x116
== != 0x117
< > <= >= 0x118
<< >> >>> 0x119
+ - 0x11a
* / % 0x11b
++ --– ! ~ 0x11c
[ ] ( ) . 0x11d , 0x120
{} 0x121 ; 0x122。

相关文档
最新文档