📄 frame1.java~224~
字号:
package suanfuyouxian2;
import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JLabel;
import com.borland.jbcl.layout.XYLayout;
import com.borland.jbcl.layout.*;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
public class Frame1 extends JFrame {
//声明算符优先表===============================================================
char[][] table = {
{'>','>','<','<','<','>','<','>'},
{'>','>','<','<','<','>','<','>'},
{'>','>','>','>','<','>','<','>'},
{'>','>','>','>','<','>','<','>'},
{'<','<','<','<','<','=','<','-'},
{'>','>','>','>','-','>','-','>'},
{'>','>','>','>','-','>','-','>'},
{'<','<','<','<','<','-','<','='}
}; //优先关系表:八个字符分别是+-*/()i#,其中'-'表示出错
//声明文法
String[] wenfa = {"E+E","E-E","E*E","E/E","(E)","i"}; //文法右部
//--------------------------------------------------------
Stack chStack = new Stack(100);//声明符号栈
public StringTok[] st = new StringTok[100];
//===============================================================
JPanel contentPane;
JMenuBar jMenuBar1 = new JMenuBar();
JMenu jMenuFile = new JMenu();
JMenuItem jMenuFileExit = new JMenuItem();
JMenu jMenuHelp = new JMenu();
JMenuItem jMenuHelpAbout = new JMenuItem();
JLabel statusBar = new JLabel();
XYLayout xYLayout1 = new XYLayout();
JTextField jTextField1 = new JTextField();
JButton jButton1 = new JButton();
JScrollPane jScrollPane1 = new JScrollPane();
JTextArea jTextArea1 = new JTextArea();
public Frame1() {
try {
setDefaultCloseOperation(EXIT_ON_CLOSE);
jbInit();
} catch (Exception exception) {
exception.printStackTrace();
}
}
/**
* Component initialization.
*
* @throws java.lang.Exception
*/
//String input = jTextField1.getText();//取到输入的字符串
private void jbInit() throws Exception {
contentPane = (JPanel) getContentPane();
contentPane.setLayout(xYLayout1);
setSize(new Dimension(500, 500));
setTitle("Frame Title");
statusBar.setText(" ");
jMenuFile.setText("File");
jMenuFileExit.setText("Exit");
jMenuFileExit.addActionListener(new Frame1_jMenuFileExit_ActionAdapter(this));
jMenuHelp.setText("Help");
jMenuHelpAbout.setText("About");
jMenuHelpAbout.addActionListener(new
Frame1_jMenuHelpAbout_ActionAdapter(this));
contentPane.setBackground(SystemColor.controlShadow);
jButton1.setText("jButton1");
jButton1.addActionListener(new Frame1_jButton1_actionAdapter(this));
jScrollPane1.setHorizontalScrollBarPolicy(JScrollPane.
HORIZONTAL_SCROLLBAR_ALWAYS);
jScrollPane1.setVerticalScrollBarPolicy(JScrollPane.
VERTICAL_SCROLLBAR_ALWAYS);
jTextField1.setText("1+2+3#");
jMenuBar1.add(jMenuFile);
jMenuFile.add(jMenuFileExit);
jMenuBar1.add(jMenuHelp);
jMenuHelp.add(jMenuHelpAbout);
setJMenuBar(jMenuBar1);
contentPane.add(statusBar, new XYConstraints(0, 286, 400, -1));
contentPane.add(jTextField1, new XYConstraints(59, 36, 154, 36));
contentPane.add(jScrollPane1, new XYConstraints(51, 168, 373, 257));
contentPane.add(jButton1, new XYConstraints(251, 36, -1, 36));
jScrollPane1.getViewport().add(jTextArea1);
}
/**
* File | Exit action performed.
*
* @param actionEvent ActionEvent
*/
void jMenuFileExit_actionPerformed(ActionEvent actionEvent) {
System.exit(0);
}
/**
* Help | About action performed.
*
* @param actionEvent ActionEvent
*/
void jMenuHelpAbout_actionPerformed(ActionEvent actionEvent) {
Frame1_AboutBox dlg = new Frame1_AboutBox(this);
Dimension dlgSize = dlg.getPreferredSize();
Dimension frmSize = getSize();
Point loc = getLocation();
dlg.setLocation((frmSize.width - dlgSize.width) / 2 + loc.x,
(frmSize.height - dlgSize.height) / 2 + loc.y);
dlg.setModal(true);
dlg.pack();
dlg.setVisible(true);
}
public void jButton1_actionPerformed(ActionEvent actionEvent) {
//StringBuffer chStack = new StringBuffer();
int sNo=0;
int sNo1 =0;
String input = jTextField1.getText();
StringTok[] token = new StringTok[input.length()];
//=======将输入的字符串转换为字符========================================================
for (int i = 0; i < input.length(); i++) {
char ch = input.charAt(i);
if (Character.isDigit(ch)) {
token[i] = new StringTok(ch,6);
} else {
switch (ch) {
case '#': {
token[i] = new StringTok('#',7);
break;
}
case '+': {
token[i] = new StringTok('+',0);
break;
}
case '-': {
token[i] = new StringTok('-',1);
break;
}
case '*': {
token[i] = new StringTok('*',2);
break;
}
case '/': {
token[i] = new StringTok('/',3);
break;
}
case '(': {
token[i] = new StringTok('(',4);
break;
}
case ')': {
token[i] = new StringTok(')',5);
break;
}
}
}
}
StringBuffer guiyue = new StringBuffer();//规约串
StringBuffer in = new StringBuffer();//符号栈中的字符串
StringBuffer inStack = new StringBuffer(input);//输入串中的字符
Stack chS = new Stack(input.length()+1);//声明符号栈
chS.push('#');
//char cpop = '';
//测试
for (int i = 0; i < token.length; i++) {
System.out.println(token[i].ch +" "+ token[i].no);
}
jTextArea1.append("符号栈\t输入串\t动作\n");
in.append("#");
jTextArea1.append(in.toString() +"\t" +input + "\t" + "预备\n");
//=================开始分析 1+2+3==================================
for (int i = 0; i < token.length; i++) {
char a = token[i].ch;//把下一个字符读入a中
System.out.println("char " + a);//tes
System.out.println("zzz"+chS.peek());//test
if (Character.isUpperCase(chS.peek()))//取符号栈的终结符
{
char cpop = chS.pop();
guiyue.append(cpop);
System.out.println("111111111"+guiyue.toString());
}
else
{
//guiyue.append(a);
}
for (int n = 0; n < token.length; n++) {
if(token[n].ch == chS.peek())
{sNo = token[n].no;System.out.println(sNo+"\t"+token[i].no);}
}//找到与符号栈栈顶字符 相匹配的分析表中的位置
if (table[sNo][token[i].no] == '<' || table[sNo][token[i].no] == '=')//move in
{
// System.out.println("yijin "+chS.peek());
//in.append(chS.peek());
char cin = inStack.charAt(0);
chS.push(cin);//压栈
in.append(cin);
inStack.deleteCharAt(0);
jTextArea1.append(in.toString()+"\t"+inStack.toString()+
"\t"+"移进"+cin+"\n");
guiyue = new StringBuffer();
}
else if (table[sNo][token[i].no] == '>')//==算法========================
{
i--;
do{
char c = chS.pop();//取到符号栈的栈顶
System.out.println("222222222"+c);//test
char t = chS.peek();
// System.out.println("33333333333"+t);//
System.out.println("==========="+t);
if (Character.isUpperCase(t))//取终结符=== buzhixing =================
{
System.out.println("afdsfsdfdsfds====");
guiyue.append(c);
char t1 = chS.pop();
guiyue.append(t1);
in.deleteCharAt(0);
System.out.println("afdsfsdfdsfds===="+guiyue);
}
else
{
//c = chS.pop();
//in.deleteCharAt(in.length());
guiyue.append(c);//规约一个字符
//guiyue.append('E');
}
for (int n = 0; n < token.length; n++) {
if(token[n].ch == c)
{ sNo1 = token[n].no;System.out.println(sNo1+" "+token[i].no);}
} //找到与符号栈栈顶字符 相匹配的分析表中的位置
}
while(table[sNo1][token[i].no] == '<');//*/
//guiyue.append(chS.pop());
System.out.println("guiyue "+ guiyue.toString());//test
//如何进行规约!!!!!!!!!!!!!!!!!
//in.deleteCharAt));
if(guiyue.length()==1)
{
in.deleteCharAt(in.length()-1);
in = in.append('E');
System.out.println("压栈=============");
chS.push('E');
}
else if(guiyue.length() == 3)//=====================
{
System.out.println("test guiyue E+E");
in = in.delete(in.length()-4,in.length()-1);
in = in.append('E');
chS.push('E');
// guiyue = new StringBuffer();
}
else
{
System.out.println("没有可规约的串!!!");
}
jTextArea1.append(in.toString()+"\t"+inStack.toString()+"\t"+"规约"+guiyue.toString()+"\n");
guiyue = new StringBuffer();//清空规约串
//输出规约串guiyue.append()
//如何进行规约
//chStack = chStack.delete(j+1,k);
// chStack.append('E');
}
else if(in.toString() == "#E" && token[i].ch == '#')
{
System.out.println("success!!!");
break;
}
}
}
}
class Frame1_jButton1_actionAdapter implements ActionListener {
private Frame1 adaptee;
Frame1_jButton1_actionAdapter(Frame1 adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent actionEvent) {
adaptee.jButton1_actionPerformed(actionEvent);
}
}
class Frame1_jMenuFileExit_ActionAdapter implements ActionListener {
Frame1 adaptee;
Frame1_jMenuFileExit_ActionAdapter(Frame1 adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent actionEvent) {
adaptee.jMenuFileExit_actionPerformed(actionEvent);
}
}
class Frame1_jMenuHelpAbout_ActionAdapter implements ActionListener {
Frame1 adaptee;
Frame1_jMenuHelpAbout_ActionAdapter(Frame1 adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent actionEvent) {
adaptee.jMenuHelpAbout_actionPerformed(actionEvent);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -