语法分析器的设计大学论文Word格式.docx

上传人:b****5 文档编号:19711754 上传时间:2023-01-09 格式:DOCX 页数:13 大小:98.26KB
下载 相关 举报
语法分析器的设计大学论文Word格式.docx_第1页
第1页 / 共13页
语法分析器的设计大学论文Word格式.docx_第2页
第2页 / 共13页
语法分析器的设计大学论文Word格式.docx_第3页
第3页 / 共13页
语法分析器的设计大学论文Word格式.docx_第4页
第4页 / 共13页
语法分析器的设计大学论文Word格式.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

语法分析器的设计大学论文Word格式.docx

《语法分析器的设计大学论文Word格式.docx》由会员分享,可在线阅读,更多相关《语法分析器的设计大学论文Word格式.docx(13页珍藏版)》请在冰豆网上搜索。

语法分析器的设计大学论文Word格式.docx

LL

(1)分析中X为符号栈栈顶元素,a为输入流当前字符,E为给定测试数据的开始符号,#为句子括号即输入串的括号。

分析表用一个二位数组M表示,数组元素M[A,a]中的下标A表示非终结符,a为终结符或句子括号‘#’,二维数组中存放的是一条关于A的产生式,表明当非终结符A向下推导时,面临输入符a时,所采用的候选产生式,当元素内容无产生式时,则表明用A的左部向下推导时出现了不该出现的符号,因此元素内容转向出错处理的信息。

LL

(1)分析过程主要包括以下四个动作:

替换:

当XVN时选相应产生式的右部去替换X。

此时X出栈,逆序入栈。

匹配:

当XVT时它与a进行匹配,其结果可能成功,也可能失败,如果成功则符号栈中将X退栈并将输入流指针向前移动一位,否则报错。

接受:

