词法分析器语法分析器实验报告编译原理超实用文档格式.docx
- 文档编号:14948622
- 上传时间:2022-10-26
- 格式:DOCX
- 页数:43
- 大小:127.30KB
词法分析器语法分析器实验报告编译原理超实用文档格式.docx
《词法分析器语法分析器实验报告编译原理超实用文档格式.docx》由会员分享,可在线阅读,更多相关《词法分析器语法分析器实验报告编译原理超实用文档格式.docx(43页珍藏版)》请在冰豆网上搜索。
STOP
END
标识符
常数(整)
=
+
*
**
,
(
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$DIM
$IF
$DO
$STOP
$END
$ID
$INT
$ASSIGN
$PLUS
$STAR
$POWER
$COMMA
$LPAR
$RPAR
-
内部字符串
标准二进形式
对于这个小语言,有几点重要的限制:
首先,所有的关键字(如IF﹑WHILE等)都是“保留字”。
所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符。
例如,下面的写法是绝对禁止的:
IF(5)=x
其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。
也就是说,对于关键字不专设对应的转换图。
但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。
当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字。
再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。
例如,一个条件语句应写为
IFi>
0i=1;
而绝对不要写成
IFi>
0i=1;
因为对于后者,我们的分析器将无条件地将IFI看成一个标识符。
这个小语言的单词符号的状态转换图,如下图:
2.语法分析器能识别由加+减-乘*除/乘方^括号()操作数所组成的算术表达式,其文法如下:
E→E+T|E-T|T
T→T*F|T/F|F
F→P^F|P
p→(E)|i
使用的算法可以是:
预测分析法;
递归下降分析法;
算符优先分析法;
LR分析法等。
3.中间代码生成器产生上述算术表达式的中间代码(四元式序列)
三、实现过程说明
给出各题目的详细算法描述,数据结构和函数说明,流程图。
1、词法分析器的流程图
2、语法分析器主程序图
3、中间代码生成器流程图:
四、源程序清单
词法分析器
#include"
stdafx.h"
Word.h"
//构造函数,对数据成员初始化,并将关键字以及运算符读入
Word:
:
Word()
{//打开关键字文件
fstreamkeywordfile("
keyword.txt"
);
if(!
keywordfile)
{
cout<
"
error!
can'
topenkeywordfile!
endl;
system("
pause"
exit
(1);
}
//设置临时变量将关键字、符号文件中的内容存储
stringtempword;
inttempencode;
stringtempre;
inttempvalue;
//开始读关键字文件
while(!
(keywordfile.eof()))
{keywordfile>
tempword>
tempencode>
tempre>
tempvalue;
keywordlist.push_back(tempword);
keywordencode.push_back(tempencode);
keywordre.push_back(tempre);
keywordcodevalue.push_back(tempvalue);
//关闭关键字文件
keywordfile.close();
for(inti=0;
i<
keywordlist.size();
i++)
{cout<
setw(16)<
keywordlist[i]<
keywordencode[i]<
setw(12)<
keywordre[i]<
keywordcodevalue[i]<
fstreamsignwordfile("
signword.txt"
signwordfile)
{cout<
topensignwordfile!
//开始读符号文件
(signwordfile.eof()))
signwordfile>
signlist.push_back(tempword);
signencode.push_back(tempencode);
signre.push_back(tempre);
signcodevalue.push_back(tempvalue);
}
//关闭符号文件
signwordfile.close();
signlist.size();
signlist[i]<
signencode[i]<
signre[i]<
signcodevalue[i]<
}
//将token中的字符串与character中的字符连接作为token中新的字符串
voidWord:
concatentation()
{for(inti=0;
100;
{if(token[i]==NULL)
{token[i]=s;
break;
//判断character中的字符是否为字母和数字的布尔函数,是则返回true,否则返回false
boolWord:
letter()
{if(s<
='
z'
&
&
s>
a'
)
returntrue;
elseif(s<
Z'
A'
else
returnfalse;
digit()
9'
0'
returnfalse;
//按token数组中的字符串中的前五项(即判别其是否为保留字),若是保留字则返回它的编码
intWord:
reserve()
{
intleng;
//记录token数组中单词的长度
i++)//计算token数组中单词的长度
if(token[i]==NULL)
{
leng=i;
}
for(intj=0;
j<
keywordlist[i].length();
j++)
if(keywordlist[i][j]!
=token[j])//若某个字符不等则终止此次循环
break;
if(j+1==keywordlist[i].length())//若比较字符全部相等,则判断两者是否长度相等
{
if(leng==keywordlist[i].length())
{returni+1;
else
return0;
}
return0;
//将标识符登录到符号表中或将常数登录到常数表中
buildlist()
{//设置临时变量将标识符的助记符保存
//标识符助记
inttempconstre;
//常数助记
s=token[0];
if(letter())//第一个字符如果为字母,则将标识符登录到符号表中
{fstreamchartostring("
convert.txt"
if(!
chartostring)
cout<
Error!
Can'
topenconvertfile"
system("
for(inti=0;
if(token[i]==NULL)
else
{chartostring<
token[i];
chartostring<
chartostring.close();
chartostring.open("
chartostring>
tempre;
indentityre.push_back(tempre);
tempword="
标识符"
;
tempencode=6;
tempvalue=indentityre.size();
indentitylist.push_back(tempword);
indentityencode.push_back(tempencode);
indentitycodevalue.push_back(tempvalue);
fstreamindentityfile("
indentityword.txt"
indentityfile)
{cout<
topenindentitywordfile"
//先将文件指针移到最后去,再写入一个endl
indentityfile.seekg(0,ios:
end);
indentityfile<
tempword<
setw(8)<
tempencode<
tempre<
indentityfile<
indentityfile.close();
else//token中存储的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 词法 分析器 语法 实验 报告 编译 原理 实用