本帖完全原创
若要查看 编译原理_简单优先分析方法_语法分析器_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);
}
});
}
}