📄 cmm.java
字号:
/*
* Cmm.java
*
* Created on 2007年10月4日, 下午6:39
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package cmm;
import java.awt.*;
import java.util.Collection;
import java.util.Iterator;
import java.util.StringTokenizer;
import javax.swing.*;
import java.io.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.util.Stack;
import java.util.LinkedList;
import java.util.TreeMap;
/**
*
* @author lx
*/
enum Attribute{
ID,Value,
}
public class Cmm extends JFrame implements ActionListener{
//定义变量
private TextArea input = new TextArea();
private JButton open = new JButton("打开文件");
private JButton clean = new JButton("清空");
private JButton analyse = new JButton("分析");
private JFileChooser fileChooser= new JFileChooser();
TextArea output = new TextArea();
private int start,done,note,bracket,error,num,id,keyWord;
private int state1=0;
private boolean goon=true;
private int col=1;
private int pos =0;
private int inputSize=0;
private String inPut;
private boolean finish=false;
private int begin ,end;
private String currentToken;
private boolean decimal=false;
private boolean once=true;
private boolean back=false;
private String[] line;
private boolean frist=true;
private LinkedList tokens,ID;
private boolean errorA =false;
private TreeMap tree;
private Analyse ana;
/** Creates a new instance of Cmm */
public Cmm() {
tokens = new LinkedList();
ID = new LinkedList();
initial();
setLayout(null);
setSize(600,500);
setTitle("CMM");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocation((Toolkit.getDefaultToolkit().getScreenSize().width-getSize().width)/2,(Toolkit.getDefaultToolkit().getScreenSize().height-getSize().height)/2);
setVisible(true);
}
//初始化界面
public void initial(){
//输入文本框
input.setEditable(true);
input.setBounds(10,10,480,230);
//打开文件按钮
open.setBounds(490,50,100,30);
open.addActionListener(this);
open.setActionCommand("open");
//清空按钮
clean.setBounds(490,100,100,30);
clean.setActionCommand("clean");
clean.addActionListener(this);
//分析按钮
analyse.setBounds(490,150,100,30);
analyse.setActionCommand("analyse");
analyse.addActionListener(this);
//输出
output.setBounds(10,260,500,130);
output.setEditable(false);
//文件读入
BFileFilter filter = new BFileFilter();
filter.addExtension("cmm");
fileChooser.setFileFilter(filter);
fileChooser.setAcceptAllFileFilterUsed(false);
//添加组键
this.add(clean);
this.add(open);
this.add(input);
this.add(output);
this.add(analyse);
inPut ="";
start=0;
done=1;
note=2;
bracket=3;
error=4;
num=5;
id=6;
keyWord=7;
}
private Character getNext(){
try{
if(col==1&&frist){
output.setText("第"+col+ "行:"+line[0]);
frist=false;
}
if(pos<inputSize-1){
return inPut.charAt(pos++);
}else if (pos==inputSize-1){
finish=true;
return inPut.charAt(pos++);
}else{
return null;
}
}catch(Exception e){
return null;
}
}
//分析方法
private void read() {
ID.clear ();
tokens.clear ();
if(input.getText().equalsIgnoreCase("")){
output.setText("输入为空");
}else{
inPut = input.getText();
BufferedReader bufferedreader = new BufferedReader(new StringReader(inPut));
int i=1;
try{
for (String s1 = bufferedreader.readLine(); s1 != null; s1 = bufferedreader.readLine()) {
i++;
}
BufferedReader bufferedreader2 = new BufferedReader(new StringReader(inPut));
line= new String[i];
int j=0;
for (String s1 = bufferedreader2.readLine(); s1 != null; s1 = bufferedreader2.readLine()) {
line[j]=s1;
j++;
}
}catch(Exception e){
}
inputSize =inPut.length();
output.setText("");
pos=0;
finish=false;
begin =0;
end=0;
decimal=false;
col=1;
once=true;
frist=true;
while(!finish){
analyse();
}
if(!errorA){
ana = new Analyse(tokens,ID,this);
ana.an ();
}
}
}
private void isKW(String to){
if(to.equalsIgnoreCase("real")||to.equalsIgnoreCase("int")||to.equalsIgnoreCase("Write")||to.equalsIgnoreCase("If")||to.equalsIgnoreCase("Else")||to.equalsIgnoreCase("Read")||to.equalsIgnoreCase("while")){
tokens.offer(currentToken);
ID.offer("KW");
output.append("\n"+"保留字: "+currentToken);
}else {
tokens.offer (currentToken);
ID.offer ("ID");
output.append("\n"+"标示符: "+currentToken);
}
}
private void backup(){
pos--;
finish=false;
}
private void analyse(){
int state=start;
begin=pos;
while(state!=done){
char a =getNext();
switch (state) {
case 0:
if(a=='+'){
tokens.offer(a);
ID.offer("Com");
output.append("\n"+"特殊符号: +");
state=done;
}else if(a=='-'){
tokens.offer(a);
ID.offer("Com");
output.append("\n"+"特殊符号: -");
state=done;
}else if(a=='*'){
tokens.offer(a);
ID.offer("Com");
output.append("\n"+"特殊符号: *");
state=done;
}else if(a=='('){
tokens.offer(a);
ID.offer("Com");
output.append("\n"+"特殊符号: (");
state=done;
}else if(a==')'){
tokens.offer(a);
ID.offer("Com");
output.append("\n"+"特殊符号: )");
state=done;
}else if(a=='['){
tokens.offer(a);
ID.offer("FG");
output.append("\n"+"特殊符号: [");
state=done;
}else if(a=='{'){
tokens.offer(a);
ID.offer("FG");
output.append("\n"+"特殊符号: {");
state=done;
}else if(a=='}'){
tokens.offer(a);
ID.offer("FG");
output.append("\n"+"特殊符号: }");
state=done;
}else if(a==']'){
tokens.offer(a);
ID.offer("FG");
output.append("\n"+"特殊符号: ]");
state=done;
}else if(a=='\n'){
tokens.offer(a);
ID.offer("NL");
col++;
output.append("\n"+"第"+col+"行:"+line[col-1]);
state=done;
}else if(a=='\r'){
state=done;
}else if(a==' '){
state=done;
}else if(a==';'){
tokens.offer(a);
ID.offer("FG");
output.append("\n"+"特殊符号: ;");
state=done;
}else if (a=='/'){
if(finish){
tokens.offer(a);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -