编译原理课程实验报告
题 目: 词法分析器实验
专 业: 计算机科学技术
班 级: 1班
学 号: * * * *****
姓 名: * * *
实验目
通实验编程实践学生解词法分析务掌握词法分析程序设计原理构造方法学生编译基概念原理方法完整清楚理解正确熟练运
二实验容求
VC++VBJAVA语言实现C语言子集源程序进行词法分析通输入源程序左右字符串进行扫描分解次输出单词部编码单词符号身值遇错误显示Error然跳错误部分继续显示 时进行标识符登记符号表理
实现词法分析设计工作:
(1)源程序文件中读入字符
(2)统计行数列数错误单词定位
(3)删空格类字符包括回车制表符空格
(4)拼写单词(码属性)二元式表示(属性值——token机表示)
(5)果发现错误报告出错
(6)根需否填写标识符表供阶段
单词基分类:
u 关键字:程序语言定义具固定意义标识符称保留字例 if forwhileprintf 单词种码1
u 标识符:表示种名字变量名数组名函数名
u 常数: 数值常数 125 10531416
u 运算符:+*
u 关系运算符: << >><>
u 分界符: ()[]
三实验程序设计说明
1.实验方案设计
1程序设计考虑:
u 程序说明部分种表格变量安排空间
具体实现时类单词设计成结构长度均相形式较短关键字面补空
k数组关键字表数组元素存放关键字(事先构造关键字表)
s 数组存放分界符表(事先构造分界符表)简单起见分界符算术运算符关系运算符放s表中(编程时应建立算术运算符表关系运算符表类号)合成类
id ci 数组分存放标识符常数
instring 数组输入源程序单词缓存
outtoken 记录输出部表示缓存
造表填表设置变量
u 程序开始先工方式输入关键字造k表输入分界符等造 p 表
u 程序工作部分设计成便调试循环结构循环处理单词接收键盘送单词调词法分析程输出单词部码
例单词设计成形式 (typepointer)
中type指明单词种类例:Pointer指单词存放处开始位置
造表填表设置变量
u 程序开始先工方式输入关键字造k表输入分界符等造 p 表
u 程序工作部分设计成便调试循环结构循环处理单词接收键盘送单词调词法分析程输出单词部码
例单词设计成形式 (typepointer)
中type指明单词种类例:Pointer指单词存放处开始位置
词法分析设计流程图
2词法分析程考虑
u 根输入单词第字符(时需读第二字符)
判断单词类产生类号:字符k表示关键字id表示标识符
ci表示常数s 表示分界符
u 标识符常数需分标识符表常数表中已登记元素相较表中已该元素记录表中位置未出现标识符序填入数组 id 中常数变二进制形式存入数组中 ci 中记录表中位置
lexical 程中嵌两程:名 getchar功 instring 中序取出字符指针 pint 加 1 名 error出现错误时调程输出错误编号
u 求:识出单词两字节等长表示称部码第字节 t 第二字节 i t 单词种类关键字 t1分界符 t2算术运算符 t3关系运算符 t4符号数 t5标识符 t6i 该单词表中指针部码值表 1 关键字表表 2 分界符表表 3 算术运算符 i 值表 4 关系运算符 i 值
取字符统计字符行列位置子程序
2.程序源代码
#include
#include
#include
#include
using namespace std
#define MAX 50
char ch ' '
string keyword[50]{boolbreakcaseincludecharconst
continue default dodoubleelsefalse
floatforifintlong namespacenewreturn
shortsignedstructswitchtrueusingvoidwhile then }
int gjz(string c){
int i
for(i0i
}
return 0
}
int zm(char c) {
if(((c<'z')&&(c>'a'))||((c<'Z')&&(c>'A'))) return 1
else return 0
}
int num(char c){
if(c>'0'&&c<'9') return 1
else return 0
}
void caculate(FILE *fpin){
ofstream out(mytesttxtiosout)
string arr
while((chfgetc(fpin))EOF) {
arr
if(ch' '||ch'\t'||ch'\n'){}
else if(zm(ch)){
while(zm(ch)||num(ch)) {
arrarr+ch
chfgetc(fpin)
}
fseek(fpin1LSEEK_CUR)
if (gjz(arr)){out<
else if(num(ch)){
while(num(ch)||ch''&&num(fgetc(fpin))||fgetc(fpin)'e'||ch'e')
{
if(ch'') fseek(fpin1LSEEK_CUR)
arrarr+ch
if(ch'e')
{
chfgetc(fpin)
if( ch'+') arr+'+'
else {arr+'' fseek(fpin1LSEEK_CUR)}
}
chfgetc(fpin)
}
fseek(fpin3LSEEK_CUR)
out<
else switch(ch){
case'+'
case''
case'*'
case''
case'' out<
case')'
case'['
case']'
case''
case'#'
case''
case''
case'{'
case'}' out<
case ''{
string string1
do
{
string1+ch
chfgetc(fpin)
} while (ch'')
string1+ch
out<
case'' {chfgetc(fpin)
if(ch'') out<<<< \t4<<\t运算符<
else {out<<<< \t4<<\t运算符<
fseek(fpin1LSEEK_CUR)}
}break
case'<' {chfgetc(fpin)
if(ch'')out<<<<< \t4<<\t运算符<
out<<<<< \t5<<\t界限符<
}break
case'>' {chfgetc(fpin)
if(ch'') out<<><< \t4<<\t运算符<
out<<><< \t5<<\t界限符<
}break
default out<
}
}
void read(){
ifstream in(mytesttxtiosout)
string x
while(in)
{in>>xcout<
void main(){
char in_fn[30]
FILE * fpin
cout<<请输入源文件名(包括路径缀名)
for(){
cin>>in_fn
if((fpinfopen(in_fnr))NULL) break
else cout<<文件路径错误请输入源文件名(包括路径缀名)
}
cout<<\n********************词法分析工作*********************<
fclose(fpin)
cout<
cout<<\n********************参目录mytesttxt*********************<
}
3.程序执行结果
图 1 程序输入文件容
图 2 输出结果
4.实验程序优点特色
程序特色: 出错处理力强非法字符输入会报错:31fd 字符串定错误输出警告*出现时必*收尾时*全部错误处理警告
四实验中出现问题解决方法
*注释符*发生死循环检查修改错误*连续*12*3456*时出现面3处次读取判断情况修改改正
五体会意见建议
C语言学学难时解词法分析程序设计方法编译程序编译时第步做容方法
华dong交理工学院
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档