📄 jcomplier.java
字号:
/**编译原理作业 //程序注释说明
*词法分析的带界面程序
*JComplier.java
*@author 王利航(20054478)
*@author 2007.5
*@version 1.0
*/
import javax.swing.*; //程序所需包
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.regex.*;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.io.*;
class frame extends JFrame implements ActionListener , ItemListener //窗体
{
private JMenuBar menubar; //声明组件
private JMenu[] menu=new JMenu[8];
private JMenuItem[] menuitem=new JMenuItem[16];
private JCheckBoxMenuItem[] style=new JCheckBoxMenuItem[2];
private String[] stylenames={"Bold","Italic"};
private JRadioButtonMenuItem[] size=new JRadioButtonMenuItem[3];
private String[] sizenames={"12","16","20"};
private ButtonGroup sizebuttongroup=new ButtonGroup();
private Font area1Font;
private JTextArea area1,area2;
private JScrollPane s1,s2;
private JLabel l1,l2;
private JPanel p1,p2;
private JFileChooser fileChooser;
String as;
public frame() //窗体构造函数
{
super("JComplier"); //初始化窗体
setSize(1282,999);
setLocation(0,0);
setVisible(true);
menubar=new JMenuBar(); //创建菜单相关对象
menu[0]=new JMenu("文件(F)");
menu[0].setMnemonic(KeyEvent.VK_F);
menu[1]=new JMenu("编辑(E)");
menu[1].setMnemonic(KeyEvent.VK_E);
menu[2]=new JMenu("格式(O)");
menu[2].setMnemonic(KeyEvent.VK_O);
menu[3]=new JMenu("生成(B)");
menu[3].setMnemonic(KeyEvent.VK_B);
menu[4]=new JMenu("帮助(H)");
menu[4].setMnemonic(KeyEvent.VK_H);
menu[6]=new JMenu("风格");
menu[6].setMnemonic(KeyEvent.VK_S);
menu[7]=new JMenu("字号");
menu[7].setMnemonic(KeyEvent.VK_Z);
menuitem[0]=new JMenuItem("新建");
menuitem[0].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,InputEvent.CTRL_MASK));
menuitem[1]=new JMenuItem("打开");
menuitem[1].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,InputEvent.CTRL_MASK));
menuitem[2]=new JMenuItem("保存");
menuitem[2].setEnabled(false);
menuitem[2].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK));
menuitem[3]=new JMenuItem("另存");
menuitem[4]=new JMenuItem("退出");
menuitem[5]=new JMenuItem("剪切");
menuitem[5].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,InputEvent.CTRL_MASK));
menuitem[6]=new JMenuItem("复制");
menuitem[6].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK));
menuitem[7]=new JMenuItem("粘贴");
menuitem[7].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,InputEvent.CTRL_MASK));
menuitem[8]=new JMenuItem("删除");
menuitem[9]=new JMenuItem("全选");
menuitem[9].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A,InputEvent.CTRL_MASK));
menuitem[10]=new JMenuItem("自动换行");
menu[5]=new JMenu("字体");
menuitem[11]=new JMenuItem("词法分析");
menuitem[12]=new JMenuItem("语法分析");
menuitem[13]=new JMenuItem("语义分析");
menuitem[14]=new JMenuItem("关于JComplier");
menuitem[15]=new JMenuItem("作者信息");
for(int i=0;i<style.length;i++)
{
style[i]=new JCheckBoxMenuItem(stylenames[i]);
style[i].addItemListener(this);
menu[6].add(style[i]);
}
for(int i=0;i<size.length;i++)
{
size[i]=new JRadioButtonMenuItem(sizenames[i]);
menu[7].add(size[i]);
sizebuttongroup.add(size[i]);
size[i].addActionListener(this);
}
for(int i=0;i<menuitem.length;i++) //为菜单项添加监听器
menuitem[i].addActionListener(this);
fileChooser=new JFileChooser(); //创建文件选择器对象
area1=new JTextArea(20,20); //创建文本域对象
area1Font=area1.getFont();
area2=new JTextArea(20,20);
area2.setEditable(false);
l1=new JLabel("编辑区:"); //创建标签对象
l2=new JLabel("输出:");
s1=new JScrollPane(area1,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
s1.setBorder(new TitledBorder("EditField:"));
s2=new JScrollPane(area2,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
s2.setBorder(new TitledBorder("Console:"));
p1=new JPanel(); //创建面板对象
p1.setLayout(new BorderLayout());
p1.add(l1,BorderLayout.NORTH);
p1.add(s1,BorderLayout.CENTER);
p2=new JPanel();
p2.setLayout(new BorderLayout());
p2.add(l2,BorderLayout.NORTH);
p2.add(s2,BorderLayout.CENTER);
getContentPane().add(p1,BorderLayout.CENTER); //把s1,s2添加到内容窗格中
getContentPane().add(p2,BorderLayout.SOUTH);
menu[5].add(menu[6]);
menu[5].add(menu[7]);
for(int i=0;i<5;i++) //把菜单项添加到相应的菜单中
menu[0].add(menuitem[i]);
for(int i=5;i<10;i++)
menu[1].add(menuitem[i]);
menu[2].add(menuitem[10]);
menu[2].add(menu[5]);
menu[3].add(menuitem[11]);
menu[3].add(menuitem[12]);
menu[3].add(menuitem[13]);
menu[4].add(menuitem[14]);
menu[4].add(menuitem[15]);
for(int i=0;i<5;i++) //把菜单添加到菜单条中
menubar.add(menu[i]);
setJMenuBar(menubar); //设置菜单条
validate();
setDefaultCloseOperation(EXIT_ON_CLOSE);
//for(int i=1;i<=area1.getLineCount();i++)
//{
// area1.setText(String.valueOf(i));
// System.out.println();
//}
}
public void cifafenxi() //词法分析
{
as=area1.getText(); //获得文本区字符串
Pattern patk=Pattern.compile("[\n\t\r ]+"); //把,两边替换为"空格,空格"的形式
Matcher matk=patk.matcher(as);
as=matk.replaceAll(" ");
//Pattern patz=Pattern.compile(" \\* ");
//Matcher matz=patz.matcher(as);
//as=matz.replaceAll("");
Pattern patd=Pattern.compile(" *, *"); //把,两边替换为"空格,空格"的形式
Matcher matd=patd.matcher(as);
as=matd.replaceAll(" , ");
Pattern patf=Pattern.compile(" *; *"); //把;两边替换为"空格;空格"的形式
Matcher matf=patf.matcher(as);
as=matf.replaceAll(" ; ");
Pattern patj=Pattern.compile(" *\\. *"); //替换.(句号,只能替换方法调用)
Matcher matj=patj.matcher(as);
as=matj.replaceAll(" . ");
Pattern patzx=Pattern.compile(" *\\( *"); //把(两边替换为"空格(空格"的形式
Matcher matzx=patzx.matcher(as);
as=matzx.replaceAll(" ( ");
Pattern patyx=Pattern.compile(" *\\) *"); //替换)
Matcher matyx=patyx.matcher(as);
as=matyx.replaceAll(" ) ");
Pattern patzz=Pattern.compile(" *\\[ *"); //替换[
Matcher matzz=patzz.matcher(as);
as=matzz.replaceAll(" [ ");
Pattern patyz=Pattern.compile(" *\\] *"); //替换]
Matcher matyz=patyz.matcher(as);
as=matyz.replaceAll(" ] ");
Pattern patzd=Pattern.compile(" *\\{ *"); //替换{
Matcher matzd=patzd.matcher(as);
as=matzd.replaceAll(" { ");
Pattern patyd=Pattern.compile(" *\\} *"); //替换}
Matcher matyd=patyd.matcher(as);
as=matyd.replaceAll(" } ");
Pattern patdh=Pattern.compile(" *\\= *");
Matcher matdh=patdh.matcher(as);
as=matdh.replaceAll(" = ");
Pattern patja=Pattern.compile(" *\\+ *");
Matcher matja=patja.matcher(as);
as=matja.replaceAll(" + ");
Pattern patjad=Pattern.compile(" *\\+ *\\= ");
Matcher matjad=patjad.matcher(as);
as=matjad.replaceAll(" += ");
Pattern patjj=Pattern.compile(" *\\+ *\\+ ");
Matcher matjj=patjj.matcher(as);
as=matjj.replaceAll(" ++ ");
Pattern patji=Pattern.compile(" *\\- *");
Matcher matji=patji.matcher(as);
as=matji.replaceAll(" - ");
Pattern patjid=Pattern.compile(" *\\- *\\= ");
Matcher matjid=patjid.matcher(as);
as=matjid.replaceAll(" -= ");
Pattern patjji=Pattern.compile(" *\\- *\\- ");
Matcher matjji=patjji.matcher(as);
as=matjji.replaceAll(" -- ");
Pattern patc=Pattern.compile(" *\\* *");
Matcher matc=patc.matcher(as);
as=matc.replaceAll(" * ");
Pattern patcd=Pattern.compile(" *\\* *\\= ");
Matcher matcd=patcd.matcher(as);
as=matcd.replaceAll(" *= ");
Pattern patch=Pattern.compile(" *\\/ *");
Matcher match=patch.matcher(as);
as=match.replaceAll(" / ");
Pattern patchd=Pattern.compile(" *\\/ *\\= ");
Matcher matchd=patchd.matcher(as);
as=matchd.replaceAll(" /= ");
Pattern patx=Pattern.compile(" *< *");
Matcher matx=patx.matcher(as);
as=matx.replaceAll(" < ");
Pattern patxd=Pattern.compile(" *< *\\= ");
Matcher matxd=patxd.matcher(as);
as=matxd.replaceAll(" <= ");
Pattern patdy=Pattern.compile(" *> *");
Matcher matdy=patdy.matcher(as);
as=matdy.replaceAll(" > ");
Pattern patdd=Pattern.compile(" *> *\\= ");
Matcher matdd=patdd.matcher(as);
as=matdd.replaceAll(" >= ");
//Pattern patzs=Pattern.compile(" \\/ *\\* *\\* *\\/");
//Matcher matzs=patzs.matcher(as);
//as=matzs.replaceAll(" ");
Pattern pat=Pattern.compile(" "); //用空格做为分隔
String dancixulie[]=pat.split(as); //用dancixulie[]存放单词序列
panduan p=new panduan();
String[] biaoti={"单词序列","类型"}; //存放表格标题
String[][] neirong=new String[dancixulie.length][2]; //存放表格内容
for(int j=0;j<dancixulie.length;j++)
{
neirong[j][0]=dancixulie[j];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -