编译原理课程设计语法分析器Word文档格式.docx

上传人:b****2 文档编号:4192872 上传时间:2023-05-02 格式:DOCX 页数:14 大小:58.64KB
下载 相关 举报
编译原理课程设计语法分析器Word文档格式.docx_第1页
第1页 / 共14页
编译原理课程设计语法分析器Word文档格式.docx_第2页
第2页 / 共14页
编译原理课程设计语法分析器Word文档格式.docx_第3页
第3页 / 共14页
编译原理课程设计语法分析器Word文档格式.docx_第4页
第4页 / 共14页
编译原理课程设计语法分析器Word文档格式.docx_第5页
第5页 / 共14页
编译原理课程设计语法分析器Word文档格式.docx_第6页
第6页 / 共14页
编译原理课程设计语法分析器Word文档格式.docx_第7页
第7页 / 共14页
编译原理课程设计语法分析器Word文档格式.docx_第8页
第8页 / 共14页
编译原理课程设计语法分析器Word文档格式.docx_第9页
第9页 / 共14页
编译原理课程设计语法分析器Word文档格式.docx_第10页
第10页 / 共14页
编译原理课程设计语法分析器Word文档格式.docx_第11页
第11页 / 共14页
编译原理课程设计语法分析器Word文档格式.docx_第12页
第12页 / 共14页
编译原理课程设计语法分析器Word文档格式.docx_第13页
第13页 / 共14页
编译原理课程设计语法分析器Word文档格式.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

编译原理课程设计语法分析器Word文档格式.docx

《编译原理课程设计语法分析器Word文档格式.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计语法分析器Word文档格式.docx(14页珍藏版)》请在冰点文库上搜索。

编译原理课程设计语法分析器Word文档格式.docx

参考文献:

8

1正则表达式

1.1正则表达式

ab(a|b)*ba

1.2确定化(化简)后的状态转换图

1.3分析程序代码

importjava.util.Scanner;

importjava.util.regex.Matcher;

importjava.util.regex.Pattern;

//导入所需要的包

