中南大学软件学院编译原理实验报告Word格式.docx

上传人:b****2 文档编号:1128622 上传时间:2023-04-30 格式:DOCX 页数:19 大小:200.55KB
下载 相关 举报
中南大学软件学院编译原理实验报告Word格式.docx_第1页
第1页 / 共19页
中南大学软件学院编译原理实验报告Word格式.docx_第2页
第2页 / 共19页
中南大学软件学院编译原理实验报告Word格式.docx_第3页
第3页 / 共19页
中南大学软件学院编译原理实验报告Word格式.docx_第4页
第4页 / 共19页
中南大学软件学院编译原理实验报告Word格式.docx_第5页
第5页 / 共19页
中南大学软件学院编译原理实验报告Word格式.docx_第6页
第6页 / 共19页
中南大学软件学院编译原理实验报告Word格式.docx_第7页
第7页 / 共19页
中南大学软件学院编译原理实验报告Word格式.docx_第8页
第8页 / 共19页
中南大学软件学院编译原理实验报告Word格式.docx_第9页
第9页 / 共19页
中南大学软件学院编译原理实验报告Word格式.docx_第10页
第10页 / 共19页
中南大学软件学院编译原理实验报告Word格式.docx_第11页
第11页 / 共19页
中南大学软件学院编译原理实验报告Word格式.docx_第12页
第12页 / 共19页
中南大学软件学院编译原理实验报告Word格式.docx_第13页
第13页 / 共19页
中南大学软件学院编译原理实验报告Word格式.docx_第14页
第14页 / 共19页
中南大学软件学院编译原理实验报告Word格式.docx_第15页
第15页 / 共19页
中南大学软件学院编译原理实验报告Word格式.docx_第16页
第16页 / 共19页
中南大学软件学院编译原理实验报告Word格式.docx_第17页
第17页 / 共19页
中南大学软件学院编译原理实验报告Word格式.docx_第18页
第18页 / 共19页
中南大学软件学院编译原理实验报告Word格式.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

中南大学软件学院编译原理实验报告Word格式.docx

《中南大学软件学院编译原理实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《中南大学软件学院编译原理实验报告Word格式.docx(19页珍藏版)》请在冰点文库上搜索。

中南大学软件学院编译原理实验报告Word格式.docx

读入一个单词后对照一开始的五类分析出是哪一类,符合后交给语法分析器处理。

实现过程:

importjava.io.*;

importjava.util.ArrayList;

/**

*Createdby温睿诚on2016/5/11/0011.

*/

