编译原理词法分析报告(C++)
我做编译原理写的,希望对你有帮助。
词法分析实验报告
一、实验目的
1. 掌握词法分析的原理。
2. 熟悉保留字表等相关的数据结构与单词的分类方法。
3. 掌握词法分析器的设计与调试。
二、实验内容
根据编译中的分词原理,用C++语言编写一个C语言的词法分析程序:.
三、实验要求
1. 输入:任意一个C语言程序的源代码。
2. 处理:对输入进行分析,分离出保留字、标识符、常量、算符和界符。
3. 输出:对应的二元式
四、实验环境
Windows XP Professional SP3,Visual Studio 2010
五、关键代码
// Scanner.cpp
#include "stdafx.h"
#include "CuteC.h"
#include "Scanner.h"
#include "CuteCView.h"
int CScanner::m_constListIndex=0;
int CScanner::g_place=0;
// CScanner
IMPLEMENT_DYNAMIC(CScanner, CWnd)
CScanner::CScanner()
{
}
CScanner::CScanner(CString str)
{
//初始化保留字
reservedWords[0].str=L"void";
reservedWords[0].tok=tokentype::_VOID;
reservedWords[1].str=L"char";
reservedWords[1].tok=tokentype::CHAR;
reservedWords[2].str=L"const";
reservedWords[2].tok=tokentype::_CONST;
reservedWords[3].str=L"double";
我做编译原理写的,希望对你有帮助。
reservedWords[3].tok=tokentype::DOUBLE;
reservedWords[4].str=L"else";
reservedWords[4].tok=tokentype::ELSE;
reservedWords[5].str=L"float";
reservedWords[5].tok=tokentype::FLOAT;
reservedWords[6].str=L"for";
reservedWords[6].tok=tokentype::FOR;
reservedWords[7].str=L"if";
reservedWords[7].tok=tokentype::IF;
reservedWords[8].str=L"int";
reservedWords[8].tok=tokentype::INT;
reservedWords[9].str=L"main";
reservedWords[9].tok=tokentype::MAIN;
reservedWords[10].str=L"scanf";
reservedWords[10].tok=tokentype::SCANF;
reservedWords[11].str=L"printf";
reservedWords[11].tok=tokentype::PRINTF;
reservedWords[12].str=L"while";
reservedWords[12].tok=tokentype::WHILE;
m_error=FALSE;
m_strText=str;
m_nLength=m_strText.GetLength();
m_cChar=m_strText.GetBuffer(m_nLength);//数组化字符串
m_nCount=0;
m_row=1;
m_col=0;
}
CScanner::~CScanner()
{
}
BEGIN_MESSAGE_MAP(CScanner, CWnd)
END_MESSAGE_MAP()
// 检查标识符是不是保留字,是就返回保留字类型
CScanner::tokentype CScanner::reservedlookup(CString str)
{
for(int i=0;i<13;i++)
{
if(str==reservedWords[i].str)
return reservedWords[i].tok;
}
return tokentype::ID;
}
// 取下一个字符
我做编译原理写的,希望对你有帮助。
wchar_t CScanner::getnextchar(void)
{
if(m_nCount>=m_nLength)
{
m_nCount++;
return ' ';
}
return m_cChar[m_nCount++];
}
// 获取标识符
CString CScanner::getidentifier(void)
{
CString strTemp;//保存单词变量
m_ch=m_cChar[m_nCount-1];//获取当前字符
strTemp+=m_ch;
m_ch=getnextchar();
m_col++;
while(!(m_ch=='\n' || m_ch==32/*空格*/ || m_ch=='\t' || m_ch=='+'
|| m_ch=='-'|| m_ch=='*'|| m_ch=='/'|| m_ch=='%'|| m_ch=='('
|| m_ch==')'|| m_ch=='='|| m_ch==','|| m_ch==';'|| m_ch=='&'
|| m_ch=='|'|| m_ch=='!'|| m_ch=='^'|| m_ch=='~'|| m_ch=='['
|| m_ch==']'|| m_ch=='{'|| m_ch=='}'|| m_ch=='?'|| m_ch==':'
|| m_ch=='>'|| m_ch=='<'|| m_ch=='\r'))
{
if(m_ch=='\n')
{
m_row++;
}
strTemp+=m_ch;
m_ch=getnextchar();
m_col++;
if(m_ch=='\t')
{
m_col+=3;
}
}
return strTemp;
}
// 获取字符串
CString CScanner::getChar(void)
{
CString strTemp;//保存字符串变量
m_ch=m_cChar[m_nCount-1];//获取当前字符
我做编译原理写的,希望对你有帮助。
if(m_nCount==m_nLength)
{
return strTemp;
}
m_ch=getnextchar();
m_col++;
while(m_ch!='\'')
{
strTemp+=m_ch;
if(m_ch=='\n')
{
return strTemp;
}
if(m_nCount==m_nLength)
{
return strTemp;
}
m_ch=getnextchar();
m_col++;
}
return strTemp;
}
// 获取数字串
CString CScanner::getNumber(void)
{
CString strTemp;//保存数字串
m_ch=m_cChar[m_nCount-1];//获取当前字符
strTemp+=m_ch;
m_ch=getnextchar();
m_col++;
while(!(m_ch=='\n' || m_ch==32/*空格*/ || m_ch=='\t' || m_ch=='+'
|| m_ch=='-'|| m_ch=='*'|| m_ch=='/'|| m_ch=='%'|| m_ch=='('
|| m_ch==')'|| m_ch=='='|| m_ch==','|| m_ch==';'|| m_ch=='&'
|| m_ch=='|'|| m_ch=='!'|| m_ch=='^'|| m_ch=='~'|| m_ch=='['
|| m_ch==']'|| m_ch=='{'|| m_ch=='}'|| m_ch=='?'|| m_ch==':'))
{
strTemp+=m_ch;
m_ch=getnextchar();
m_col++;
}
return strTemp;
}
// //词法分析主程序
void CScanner::morphologyAnalyse()
我做编译原理写的,希望对你有帮助。
m_nCount=0;//记录当前扫描数字的下标 m_ch=getnextchar(); CString strTemp;//当前分析的标识符 tokentype currenttoken;//当前分析单词的类型 while(1) { if(m_strText=="" || m_nCount>m_nLength) { m_words.str="#"; m_words.GrammarWords = '#'; m_words.type=tokentype::OVER; m_words.row=m_row; m_words.col=m_col+1; m_wordList.AddTail(m_words); return; } while(m_ch==32 || m_ch=='\t' || m_ch=='\n') { if(m_ch=='\n') { m_row++; m_col=0; } if('\t'==m_ch) { m_col+=4; } if(m_nCount>m_nLength) { m_words.str="#"; m_words.GrammarWords = '#'; m_words.type=tokentype::OVER; m_words.row=m_row; m_words.col=m_col+1; m_wordList.AddTail(m_words); return ; } m_ch=getnextchar(); m_col++ …… 此处隐藏:4616字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [教育文库]夜场KTV服务员的岗位职责及工作流程[1]
- [教育文库]企划、网络、市场绩效考核方案
- [教育文库]学党史、知党情、强党性--“党的基本理
- [教育文库]2016年高考物理大一轮总复习(江苏专版
- [教育文库]干部廉洁自律自查自纠的报告
- [教育文库]2010年北京大学心理学系拟录取硕士研究
- [教育文库]资金时间价值练习题及答案
- [教育文库]保护环境的心得体会
- [教育文库]英语角内容:英语趣味小知识
- [教育文库]档案收集与管理工作通知
- [教育文库]劳动规章制度范本范本
- [教育文库]高考物理一轮复习课后限时作业1运动的
- [教育文库]机械工艺夹具毕业设计195推动架设计说
- [教育文库]通用技术教学比赛说课稿2
- [教育文库]2018年四年级英语下册 Module 7 Unit 2
- [教育文库]第2章 宽带IP网络的体系结构
- [教育文库]九年级化学第五单元课题3《根据化学方
- [教育文库]小学英语六年级情态动词用法归纳
- [教育文库]甲级单位编制窑井盖项目可行性报告(立
- [教育文库]2016-2021年中国城市规划行业全景调研
- 高考英语听力十大场景词汇总结
- 全省领导班子思想政治建设座谈会会议精
- 人教版新课标高一英语提优竞赛试题 下
- 江西省2014年生物中考试题
- 长沙镇食品药品安全事故应急预案
- 《金刚石、石墨和C60》片段教学设计
- 福州教育学院(王旭东)
- 基于EDA音乐播放器的设计
- 9、古诗两首《夜书所见》《九月九日忆
- 小学语文课外阅读有效策略探讨
- 贵州文化产业发展成支柱产业的问卷调查
- 膀胱类癌的诊治体会(附3例报告)
- 发动机积碳产生的原因
- Configuring Code Composer Studio for
- 学生良好的心理素质如何培养点滴谈
- 46 电沉积法制备锂离子电池用硅-锂薄膜
- 美舍雅阁公司管理中各部门职责
- 去壳剥皮的小妙招
- 六自由度运动平台的仿真研究
- Pride and Prejudice(傲慢与偏见)




