北邮大三上编译原理词法分析实验报告Word下载.docx
《北邮大三上编译原理词法分析实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《北邮大三上编译原理词法分析实验报告Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
![北邮大三上编译原理词法分析实验报告Word下载.docx](https://file1.bdocx.com/fileroot1/2022-11/16/8f269521-c6b0-4015-9ac0-d136fbdee2be/8f269521-c6b0-4015-9ac0-d136fbdee2be1.gif)
通过编写LEX源程序,利用LEX软件工具自动生成词法分析程序。
2.检测代码分析
1、HelloWorld简单程序输入:
2、较复杂程序输入:
3.异常程序输入检测
三,源代码
#include<
cmath>
cctype>
string>
vector>
cstdio>
cstdlib>
cstring>
fstream>
iostream>
algorithm>
usingnamespacestd;
constintFILENAME=105;
constintMAXBUF=82;
constintL_END=40;
constintR_END=81;
constintSTART=0;
//开始指针
vector<
Key;
//C保留的关键字表
classfuntion//词法分析结构
{
public:
//变量声明
charfilename[FILENAME];
//需要词法分析的代码文件名
ifstreamf_in;
charbuffer[MAXBUF];
//输入缓冲区
intl_end,r_end,forward;
//左半区终点,右半区终点,前进指针,
booll_has,r_has;
//辅助标记位,表示是否已经填充过缓冲区
vector<
Id;
//标识符表
charC;
//当前读入的字符
intlinenum,wordnum,charnum;
//行数,单词数,字符数
stringcurword;
//存放当前的字符串
//函数声明
voidget_char();
//从输入缓冲区读一个字符,放入C中,forward指向下一个
voidget_nbc();
//检查当前字符是否为空字符,反复调用直到非空
voidretract();
//向前指针后退一位
voidinitial();
//初始化要词法分析的文件
voidfillBuffer(intpos);
//填充缓冲区,0表示左,1表示右
voidanalyzer();
//词法分析
voidtoken_table();
//以记号的形式输出每个单词符号
voidnote_print();
//识别并读取源程序中的注释
voidcount_number();
//统计源程序汇总的语句行数、单词个数和字符个数
voiderror_report();
//检查并报告源程序中存在的所有错误
voidsolve(char*file);
//主调用函数
};
voidwelcome()
printf("
\n*********************************************************\n"
);
printf("
**WelcometouseLexicalAnalyzer**\n"
**Byschnee@BUPTDate:
2011/20/10**\n"
*********************************************************\n\n\n"
}
voidinitKey()
Key.clear();
Key.push_back("
auto"
break"
case"
char"
const"
continue"
Key.push_back("
default"
do"
double"
else"
enum"
extern"
float"
for"
goto"
if"
int"
long"
register"
return"
short"
signed"
static"
sizeof"
struct"
switch"
typedef"
union"
unsigned"
void"
volatile"
while"
voidfuntion:
:
get_char()
C=buffer[forward];
if(C==EOF)return;
//结束
if(C=='
\n'
)linenum++;
//统计行数和字符数
elseif(isalnum(C))charnum++;
forward++;
if(buffer[forward]==EOF)
{
if(forward==l_end)
{
fillBuffer
(1);
forward++;
}
elseif(forward==r_end)
fillBuffer(0);
forward=START;
}
get_nbc()
while(C=='
'
||C=='
\t'
\0'
)
get_char();
initial(char*file)
Id.clear();
//清空标识符表
l_end=L_END;
r_end=R_END;
//初始化缓冲区
forward=0;
l_has=r_has=false;
buffer[l_end]=buffer[r_end]=EOF;
fillBuffer(0);
linenum=wordnum=charnum=0;
//初始化行数,单词数,字符数
fillBuffer(intpos)
if(pos==0)//填充缓冲区的左半边
if(l_has==false)
fin.read(buffer,l_end);
if(fin.gcount()!
=l_end)
buffer[fin.gcount()]=EOF;
elsel_has=false;
else//填充缓冲区的右半边
if(r_has==false)
fin.read(buffer+l_end+1,l_end);
buffer[fin.gcount()+l_end+1]=EOF;
elser_has=false;
retract()
if(forward==0)
l_has=true;
//表示已经读取过文件,避免下次再次读取
forward=l_end-1;
else
forward--;
r_add=true;
forward--;
analyzer()
FILE*token_file,*note_file,*count_file,*error_file;
token_file=fopen("
token_file.txt"
"
w"
note_file=fopen("
note_file.txt"
count_file=fopen("
count_file.txt"
error_file=fopen("
error_file.txt"
inti;
curword.clear();
get_char();
get_nbc();
if(C==EOF)returnfalse;
if(isalpha(C)||C=='
_'
)//关键字和标识符的处理,以字母或下划线开头
curword.clear();
while(isalnum(C)||C=='
curword.push_back(C);
get_char();
retract();
wordnum++;
Id.push_back(curword);
for(i=0;
i<
Key.size();
i++)
if(Key[i]==curword)
break;
//输出每一个单词的标识符
if(i<
Key.size())//关键字
fprintf(token_file,"
%8d----%20s%s\n"
wordnum,"
KEYWORD"
curword);
else
Identifier"
elseif(isdigit(C))//无符号数的处理
while(isdigit(C))