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

来源:互联网 发布:油库软件系统开发 编辑:程序博客网 时间:2024/05/22 06:38


本帖完全原创

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

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

原理:算符优先分析算法

语言:Java




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() {@Overridepublic 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);}});}}




0 0
原创粉丝点击