语法分析器的设计大学论文Word格式.docx
- 文档编号:19711754
- 上传时间:2023-01-09
- 格式:DOCX
- 页数:13
- 大小:98.26KB
语法分析器的设计大学论文Word格式.docx
《语法分析器的设计大学论文Word格式.docx》由会员分享,可在线阅读,更多相关《语法分析器的设计大学论文Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
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文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语法 分析器 设计 大学 论文