武汉理工大学编译原理实验报告Word文件下载.docx

上传人:b****6 文档编号:16238652 上传时间:2022-11-21 格式:DOCX 页数:28 大小:114.35KB
下载 相关 举报
武汉理工大学编译原理实验报告Word文件下载.docx_第1页
第1页 / 共28页
武汉理工大学编译原理实验报告Word文件下载.docx_第2页
第2页 / 共28页
武汉理工大学编译原理实验报告Word文件下载.docx_第3页
第3页 / 共28页
武汉理工大学编译原理实验报告Word文件下载.docx_第4页
第4页 / 共28页
武汉理工大学编译原理实验报告Word文件下载.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

武汉理工大学编译原理实验报告Word文件下载.docx

《武汉理工大学编译原理实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《武汉理工大学编译原理实验报告Word文件下载.docx(28页珍藏版)》请在冰豆网上搜索。

武汉理工大学编译原理实验报告Word文件下载.docx

(1)选择常用高级程序设计语言(如Pascal、C语言、PL/0语言)的源程序作为词法分析对象。

(2)根据教学要求和学生具体情况,从上列语言之一中选取它的一个适当大小的子集,可以选取一类典型单词,也可以尽可能使各种类型的单词都能兼顾到。

其基本要求是:

对源程序从左到右进行扫描,对组成源程序的字符串拼接成为单词;

二、实验设计(包括实验方案设计,实验手段的确定,实验步骤,实验过程等,用硬件逻辑或者算法描述)

Token.java:

publicclassToken

{

privateinttokenType;

//单词种别码

privateStringtokenValue;

//单词值

publicToken(inttokenType,StringtokenValue)

{

this.tokenType=tokenType;

this.tokenValue=tokenValue;

}

publicintgetTokenType()

returntokenType;

publicStringgetTokenValue()

returntokenValue;

}

TokenTable.java:

publicclassTokenTable

privatestaticHashMap<

String,Integer>

identifierOrNumberTable=newHashMap<

>

();

//标识符或数值-标识符或数值种别码

keywordTable=newHashMap<

//关键字-关键字种别码

delimiterTable=newHashMap<

//界符-界符种别码

operatorTable=newHashMap<

//运算符-运算符种别码

static

identifierOrNumberTable.put("

error"

0);

identifier"

1);

number"

2);

keywordTable.put("

char"

3);

int"

4);

float"

5);

double"

6);

void"

7);

main"

8);

if"

9);

else"

10);

for"

11);

while"

12);

do"

13);

switch"

14);

break"

15);

continue"

16);

return"

17);

delimiterTable.put("

{"

18);

}"

19);

["

20);

]"

21);

("

22);

)"

23);

"

24);

;

"

25);

operatorTable.put("

<

26);

="

27);

28);

29);

=="

30);

31);

+"

32);

-"

33);

*"

34);

/"

35);

+="

36);

-="

37);

*="

38);

/="

39);

publicstaticbooleancontainsKeyword(Stringkeyword)

returnkeywordTable.containsKey(keyword);

publicstaticbooleancontainsDelimiter(Stringdelimiter)

returndelimiterTable.containsKey(delimiter);

publicstaticIntegergetTokenType(Stringkey)

returnoperatorTable.containsKey(key)?

operatorTable.get(key)

:

(delimiterTable.containsKey(key)?

delimiterTable.get(key)

(keywordTable.containsKey(key)?

keywordTable.get(key)

(identifierOrNumberTable.containsKey(key)?

identifierOrNumberTable.get(key)

null)));

Lexer.java:

publicinterfaceLexer

/**

*对给定路径的文本文件中的文本,进行词法分析,返回可迭代的单词

*集合。

*@parampath要进行词法分析的文本文件的路径

*@return可迭代的单词集合

*@throwsException抛出所有异常(这么做是为了代码清晰,唉)

*/

Iterable<

Token>

scan(Stringpath)throwsException;

LexerImpl.java:

publicclassLexerImplimplementsLexer

@Override

publicList<

scan(Stringpath)throwsException

List<

tokens=newArrayList<

Pathfile=Paths.get(path);

BufferedReaderin=Files.newBufferedReader(file);

Stringline;

while((line=in.readLine())!

=null)

intindex=0;

//若单词是一个以上的字符组成,此下标就会起作用

for(inti=0;

i<

line.length();

i++)

//标识符或关键字

if(Character.isLetter(line.charAt(i)))

index=i+1;

while(index<

line.length()&

&

Character.isLetterOrDigit(line.charAt(index)))

index++;

Stringkey=line.substring(i,index);

if(TokenTable.containsKeyword(key))

Tokentoken=newToken(TokenTable.getTokenType(key),key);

tokens.add(token);

else

Tokentoken=newToken(TokenTable.getTokenType("

),key);

i=index-1;

//整型非负数值

elseif(Character.isDigit(line.charAt(i)))

booleanerror=false;

if(!

error&

Character.isLetter(line.charAt(index)))

error=true;

StringtokenType=error?

"

Tokentoken=newToken(TokenTable.getTokenType(tokenType),line.substring(i,index));

