编译原理_算符优先分析方法_语法分析器_java

 

本帖完全原创

若要查看 编译原理_简单优先分析方法_语法分析器_java ,请移步http://blog.csdn.net/qq_24065713/article/details/70664835

 

根据《编译原理》何炎祥第三版第六章语法分析器实现

原理:算符优先分析算法

语言:Java

 

效果图:(丢失,类似于效果图:http://blog.csdn.net/qq_24065713/article/details/70664835

 

 

package 算符优先算法;

public class Test {

	public static void main(String[] args) {
		new Version();

	}
}
package 算符优先算法;

public class MainMethond {
	
	public String jieguo ="";
	public String inputStream ="";
	public String relation ="";
	public String outputStremm ="";
	public String left ="";
	public String s="";
	public int i=1;
	
	public boolean accept(StringBuffer s1,StringBuffer s2) {
		boolean result;
		outer:
			while (true) {
				char c1=findEndVn(s1);//S栈中最后一位终结符
				char c2=findLBOVn(s1);//S栈中倒数第二位终结符
				char c3=s2.charAt(0);
				
				if(c1=='$'&&c3=='$'){
					result =true;
					jieguo="OK";
					break outer;
				}
				
				switch (c1) {
				case '$':
					s1.append(c3);
					s2.deleteCharAt(0);
					
					s=s+(i++)+"\n";
					inputStream =inputStream+ s1+"\n";
					relation =relation+ "<"+"\n";
					outputStremm =outputStremm+ s2+"\n";
					left =left+ " "+"\n";
					break;
					
					
				case '(':
					if(compare(c1, c3)==-1){
						s1.append(c3);
						s2.deleteCharAt(0);
						
						s=s+(i++)+"\n";	
						inputStream = inputStream+s1+"\n";
						relation =relation+ "<"+"\n";
						outputStremm =outputStremm+ s2+"\n";
						left = left+" "+"\n";

						
					}
					else if(compare(c1, c3)==0){
						s1.append(c3);
						s2.deleteCharAt(0);
						
						s=s+(i++)+"\n";
						inputStream = inputStream+s1+"\n";
						relation = relation+"="+"\n";
						outputStremm = outputStremm+s2+"\n";
						left = left+" "+"\n";
						
					}else {
						result =false;
						jieguo="(无法比较";
						break outer;
					}
					break;
					
				case 'i':
					if(compare(c1, c3)==1){
						s1.deleteCharAt(s1.length()-1);
						s1.append('V');
						
						s=s+(i++)+"\n";
						inputStream =inputStream+ s1+"\n";
						relation =relation+ ">"+"\n";
						outputStremm = outputStremm+s2+"\n";
						left = left+"i"+"\n";
						
					}
					else {
						result =false;
						jieguo="i无法比较";
						break outer;
					}
					break;
				
				case '+':
					if(compare(c1, c3)==-1){
						s1.append(c3);
						s2.deleteCharAt(0);
						
						s=s+(i+1)+"\n";
						inputStream = inputStream+s1+"\n";
						relation = relation+"<"+"\n";
						outputStremm = outputStremm+s2+"\n";
						left =left+ " "+"\n";
												
					}
					else if(compare(c1, c3)==1){
						if(compare(c2, c1)==-1){
							s1.deleteCharAt(s1.length()-1);
							s1.deleteCharAt(s1.length()-1);
							s1.deleteCharAt(s1.length()-1);
							s1.append('V');
							
							s=s+(i++)+"\n";
							inputStream = inputStream+s1+"\n";
							relation =relation+ ">"+"\n";
							outputStremm = outputStremm+s2+"\n";
							left =left+ "V+V"+"\n";
							
						}else {
							result =false;
							break outer;
						}					
					}
					else {
						result =false;
						break outer;
					}
					break;	
					
					case ')':
						if(compare(c1, c3)==1){
							if(compare(c2, c1)==0){
								s1.deleteCharAt(s1.length()-1);
								s1.deleteCharAt(s1.length()-1);
								s1.deleteCharAt(s1.length()-1);
								s1.append('V');
								
								s=s+(i+1)+"\n";
								inputStream =inputStream+ s1+"\n";
								relation =relation+ ">"+"\n";
								outputStremm =outputStremm+ s2+"\n";
								left = left+"(V)"+"\n";
								
							}else {
								result =false;
								break outer;
							}					
						}
						else {
							result =false;
							break outer;
						}
						break;	
					
					case '*':	
						if(compare(c1, c3)==-1){
							s1.append(c3);
							s2.deleteCharAt(0);
							
							s=s+(i+1)+"\n";
							inputStream = inputStream+s1+"\n";
							relation = relation+"<"+"\n";
							outputStremm =outputStremm+ s2+"\n";
							left = left+" "+"\n";
							
						}
						else if(compare(c1, c3)==1){
							if(compare(c2, c1)==-1){
								s1.deleteCharAt(s1.length()-1);
								s1.deleteCharAt(s1.length()-1);
								s1.deleteCharAt(s1.length()-1);
								s1.append('V');
								
								s=s+(i+1)+"\n";
								inputStream =inputStream+ s1+"\n";
								relation = relation+">"+"\n";
								outputStremm = outputStremm+s2+"\n";
								left = left+"V*V"+"\n";
								
							}else {
								result =false;
								break outer;
							}					
						}
						else {
							result =false;
							break outer;
						}
						break;

				default:
					
					result =false;
					jieguo = "字符不合乎要求";
					break outer;
				}
			}
			
		return result;
	}
	
	//找到StringBuffer最后一位终结符
	public char findEndVn(StringBuffer stringBuffer) {
		char c='~';//任意
		int i=1;
		outer:
			while(true){
				while(stringBuffer.charAt(stringBuffer.length()-i)!='V'){
					c= stringBuffer.charAt(stringBuffer.length()-i);
					break outer;
					
				}
				i++;
			}
		return c;
	}
	
	//找到倒数第二位(Last But One)终结符
	public char findLBOVn(StringBuffer stringBuffer) {
		char c='~';//任意
		int i=1;
		int flag=0;
		outer:
			while(true){
				while(stringBuffer.charAt(stringBuffer.length()-i)!='V'){
					flag++;
					if(flag>=2){
						c= stringBuffer.charAt(stringBuffer.length()-i);
						break outer;
					}
					i++;
				}
				i++;
			}
		return c;
	}

	public int compare(char a,char b){
		int i=10;
		if(b=='$') i=1;
		
		else if(a=='+'){
			if(b=='+'||b==')') i=1;
			else if(b=='*'||b=='i'||b=='(') i=-1;
		}
		else if (a=='*') {
			if(b=='+'||b=='*'||b==')') i=1;
			else if(b=='i'||b=='(') i=-1;
			
		}
		else if (a=='i') {
			if(b=='+'||b=='*'||b==')') i=1;			
		}
		else if (a=='(') {
			if(b=='+'||b=='*'||b=='i'||b=='(') i=-1;
			else if (b==')') i=0;			
		}
		else if (a==')') {
			if(b=='+'||b=='*'||b==')') i=1;
		}
		else if (a=='$') {
			i=-1;
		}
		return i;		
	}
	
}
package 算符优先算法;

import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Version {
	
	public Version() {

		 JFrame jFrame = new JFrame("算符优先分析算法");
	        JPanel jPanel = new JPanel();
	        JButton jButton = new JButton("开始分析");
	        TextArea textArea = new TextArea();
	        TextArea textArea1 = new TextArea();
	        TextArea textArea2 = new TextArea();
	        TextArea textArea3 = new TextArea();
	        TextArea textArea4 = new TextArea();
	        TextArea textArea5= new TextArea();
	        JTextField jTextField1 = new JTextField("待输入文法");
	        JTextField jTextField2 = new JFormattedTextField("     ");

	        jFrame.setVisible(true);
	        jFrame.addWindowListener(new WindowAdapter() {
	            public void windowClosing(WindowEvent e) {
	                System.exit(0);
	            }
	        });
	        jFrame.setLayout(null);
	        jPanel.setLayout(null);
	        jFrame.setBounds(50, 50, 400, 600);
	        jPanel.setBounds(0, 0, 400, 600);
	        textArea.setBounds(0, 100, 400, 200);
	        
	        textArea1.setBounds(0, 300, 50, 300);
	        
	        textArea2.setBounds(50, 300, 100, 300);
	        textArea3.setBounds(150, 300, 50, 300);
	        textArea4.setBounds(200, 300, 100, 300);
	        textArea5.setBounds(300, 300, 100, 300);

	        jTextField1.setBounds(25, 50, 100, 30);
	        jButton.setBounds(150, 50, 100, 30);
	        jTextField2.setBounds(275, 50, 100, 30);
	        textArea.setText(" | +  *  i  (  )\n" +
	                "----------------------------------------\n" +
	                "+| >  <  <  <  >\n" +
	                "*| >  >  <  <  >\n" +
	                "i| >  >        >\n" +
	                "(| <  <  <  <  =\n" +
	                ")| >  >        >\n" );
	        jFrame.add(jPanel);
	        jPanel.add(jTextField1);
	        jPanel.add(jButton);
	        jPanel.add(jTextField2);
	        jPanel.add(textArea);
	        
	        jPanel.add(textArea1);
	        jPanel.add(textArea2);
	        jPanel.add(textArea3);
	        jPanel.add(textArea4);
	        jPanel.add(textArea5);
	        
	        jButton.addActionListener(new ActionListener() {
				
				@Override
				public void actionPerformed(ActionEvent e) {
					StringBuffer stringBuffer1=new StringBuffer(" $");
					StringBuffer stringBuffer2=new StringBuffer(jTextField1.getText());
					MainMethond mainMethond = new MainMethond();
					mainMethond.accept(stringBuffer1, stringBuffer2);
					jTextField2.setText(mainMethond.jieguo);
					textArea1.setText(mainMethond.s);
					textArea2.setText(mainMethond.inputStream);
					textArea3.setText(mainMethond.relation);
					textArea4.setText(mainMethond.outputStremm);
					textArea5.setText(mainMethond.left);
					
				}
			});
		
		
		
	}

}

 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值