publicclassCiFa{

String[]keyword={"

//记录结果的符号表

//用什么数据结构呢?

//当前单词

StringBuilderstr=newStringBuilder("

);

//下一个要读的字符

charnow;

//一个栈

Character>

stack=newArrayList<

privatevoidput(){

stack.add(newCharacter(now));

}

privatecharpop(){

if(stack.size()>

0){

return((Character)stack.remove(stack.size()-1)).charValue();

}else{

return0;

}

//错误信息

StringerrorMsg;

Readerreader=null;

publicstaticvoidmain(String[]args){

CiFacifa=newCiFa();

cifa.fenXi(args[0]);

privatevoidfenXi(Stringfilename){

//读取文件

Filefile=newFile(filename);

try{

reader=newInputStreamReader(newFileInputStream(file));

}catch(FileNotFoundExceptione){

System.out.println("

读取文件字符失败!

e.printStackTrace();

//不断读取字符直到结束

getChar();

intresult;

//使用预测分析法

YuFayuFa=newYuCeFenXi();

booleanflag=true;

while(!

(now<

0||now>

=65535)){

//根据返回数值查找或插入,错误则打印并提示。

正确则记录到map

result=read();

if(result!

=6){

+result+"

\"

+str+"

\"

if(!

yuFa.fenxi(result,str.toString())){

flag=false;

System.err.println("

语法分析出错!

出错单词:

"

+str.toString());

}else{

System.err.println("

+errorMsg+"

str.delete(0,str.length());

//结束

booleantempResult=false;

if(yuFa!

=null)

tempResult=yuFa.fenxi(6,"

#"

if(tempResult&

&

flag)

语法分析通过!

//判断是否为数字

privatebooleanisDigit(){

if('

0'

<

=now&

now<

='

9'

returntrue;

else

returnfalse;

//判断是否为字母

privatebooleanisLetter(){

if(('

a'

z'

)||('

A'

Z'

))

//赋值下一字符给now,返回true表示读到空格、换行等空白字符

privatebooleangetChar(){

booleanflag=false;

now=(char)reader.read();

while(now==0||now=='

\t'

||now=='

\r'

\n'

||now==32){

flag=true;

}catch(IOExceptione){

e.printStackTrace();

returnflag;

//连接字符到单词

privatevoidconcat(){

str.append(now);

privatebooleanisSpilt(){

Stringtemp=String.valueOf(now);

for(Stringstr:

spilt){

if(str.startsWith(temp)){

returnfalse;

privatebooleaninAL(Stringstr,ArrayList<

strings){

if(strings.contains(str))

privatebooleaninShuzu(Stringstr,String[]strings){

for(Stringstr1:

if(str.equals(str1)){

privatebooleanisYun(){

yunsuan){

//词法分析器

privateintread(){

if(isLetter()){

//字母开始的,要么关键字,要么标识符,其用空格、tab、回车之类的分隔,

//而标识符还可以用分割符号、运算符号分割。

暂不判断标识符是否定义

concat();

booleanflag;

flag=getChar();

while((isDigit()||isLetter())&

flag==false){

concat();

if(inShuzu(str.toString(),keyword)){

return1;

if(!

inAL(toString(),biaoshi)){

biaoshi.add(str.toString());

return2;

}elseif(isDigit()){

//数字开头的,是常数,以空格、tab等以及分隔符、运算符分割

while(isDigit()){

return3;

}elseif(isSpilt()){

//分隔符,当出现{、(时入栈,接收到}、)时判断是否符合。

单个字符,不需要分隔

if(now=='

{'

('

){

put();

}elseif(now=='

}'

chartemp=pop();

if(temp!

errorMsg="

没有'

与'

匹配"

return6;

}elseif(now=='

)'

return5;

}elseif(isYun()){

//运算符,一般为单个符号,例外如下

if(now=='

<

'

getChar();

='

return4;

//ERROR

无法识别\"

+now+"

结果:

对于文件:

输出:

第二部分语法分析(任选其中一个做实验)

实验二预测分析法设计与实现

实验报告要求用文法的形式对语法定义做出详细说明,说明语法分析程序的工作过程,说明错误处理的实现。

首先写出文法,然后作出预测分析表,再根据算法查表判断是否符合改文法。

这是自己写的文法。

模仿C++文法,但有不少局限性。

importjava.util.Stack;

*Createdby温睿诚on2016/6/1/0001.

*预测分析法

*/

publicclassYuCeFenXiimplementsYuFa{

Stack<

stack;

String[]t={"

String[]o={"

String[]k={"

String[]c={"

privatestaticString[][]map=newString[15][14];

//横排SABCNDEFGHIJKL

//对应1234567891011121314

//竖排tbz(o),;

=k{}#

//对应12345678910111213

YuCeFenXi(){

//null即出错,空字符串即空字

map[1][1]="

tb(A){N}S"

map[1][13]="

map[2][1]="

B"

map[2][6]="

map[3][1]="

tbC"

map[4][6]="

map[4][7]="

tbC"

map[5][1]="

tbD;

N"

map[5][2]="

bI;

map[5][10]="

k(E){N}N"

map[5][12]="

map[6][7]="

bD"

map[6][8]="

map[7][2]="

bJ"

map[7][3]="

F"

map[8][3]="

zG"

map[9][5]="

oHcH"

map[9][6]="

map[10][2]="

b"

map[10][3]="

z"

map[11][4]="

(A)"

map[11][9]="

=K"

map[12][4]="

map[12][5]="

map[12][6]="

map[13][2]="

HL"

map[13][3]="

map[14][5]="

oHL"

map[14][8]="

stack=newStack<

stack.push("

S"

//判断是否非终结符

privatebooleanisN(Stringstr){

if(str.length()!

=1)

chartemp=str.charAt(0);

if((temp>

&

temp<

L'

)||(temp=='

S'

)||temp=='

N'

//把非终结符转换为表中对应数字

privateintn2I(Stringstr){

chartemp=str.charAt(0);

switch(temp){

case'

:

case'

B'

C'

return5;

default:

returntemp-'

+3;

//把终结符转换为表中对应数字

privateintt2I(Stringstr){

t'

b'

o'

return6;

'

return7;

return8;

return9;

k'

return10;

return11;

return12;

#'

return13;

return-1;

privatebooleaninArray(Stringstr,String[]array){

for(Stringtemp:

array){

if(str.equals(temp))

publicstaticbooleanisNumeric(Stringstr){

for(inti=0;

i<

str.length();

i++){

System.out.println(str.charAt(i));

Character.isDigit(str.charAt(i))){

//若word是常规终结符如{,;

则返回原值,若是int这种,则返回t

publicStringword2T(inttype,Stringword){

switch(type){

case1:

if(inArray(word,t))

return"

t"

elseif(inArray(word,k))

k"

returnnull;

case2:

case3:

case4:

if(inArray(word,o))

o"

elseif(inArray(word,c))

c"

elseif(word.equals("

returnword;

case5:

case6:

returnnull;

@Override

publicbooleanfenxi(inttype,Stringstr){

Stringstr1=stack.peek();

//str1是栈顶符号

//str是当前输入符号

isN(str1)){

//栈顶符号是终结符

if(str1.equals("

)&

str.equals(str1)){

//System.out.println("

语法分析通过"

}elseif(str1.equals(word2T(type,str))){

stack.pop();

returntrue;

//栈顶符号是非终结符

Stringchanshengshi=map[n2I(str1)][t2I(word2T(type,str))];

if(chanshengshi==null)

else{

for(inti=chanshengshi.length()-1;

i>

=0;

i--){

stack.push(String.valueOf(chanshengshi.charAt(i)));

//这里写语义分析

returnfenxi(type,str);

对于输入文件:

实验四递归下降分析法设计与实现

详细说明递归下降分析法程序的工作过程,并且详细说明你的程序的设计思路和实现。

根据文法写几个函数即可。

这是这次实验的文法(之前自己写的文法画出的LL

(1)分析表实在太大了,画不下去……就换了个实验做):

/*文法

E→T{+T}

T→F{*F}

F→i

F→(E)

实现:

importjava.util.Scanner;

*Createdby温睿诚on2016/6/12/0012.

publicclassDiGuiDown{

E→T{+T}

F→i

F→(E)

staticScannerscanner;

staticStringsym;

staticbooleanflag=true;

scanner=newScanner(System.in);

advance();

E();

if(flag){

合法字符串"

非法字符串"

privatestaticvoidadvance(){

if(scanner.hasNext()){

sym=scanner.next();

privatestaticvoidE(){

T();

while(sym.equals("

)){

privatestaticvoidT(){

F();

privatestaticvoidF(){

if(sym.equals("

i"

if(sym.equals("

//error

flag=false;

此处应该输入),但输入了"

+sym);

此处应该输入(,但输入了"

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

当前位置:首页 > 临时分类 > 批量上传

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2