北邮大三上编译原理词法分析实验报告Word下载.docx

上传人:b****6 文档编号:15922200 上传时间:2022-11-17 格式:DOCX 页数:17 大小:58.70KB
下载 相关 举报
北邮大三上编译原理词法分析实验报告Word下载.docx_第1页
第1页 / 共17页
北邮大三上编译原理词法分析实验报告Word下载.docx_第2页
第2页 / 共17页
北邮大三上编译原理词法分析实验报告Word下载.docx_第3页
第3页 / 共17页
北邮大三上编译原理词法分析实验报告Word下载.docx_第4页
第4页 / 共17页
北邮大三上编译原理词法分析实验报告Word下载.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

北邮大三上编译原理词法分析实验报告Word下载.docx

《北邮大三上编译原理词法分析实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《北邮大三上编译原理词法分析实验报告Word下载.docx(17页珍藏版)》请在冰豆网上搜索。

北邮大三上编译原理词法分析实验报告Word下载.docx

通过编写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))

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1