当格局为(#,空#)时报告分析成功。

报错:

出错后,停止分析。

并给出相应的错误提示信息。

2.程序流程图:

3、实验程序

(1)分析栈类:

publicclassstack{

privatechars[];

privateinttop;

publicstack(){

s=newchar[200];

s[0]='

#'

;

top=0;

}

chargetTop(){

returns[top];

voidpush(Stringstr){

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

i>

=0;

i--){

s[++top]=str.charAt(i);

}

voidclear(){

charpop(){

if(top!

=0){

top--;

publicStringtoString(){

Stringtmp="

"

for(inti=0;

i<

=top;

i++){

tmp+=s[i];

returntmp;

}

(2)语法分析器类:

publicclassanlysis{

//分析表

privateStringtab[][]={{"

$"

"

+"

-"

*"

/"

("

)"

i"

#"

},

{"

E"

TG"

G"

+TG"

-TG"

ε"

T"

FS"

S"

*FS"

/FS"

F"

(E)"

}};

privateStringinput;

//input中存放输入的表达式

privateStringBuffertempBuffer;

//存放要输出的字符串

privateintptr,row,col,step;

//指针,预测表中的行,列,当前步骤

privatebooleansymbol;

privatestackstack;

publicanlysis(){

stack=newstack();

tempBuffer=newStringBuffer();

symbol=true;

input="

row=1;

ptr=0;

step=1;

//////////////////////////////////methods./////////////////////////////////

publicintcolumn(charc){//判断预测表中的列

switch(c){

case'

+'

:

return1;

-'

return2;

*'

return3;

/'

return4;

('

return5;

)'

return6;

i'

return7;

return8;

default:

return-1;

publicintline(charc){//判定预测表中的行

E'

G'

T'

S'

F'

publicvoidpri(Stringstr){

tempBuffer.append(String.format("

%-8d%-20s%-20s%-20s\r\n"

step,stack

.toString(),input.substring(ptr),str));

step++;

publicvoidanalyse(){

stack.push(tab[row][0]);

//预测表中的第一个元素‘E’

pri("

初始化"

);

Stringtmp;

charctmp;

//栈顶元素

while(!

(input.charAt(ptr)=='

&

&

stack.getTop()=='

)){

ctmp=stack.getTop();

if(input.charAt(ptr)==ctmp){//与栈顶元素比较

stack.pop();

ptr++;

pri("

+ctmp+"

匹配"

continue;

col=column(input.charAt(ptr));

if(col==-1){

symbol=false;

未定义的字符"

row=line(ctmp);

if(row==-1){

出错"

if(input.charAt(ptr)!

='

){

ptr++;

}

tmp=tab[row][col];

if(tmp.charAt(0)=='

$'

}elseif(tmp.charAt(0)=='

ε'

->

+'

}else{

stack.push(tmp);

+tmp);

publicStringwork(Stringts){

input=ts;

input=input.trim()+'

symbol=true;

stack.clear();

tempBuffer.append("

\r\n步骤分析栈剩余输入栈所用产生式\r\n"

analyse();

if(symbol){

tempBuffer.append("

\r是正确的符号串\r"

returntempBuffer.toString();

}else{

\r不是正确的符号串\r"

////////////////////////////////////getsandsets////////////////////////////////

publicStringBuffergetTempBuffer(){

returntempBuffer;

publicvoidsetTempBuffer(StringBuffertempBuffer){

this.tempBuffer=tempBuffer;

publicstackgetStack(){

returnstack;

publicvoidsetStack(stackstack){

this.stack=stack;

publicString[][]getTab(){

returntab;

publicvoidsetTab(String[][]tab){

this.tab=tab;

publicStringgetInput(){

returninput;

publicvoidsetInput(Stringns){

this.input=ns;

publicintgetPtr(){

returnptr;

publicvoidsetPtr(intptr){

this.ptr=ptr;

publicintgetRow(){

returnrow;

publicvoidsetRow(introw){

this.row=row;

publicintgetCol(){

returncol;

publicvoidsetCol(intcol){

this.col=col;

publicintgetStep(){

returnstep;

publicvoidsetStep(intstep){

this.step=step;

publicbooleanisBoo(){

returnsymbol;

publicvoidsetBoo(booleanboo){

this.symbol=boo;

(3)WINDOW窗体类:

importjava.awt.BorderLayout;

importjava.awt.GridLayout;

importjava.awt.Panel;

importjavax.swing.JFrame;

importjavax.swing.JScrollPane;

publicclassguiextendsjavax.swing.JFrame{

/**Createsnewformgui*/

privatejavax.swing.JButtonjButton1;

privatejavax.swing.JLabeljLabel1;

privatejavax.swing.JLabeljLabel2;

privatejavax.swing.JTextAreajTextArea1;

privatejavax.swing.JTextFieldjTextField1;

privatePanelp1=newPanel();

privatePanelp2=newPanel();

publicgui(){

initComponents();

privatevoidinitComponents(){

jLabel1=newjavax.swing.JLabel();

jTextField1=newjavax.swing.JTextField();

jLabel2=newjavax.swing.JLabel();

jTextArea1=newjavax.swing.JTextArea(20,30);

jButton1=newjavax.swing.JButton();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

jLabel1.setText("

本程序只能对由'

'

构成的以'

结尾的字符串进行分析。

请输入要翻译的表达式:

jLabel2.setText("

分析结果:

jButton1.setText("

分析"

jButton1.addActionListener(newjava.awt.event.ActionListener(){

publicvoidactionPerformed(java.awt.event.ActionEventevt){

jButton1ActionPerformed(evt);

});

finalGridLayoutgridLayout=newGridLayout(0,1);

//创建表格布局管理器

gridLayout.setVgap(0);

//设置组件之间垂直距离

gridLayout.setHgap(0);

//设置组件之间平行距离

p1.setLayout(gridLayout);

p1.add(jLabel1);

p1.add(jTextField1);

p2.add(jLabel2);

p2.add(newJScrollPane(jTextArea1));

getContentPane().add(p1,BorderLayout.NORTH);

getContentPane().add(p2,BorderLayout.CENTER);

getContentPane().add(jButton1,BorderLayout.SOUTH);

setSize(600,500);

setLocation(400,100);

setVisible(true);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

privatevoidjButton1ActionPerformed(java.awt.event.ActionEventevt){

anlysisans=newanlysis();

jTextArea1.setText(ans.work(jTextField1.getText()));

publicstaticvoidmain(Stringargs[]){

java.awt.EventQueue.invokeLater(newRunnable(){

publicvoidrun(){

newgui().setVisible(true);

五、实验结果

6、实验结果分析:

本次设计借助语法分析,设计一个表达式的判断分析器,从键盘上输入算术表达式,分析器对该表达式的正确与否进行分析。

若是正确的算术表达式,则符合文法,输出正确;

若是错误的算术表达式,则表达式不符合文法,输出其错误之处并显示异常。

该程序执行过程无误,输出结果正常。

但由于我们的疏忽,该程序未能完全满足实验要求,并不能够构造其LR分析表,并不是由该分析表驱动的语法分析器程序,这是本次实验的一个缺陷。

七、实验总结:

此次实验,让我对编译原理的基本知识有了深入的了解,加强了对语法分析的认识。

代码的编写过程中用到了一些以前从未用过的函数,都是现学现用,掌握还不是很深。

在代码调试过程中结果出现许多无法解释的错误,但仍旧坚持下来了,最终调试出了结果。

通过这次实验,我们的动手实践能力得到很大的提高。

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

当前位置:首页 > PPT模板 > 图表模板

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

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