编译原理_算符优先分析方法_语法分析器_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
- 编译原理_算符优先分析方法_语法分析器_java
- 编译原理_简单优先文法_语法分析器_Java
- 编译原理之算符优先分析语法程序
- 编译原理--语法分析器
- 编译原理 语法分析器
- 【编译原理】语法分析器
- 编译原理语法分析器
- 编译原理_词法分析
- 编译原理_词法分析
- 编译原理 之 语法分析器(自上而下分析法)
- 编译原理-语法分析器-总结
- 编译原理c++语法分析器
- 05_Java基础语法_第5天(方法)
- 编译原理算符优先分析算法
- 编译原理_词法分析部分
- 编译原理_预测分析法
- 编译原理_PL/0_词法分析
- 编译原理_词法分析程序设计
- 使用Mybatis-Generator的三种常用方式
- 算法结构与设计基础作业第十一周
- ThreadLocal
- Linux下Redis的安装与配置
- 配置一下自己的vim
- 编译原理_算符优先分析方法_语法分析器_java
- Lua基础(1)--初识lua
- 用zepto去写微场景
- 输入一行字符,统计处其中英文字母、空格、数字和其他字符的个数
- 基于proteus的51单片机仿真实例四十三、C语言的字符串数组演示实例
- 0507 #2 NYIST 括号配对问题
- VMware虚拟机克隆Linux系统后找不到eth0网卡
- node.js中使用exports
- 常用排序算法-归并排序