北邮编译原理-词法分析文档和程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
班级:14
姓名: oneseven
学号:
一.题目:词法分析程序设计与实现
*
二.实验内容:设计并实现 C 语言的词法分析程序,要求如下。
(1) 可以识别出用C语言编写的源程序中的每个单词符号,并以记号的形式输出每个单词符号。
(2) 可以识别并读取源程序中的注释。
(3) 可以统计源程序中的语句行数、单词个数和字符个数,其中标点和空格不计算为单词,并输出统计结果。
(4) 检查源程序中存在的非法字符错误,并可以报告错误所在的行列位置。
三.实现要求:采用C/C++作为实现语言,手工编写词法分析程序。
;
四.实现功能:基本完成了实验内容中要求的所有功能。(1)识别出源程序中的每个单词符号,并以记号的形式输出每个单词符号(2)识别并读取源程序中的注释(3) 统计源程序中的语句行数、单词个数和字符个数(4) 检查源程序中存在的非法字符错误,并可以报告错误所在的行列位置。
注:本程序未把注释中的单词符号,“”中的单词符号统计在单词个数中。单词个数只包括了标示符,关键字,无符号数。
五.实验原理:
1.词法分析程序的功能:
输入源程序,输出单词符号的记号形式,如图所示:
>
源程序词法分析器单词符号的记号形式
词法分析器
2.处理过程:每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直至整个源程序全部扫描完毕,并形成相应的单词串形式的源程序。
六.代码
#include
#include
—
#include
#include
using namespace std;
string keyword[32]={"auto","break","case","char","const", .'z':
case 'A'...'Z':
case '_':
word++;
—
while(isalpha(c)||isdigit(c)||c=='_')
{
str+=c;
get();
}
if(c=='@'||c==''||c=='$'||c=='#')
{
int tag=column;
】
while(isalpha(c)||isdigit(c)||c=='_'||c=='@'||c==''||c=='$'||c=='#') {
str+=c;
get();
}
outf< "< str=""; break; * } if(find_key(str)) { outf< str=""; } else { } outf< str=""; } break; case '0'...'9': word++; while(isdigit(c)||c=='.'||c=='e'||c=='E') { : str+=c; if(c=='e'||c=='E') { get(); str+=c; } get(); } / if(isalpha(c)) { int tag=column; while(isalpha(c)||c=='_'||isdigit(c)||c=='@'||c==''||c=='$'||c=='#') { str+=c; get(); } ; outf< "< str=""; break; } outf< str=""; break; case'>': ) get(); if(c=='=') outf< else if(c=='>') outf< else { outf< break; } get(); break; case'<': get(); if(c=='=') outf< 》 else if(c=='<') outf< else { outf< } get(); ~ break; case'=': get(); if(c=='=') outf< else { outf< break;