教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 教育文库 >

编译原理词法分析报告(C++)

来源:网络收集 时间:2026-09-14
导读: 我做编译原理写的,希望对你有帮助。 词法分析实验报告 一、实验目的 1. 掌握词法分析的原理。 2. 熟悉保留字表等相关的数据结构与单词的分类方法。 3. 掌握词法分析器的设计与调试。 二、实验内容 根据编译中的分词原理,用C++语言编写一个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字,全部文档内容请下载后查看。喜欢就下载吧 ……

编译原理词法分析报告(C++).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/111006.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)