//界符

elseif(TokenTable.containsDelimiter(String.valueOf(line.charAt(i))))

Stringdelimiter=String.valueOf(line.charAt(i));

Tokentoken=newToken(TokenTable.getTokenType(delimiter),delimiter);

//以下都是运算符..

//运算符"

或"

elseif(line.charAt(i)=='

'

if(line.charAt(index)=='

='

StringlessThanOrEqual=line.substring(i,index+1);

Tokentoken=newToken(TokenTable.getTokenType(lessThanOrEqual),lessThanOrEqual);

i=index;

StringlessThan=(line.substring(i,index));

Tokentoken=newToken(TokenTable.getTokenType(lessThan),lessThan);

StringgreaterThanOrEqual=line.substring(i,index+1);

Tokentoken=newToken(TokenTable.getTokenType(greaterThanOrEqual),greaterThanOrEqual);

StringgreaterThan=(line.substring(i,index));

Tokentoken=newToken(TokenTable.getTokenType(greaterThan),greaterThan);

Stringequal=line.substring(i,index+1);

Tokentoken=newToken(TokenTable.getTokenType(equal),equal);

Stringassign=(line.substring(i,index));

Tokentoken=newToken(TokenTable.getTokenType(assign),assign);

+'

StringaddAssign=line.substring(i,index+1);

Tokentoken=newToken(TokenTable.getTokenType(addAssign),addAssign);

Stringadd=(line.substring(i,index));

Tokentoken=newToken(TokenTable.getTokenType(add),add);

-'

StringsubtractAssign=line.substring(i,index+1);

Tokentoken=newToken(TokenTable.getTokenType(subtractAssign),subtractAssign);

Stringsubtract=(line.substring(i,index));

Tokentoken=newToken(TokenTable.getTokenType(subtract),subtract);

*'

StringmultiplyAssign=line.substring(i,index+1);

Tokentoken=newToken(TokenTable.getTokenType(multiplyAssign),multiplyAssign);

Stringmultiply=(line.substring(i,index));

Tokentoken=newToken(TokenTable.getTokenType(multiply),multiply);

/'

StringdivideAssign=line.substring(i,index+1);

Tokentoken=newToken(TokenTable.getTokenType(divideAssign),divideAssign);

Stringdivide=(line.substring(i,index));

Tokentoken=newToken(TokenTable.getTokenType(divide),divide);

//其他非法字符

elseif(!

Character.isSpaceChar(line.charAt(i)))

),line.substring(i,i+1));

returntokens;

三、主要仪器设备及耗材

PC机,IntelliJIDEA,JDK8

第二部分:

实验调试与结果分析(可加页)

一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)

在扫描源程序字符串时,旦识别出关键字、分隔符、标识符、无符号常数中之一即以单词形式,类单词均采用相同的结构,即二元式编码形式输出。

每次调用词法分析程序它均能自动继续扫描下去形成下一个单词,直至整个源程序全部扫描完毕,并形成相应的单词串形式的源程序。

二、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)

(1)

程序输入:

程序输出:

(2)

三、实验小结、建议及体会

通过这次实验,我加深了对词法分析原理的理解。

对上课学到的抽象知识有了一个实践的练习,对我的学习非常有帮助。

词法分析是编译的第一个阶段,它的主要任务是从左至右逐个字符地对源程序进行扫描,产生一个单词序列,用以语法分析,执行词法分析的程序成为词法分析程序或扫描程序。

本次实验就是要做一个这样的程序。

在之后的编译实验中要以本次实验为基础展开,我会继续努力的!

赋值语句的翻译程序设计

2016年01月08日

一、实验内容描述(问题域描述)

对于常用高级语言(如Pascal、C语言)的赋值语句用所学过的语法分析方法和语义分析方法进行语法分析、语义分析,并把其翻译成为中间代码形式。

对于常用高级语言(如Pascal、C语言)的源程序从左到右进行扫描,把其中赋值语句用所学过的语法分析方法进行语法分析,采用最有代表性的语义分析方法将其转换为中间代码形式表示输出。

3.实验要求

(1)选择最有代表性的语法分析方法,如算符优先法(或简单优先法)、递归下降分析法、LL分析法和LR分析法之一进行语法分析。

(2)选择对各种常见程序语言都通用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。

二、实验设计(包括实验方案设计,实验手段的确定,实验步骤,实验过程等,用硬件逻辑或者算法描述)

#include<

stdio.h>

string.h>

#defineMAX150

#defineMAXBUF255

voidterm();

voidlrparser();

voidstatement();

voidyucu();

voidexpression();

voidfactor();

charprog[MAXBUF],token[MAX];

charch;

intsyn,p,m,n,sum,kk;

char*rwtab[6]={"

begin"

"

then"

end"

};

voidscaner()

for(m=0;

m<

MAX;

m++)

token[m]=NULL;

m=0;

sum=0;

ch=prog[p++];

while(ch=='

'

)ch=prog[p++];

if((ch<

='

z'

&

ch>

a'

)||(c

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

当前位置:首页 > 解决方案 > 工作计划

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

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