编译原理词法分析报告器语法分析报告课程设计Word文档下载推荐.docx
- 文档编号:19369707
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:38
- 大小:456.24KB
编译原理词法分析报告器语法分析报告课程设计Word文档下载推荐.docx
《编译原理词法分析报告器语法分析报告课程设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《编译原理词法分析报告器语法分析报告课程设计Word文档下载推荐.docx(38页珍藏版)》请在冰豆网上搜索。
(2)常数:
各种类型的常数。
(3)保留字(关键字):
如if、else、while、int、float等。
(4)运算符:
如+、-、*、<
、>
、=等。
(5)界符:
如逗号、分号、括号等。
5.3.将所有合法的单词符号转化为便于计算机处理的二元组形式:
(单词分类号,单词自身值);
以图形化界面显示出来。
5.4.可选择性地将结果保存到文件中。
六、概要设计
6.1.数据类型
6.1.1.单词的分类:
本词法分析器演示的是C语言的一个子集,故字符集如下:
(1)标识符:
以字母开头的字母数字串。
(2)整数或浮点型
(3)保留字:
auto,break,case,char,const,continue,default,do,double,else,enum,extern,float,for,goto,if,int,long,register,return,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile,while
(4)运算符:
+、-、*、/、%、>
、<
、=、!
=、==、<
=、>
=、++、--、!
、&
&
、||;
[]{}():
;
‘“#,
6.1.2.单词二元组:
(单词分类号,单词自身值)
表6.1单词分类表
单词
分类号
标识符
1
常数
2
保留字
3
界符
4
运算符
5
6.2.词法分析器的结构
图6.1词法分析器的结构
6.3.部分单词的正规式与状态转换图
图6.2部分单词的状态转换图
6.4.功能模块
表6.2词法分析器的C#程序过程或函数功能表
过程或函数名
简要功能说明
GetTokens()
分析源程序得到单个单词并大致区分其类型,并生成二元组
GetInput(stringget)
输入源程序
NoWs(stringaCopy,intcp)
去除源程序中的空格符
GetTokenType
最终确定标识符和保留字
OutPut
输出二元组到指定的.txt文件中
GetResult
输出二元组
七、详细设计
7.1.总体流程图
图7.1程序总体流程图
7.2.主要分支选择算法介绍
7.2.1case0情况算法
图7.2部分分支流程图
八、编程调试
8.1主要源代码
//逻辑操作类与函数
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.IO;
namespaceTokenAnalysis{
structTokenNode{
publicstringtype;
publicstringtoken;
}
classTokenAnalysis{
intcPosition=0;
intlPosition=0;
intignorWs=0;
intrecordWs=1;
FileInfooutput;
stringsource;
string[]kwList={"
auto"
"
break"
case"
char"
const"
continue"
default"
do"
double"
else"
"
enum"
extern"
float"
for"
goto"
if"
int"
long"
register"
return"
short"
signed"
sizeof"
static"
struct"
switch"
typedef"
union"
unsigned"
void"
volatile"
while"
printf"
scanf"
end"
main"
};
intError=-2;
intNormal=-1;
intstatue=-1;
boolisComment=false;
List<
TokenNode>
resultTokenNodes=newList<
();
publicList<
GetTokens(){
TokenNodenode2Add=newTokenNode();
intcp=0;
//currentposition
intlp=0;
//lastposition
stringaCopy=source;
intlength=aCopy.Length;
aCopy=aCopy.Trim();
while(cp<
aCopy.Length){
//IDorKeyWords
node2Add=this.GetToken(ignorWs,aCopy,refcp,reflp);
if(node2Add.type=="
cmtLeft"
){
isComment=true;
cmtRight"
isComment=false;
if(!
isComment&
node2Add.type!
="
resultTokenNodes.Add(node2Add);
returnresultTokenNodes;
publicTokenNodeGetToken(){
if(cPosition<
source.Length){
TokenNodetoken=this.GetToken(ignorWs,source,refcPosition,reflPosition);
returntoken;
else{
TokenNodetoken=newTokenNode();
token.token="
Error"
;
privateTokenNodeGetToken(inttype,stringaCopy,refintcp,refintlp){
stringtempToken;
stringtempType;
if(type==ignorWs){
if(Char.IsLetter(aCopy[cp])){
cp++;
aCopy.Length&
(Char.IsLetterOrDigit(aCopy[cp])||
aCopy[cp]=='
_'
)){
tempToken=aCopy.Substring(lp,cp-lp);
tempType="
1or3"
tempType=GetTokenType(tempToken,tempType);
token.token=tempToken;
token.type=tempType;
lp=cp=NoWs(aCopy,cp);
//Num
elseif(Char.IsDigit(aCopy[cp])){
((Char.IsDigit(aCopy[cp]))||(aCopy[cp]=='
.'
&
Char.IsDigit(aCopy[cp+1])))){
2"
//Border
elseif(aCopy[cp]=='
('
||aCopy[cp]=='
)'
{'
||
}'
['
]'
'
'
"
\'
\\'
4"
//Operationandother
if(cp<
switch(aCopy[cp-1]){
case'
+'
:
cp=NoWs(aCopy,cp);
if(aCopy[cp]=='
='
break;
-'
>
*'
/'
<
!
statue=Error;
|'
default:
tempToken=tempToken.Replace("
"
);
5"
publicvoidGetInput(stringget){
//source="
for(inti=0;
i<
array->
length;
i++)/*cmt*/"
source=get;
privateintNoWs(stringaCopy,intcp){
while(Char.IsWhiteSpace(aCopy[cp])){
returncp;
privatestringGetTokenType(stringtk2anls,stringiniType){
if(iniType=="
foreach(stringkwinkwList){
if(tk2anls==kw){
return"
3"
1"
if(tk2anls=="
/*"
*/"
returniniType;
UnknownTpye"
publicvoidOutPut(stringfileName){
FileInfooutFile=newFileInfo(fileName);
StreamWriterfw=outFile.AppendText();
foreach(TokenNodetkNodeinresultTokenNodes){
stringshow=string.Format("
{0,-25}{1,-40}"
tkNode.token,tkNode.type);
System.Console.WriteLine(show);
fw.WriteLine(show);
fw.Close();
publicvoidOutPut(){
FileInfooutFile=newFileInfo("
result.txt"
string>
GetResult(){
res=newList<
res.Add(show);
returnres;
}
//前台控制类与函数
namespaceTokenAnalysis_FormApp
{
publicpartialclassForm1:
Form
{
publicForm1()
InitializeComponent();
privatevoidbtnAnalysis_Click(objectsender,EventArgse)
TokenAnalysis.TokenAnalysista=newTokenAnalysis.TokenAnalysis();
ta.GetInput(rtxtInput.Text);
ta.GetTokens();
string>
res=ta.GetResult();
lstResult.Items.Clear();
lstResult.Items.AddRange(res.ToArray());
privatevoidbtnExit_Click(objectsender,EventArgse)
Application.Exit();
privatevoid保存SToolStripButton_Click(objectsender,EventArgse)
saveFileDialog1.Title="
保存分析结果"
saveFileDialog1.Filter="
文本文件|*.txt"
if((saveFileDialog1.ShowDialog())==DialogResult.OK){
if(saveFileDialog1.FileName!
=null){
FileInfooutFile=newFileInfo(saveFileDialog1.FileName);
foreach(stringtkStringinlstResult.Items){
fw.WriteLine(tkString);
privatevoidbtnsave_Click(objectsender,EventArgse)
if((saveFileDialog1.ShowDialog())==DialogResult.OK)
if(saveFileDialog1.FileName!
=null)
FileInfooutFile=newFileInfo(saveFileDialog1.FileName);
foreach(stringtkStringinlstResult.Items)
fw.WriteLine(tkString);
8.2调试
调试过程中存在保存不了输出结果的问题。
最后调试发现是由于绝对路径与相对路径的区分。
最后上网搜索解决方法,通过调用C#中提供的文件保存接口来解决保存的问题
九、测试
1.运行的主界面
图9.1运行的主界面
2.输入想要分析的c语言源程序
图9.2输入源程序
3.点击分析的按钮,显示分析后的结果,以二元组形式展示。
图9.3分析结果
4.点击保存按钮,弹出选择保存文件的路径和名称
图9.4保存过程
5.保存后的.txt文档
图9.5保存后的文档
十、结束语
通过这次的课程设计,我学会了很多。
让我学会了如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;
熟悉了构造词法分析器的手工方式的相关原理,也对状态图以及如何表示并识别单词规则有了更进一步的了解。
并且在掌握状态图对识别程序的编程上有了更深层次的进步。
除此之外,还复习了高级语言单词的分类,总之,通过这次的实验,从各方面提高了我的编程能力以及解决问题和bug的能力。
但此次的课程设计还存在一定的缺陷,如只实现了c语言子集的词法分析器以及,对于错误的单词无法识别出其错误原因。
因此,我在今后的学习中还需要再接再厉,争取编出更完美的程序。
课程设计二赋值语句的解释程序设计
手工设计c语言的赋值语句解释程序(可以是c语言的子集)
2.1.要求
用算符优先分析方法设计一个分析程序,对输入的赋值语句,输出语句,清除语句进行词法分析、语法分析、表达求值并存储于指定变量中;
若存在错误,提示错误相关信息。
2.2.给定文法
S->
V=E|
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 词法 分析 报告 语法分析 课程设计