合肥工业大学编译原理实验Word格式文档下载.docx

上传人:b****1 文档编号:15346419 上传时间:2022-10-29 格式:DOCX 页数:39 大小:358.54KB
下载 相关 举报
合肥工业大学编译原理实验Word格式文档下载.docx_第1页
第1页 / 共39页
合肥工业大学编译原理实验Word格式文档下载.docx_第2页
第2页 / 共39页
合肥工业大学编译原理实验Word格式文档下载.docx_第3页
第3页 / 共39页
合肥工业大学编译原理实验Word格式文档下载.docx_第4页
第4页 / 共39页
合肥工业大学编译原理实验Word格式文档下载.docx_第5页
第5页 / 共39页
点击查看更多>>
下载资源
资源描述

合肥工业大学编译原理实验Word格式文档下载.docx

《合肥工业大学编译原理实验Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《合肥工业大学编译原理实验Word格式文档下载.docx(39页珍藏版)》请在冰豆网上搜索。

合肥工业大学编译原理实验Word格式文档下载.docx

一、实验目的和要求

通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设

计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的

理解,并能正确地、熟练地运用。

二、实验原理

(1)实验数据结构说明

K[]String数组-关键字表;

s[]char数组—分界符;

m[]char数组—算术运算符;

r[]String数组—关系运算符;

ArrayList型String数组ci—常数;

ArrayList型String数组id—标识符

(2)实验算法描述

(3)算法流程图

三、源程序代码和测试结果

packagelexicalAnalysis;

importjava.util.*;

importjava.io.*;

publicclasslexicalAnalysis{

staticStringk[]={"

for"

"

main"

if"

while"

void"

public"

static"

printf"

scanf"

asm"

do"

return"

typedef"

auto"

double"

break"

short"

using"

default"

long"

};

//关键字

staticchars[]={'

'

;

'

('

)'

['

]'

{'

}'

//2分界符

staticcharm[]={'

+'

-'

*'

/'

//3算术运算符

staticStringr[]={"

<

"

="

>

//4关系运算符

ArrayList<

String>

ci=newArrayList<

();

//5常数

id=newArrayList<

//6标识符

StringtempToken="

//临时存放组成一个“词”单位串

intpint,row=1,line=1;

//当前指针指示,行数,列数

charch;

//存放最新读入源程序字符

Stringinstring;

//存放输入de源程序代码

publicstaticvoidmain(String[]args)throwsException{

//TODOAuto-generatedmethodstub

lexicalAnalysisone=newlexicalAnalysis();

System.out.println("

单词"

+"

\t二元序列"

\t类型"

\t位置(行,列)"

);

one.readtext();

}

booleanisdigit(charc){//判断所读字符是否为数字,是则返回ture,否则返回false

if(c>

=48&

&

c<

=57)

returntrue;

else

returnfalse;

booleanisletter(charc){//判断所读字符是否为字母,是则返回true,否则返回false

if((c>

64&

c<

91)||(c>

96&

123))

booleanisline(charc){//判断字符c是否是下划线"

_"

if(c=='

_'

}

booleanremove(){//用于在判断关系运算符时,判断是否是要再读一个字符

charb=instring.charAt(pint+1);

//string类charAt()方法用于返回指定索引处的字符。

索引范围为从0到length()-1

if(b=='

='

||b=='

)//当其后的字符是=或>

时,要再读一个字符。

否则不要再读。

voidclearBlank(){//检查空白直到读入字符非空白

while(ch=='

'

){

getchar();

}

voidgetchar(){

pint++;

if(pint<

=instring.length()-1){

ch=instring.charAt(pint);

if(ch=='

\n'

change_row_line();

ch='

//instring数据读取完,需重新读入

voidretract(){//读入前一个字符

pint--;

voiddistinguishLeter(){//识别字符串

tempToken="

//清空

while(isletter(ch)||isdigit(ch)||isline(ch)){//字母,数字,下划线仍是字符串合法组成,继续识别

tempToken=tempToken+ch;

getchar();

voiddistinguishDigit(){//识别数字串

tempToken="

//先将strtoken置空

while(isdigit(ch)){//当数字时继续识别数字串

tempToken=tempToken+ch;

//将新识别的字符加到strtoken后

if(isletter(ch)||isline(ch)){//识别完数字串而其后是字母,下划线时出错处理

while(isletter(ch)||isline(ch)||isdigit(ch)){//当是字母,数字,下划线时继续识别错误数字串

tempToken=tempToken+ch;

getchar();

}

display(0,tempToken,'

//输出错误数字串

tempToken="

//将strtoken置空返回

}

voiddisplay(inti,Strings,chara){//各种输出处理

switch(i){

case-1:

System.out.println(a+"

\tError"

\t"

+row+"

+line+"

)"

break;

case0:

System.out.println(s+"

\t("

case1:

\t(1,"

+s+"

\t关键字"

case2:

\t(2,"

+a+"

\t分界符"

case3:

\t(3,"

\t算术运算符"

case4:

\t(4,"

\t关系运算符"

case5:

\t(5,"

\t常数"

("

case6:

\t(6,"

\t标识符"

line++;

//列数加一

voidchange_row_line(){//改变行数和列数

row++;

line=1;

voidhandleString(){//输入串处理

pint=-1;

//将搜索指示器置-1

要处理的语句为:

"

+instring);

getchar();

//读入一个字符

while(pint<

instring.length()){//当搜索指示器没有越界时

clearBlank();

//检查空白直到读入读入非空

if(isdigit(ch)){//当ch为数字时进行数字串识别

distinguishDigit();

//数字串识别

if(tempToken.length()!

=0){//经过数字串识别后,如果strtoken不为空

if(reseverci(tempToken)==-1){//如果strtoken不在ci表中,将strtoken加入ci表中

ci.add(tempToken);

//将strtoken加入ci表中

display(5,tempToken,'

//输出数字串

}

else{//如果strtoken在ci表中,仅输出

elseif(isletter(ch)){//当ch为字母时进行字符串识别

distinguishLeter();

//字符串识别

if(reserve(tempToken)==-1){//如果strtoken不在k表中

if(reseverid(tempToken)==-1){//如果strtoken不在id表中

id.add(tempToken);

//将strtoken加入id表中

display(6,tempToken,'

//输出标识串

else{//如果strtoken在id表中

else{//如果strtoken在关键字表

display(1,te

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

当前位置:首页 > PPT模板 > 其它模板

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

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