publicclassRegTest{//创建类RegTest

staticbooleantest(Strings1,Strings2){

/*编写测试函数返回布尔类型,用于验证输入字符串与要验证的表达式是否符合*/

Patternp=Ppile(s1);

//正则表达式

Matcherm=p.matcher(s2);

//操作字符串

booleanb=false;

//p=Ppile(s1);

//

//m=p.matcher(s2);

b=m.matches();

//判断是否满足是则返回true否返回false

if(b==false){

System.out.println("

您输入的不符合您要求的正则表达式"

);

}else{

符合您所输入的正则表达式"

}

returnb;

}

publicstaticvoidmain(String[]args){

//主函数

Scannercin=newScanner(System.in);

//用于输入字符串

Strings;

while(true){

System.out.println("

请输入正则表达式:

"

Strings1=cin.nextLine();

请输入字符串:

Strings2=cin.nextLine();

//输入表达式和要验证的字符串

test(s1,s2);

//调用函数,测试是否符合要验证的表达式

while(true){

System.out.println("

是否继续验证该表达式?

(yes/no)"

s=cin.nextLine();

//如果还想继续验证刚才输入的表达式,可以继续输入字符串

if(!

s.equals("

yes"

)){

break;

}

s2=cin.nextLine();

test(s1,s2);

//调用函数,测试是否符合要验证的表达式

}

是否继续验证正则表达式?

//如果需要验证其他字符串的话,可以继续输入

}

}

1.4程序运行截图

1.5小结

总的来说对于正则表达有一定的了解,正则表达简单来说不算难,但是要深入就很难。

通过这次的报告,我清楚了解到正则表达式在实际的生活中其实还是很有用的,需要用的地方很多,编译原理,不止在编程上有用处,在实际生活中也是用处很大的。

对于现在的我来说正则表达式,只能算是了解,还得继续学习。

2LL

(1)分析

2.1LL

(1)文法

E→TE'

E'

→+TE'

T→FT'

T'

→*FT'

F→(E)|i

2.2LL

(1)预测分析表

i

+

*

#

E

E→TE'

E'

→ε

T

T→FT'

T'

F

F→i

F→(E)

2.3分析程序代码

importjava.util.ArrayList;

publicclassLL1Analysis{

publicstaticvoidmain(Stringa[])

{

intid=1;

intindex1=1;

//记录栈最后一个非终结符的位置

StringtopStack,topIn,operation;

StringBufferinString=null;

ArrayList<

String>

list=newArrayList<

();

System.out.println("

请输入一个语句:

Scannerin=newScanner(System.in);

Stringins=in.nextLine().trim();

if(ins.indexOf("

#"

)<

0)//假如最后完了输入#号也没事

ins+="

;

else

ins=ins.substring(0,ins.indexOf("

)+1);

//截取#号在内的前部

inString=newStringBuffer(ins);

intkong=inString.indexOf("

"

while(kong>

=0)//去掉输入串表达式中的空格

{

inString.delete(kong,kong+1);

kong=inString.indexOf("

StringBufferstack=newStringBuffer("

#E"

//分析栈,初始放入E

Stringll[][]={{"

"

i"

+"

*"

("

)"

},

{"

E"

E’T/P"

E’"

E’T/N"

ε/P"

T"

T’F/P"

T’"

T’F/N"

F"

ε/N"

)E/N"

acc"

};

//ll

(1)分析矩阵

System.out.println("

LL

(1)分析过程如下:

\n序号\t分析栈"

+getBlank(20)+"

输入数据"

动作"

StringBufferliutemp=null;

while(stack.length()>

0)

intx=0,y=0;

//记录在分析表中的的横纵坐标

if(stack.toString().endsWith("

\'

)||stack.toString().endsWith("

’"

))//证明是带了一撇的非终结符

index1=stack.length()-2;

//

else

index1=stack.length()-1;

topStack=String.valueOf(stack.substring(index1,stack.length()));

//栈顶元素

if(inString.length()>

topIn=String.valueOf(inString.charAt(0));

//剩余输入串的第一个元素

else

topIn="

for(inti=1;

i<

ll.length;

i++)//计算对应分析表的哪一行

if(topStack.equals(ll[i][0]))

{

x=i;

break;

ll[0].length;

i++)//计算对应分析表的列数

if(topIn.equals(ll[0][i]))

{

y=i;

operation=ll[x][y];

//动作命令

if(operation.length()>

=3)

Stringfirst=operation.substring(0,operation.length()-2);

//替换部分

Stringlast=operation.substring(operation.length()-2,operation.length());

//是否换行部分

if(first.equals("

ε"

))//如果是空字符,有不要加入栈

first="

if(operation.equals("

))

if(stack.length()==1&

&

inString.length()==1)

{

System.out.println(id+"

\t"

+stack+getBlank(21-stack.length()-inString.length())+inString+getBlank(11-operation.length())+operation);

stack.delete(0,1);

inString.delete(0,1);

匹配成功!

else

+stack+getBlank(21-stack.length()-inString.length())+inString+getBlank(6)+"

error"

不能完整匹配!

elseif(last.equals("

/P"

System.out.println(id+"

stack.replace(index1,index1+topStack.length(),first);

//把栈顶元素替换为分析表中值

if(first.equals("

list.add(ll[x][0]+"

->

else{

liutemp=newStringBuffer(first);

+reverse(liutemp));

id++;

}elseif(last.equals("

/N"

//相当于读下一个元素

list.add(ll[x][0]+"

+topIn+reverse(liutemp));

if(stack.toString().endsWith("

index1=stack.length()-2;

//重新设置index1值

else

index1=stack.length()-1;

}else{

分析表构造出错!

System.exit(0);

}elseif(y==0){

System.out.println(id+"

输入的符号不符合规定文法!

System.exit(0);

}elseif(x!

=0&

y!

operation.length()==0)

+stack+getBlank(21-stack.length()-inString.length())+inString+inString+getBlank(6)+"

输入符号串不完整!

\n该语句自顶向下构建语法树过程:

for(inti=0;

list.size();

i++)

System.out.println(list.get(i));

publicstaticStringBufferreverse(StringBufferbuffer){//字母、运算符倒置

StringBufferbuf=newStringBuffer();

intix=-1;

intlength=0;

if(buffer.indexOf("

'

0&

buffer.indexOf("

buf.append(buffer.reverse());

else{

while(buffer.length()>

0){

length=buffer.length();

if(buffer.charAt(length-1)=='

||buffer.charAt(length-1)=='

’'

buf.append(buffer.substring(length-2,length));

buffer.delete(length-2,length);

buf.append(buffer.charAt(length-1));

buffer.delete(length-1,length);

returnbuf;

publicstaticStringgetBlank(intn){//得到n个连续空格

Stringblank="

for(inti=0;

n;

blank+="

returnblank;

2.4程序运行截图

2.5小结

对于LL

(1)分析法有一定了解,对于完成整个算法还是挺吃力的,查看的相当的一些资料,才慢慢理解,并且慢慢的想出其算法。

最后才能根据算法写出来,并运行。

总的来说对于算法有了更深刻的理解。

算法在计算机中用处还真是挺大的。

[1]杨德芳主编.编译原理实用教程[M].北京:

中国水利水电出版社,2007

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

当前位置:首页 > 医药卫生 > 基础医学

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

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