⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cifa.java

📁 编译原理的词法分析程序 是用java编的
💻 JAVA
字号:
import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.io.*;public class Lexical extends JFrame{	private JTextField path;	private JButton selectButton, displayButton;	private JTextArea output;	private OpenFile open = new OpenFile(this);	private File file;	private Container container = getContentPane();	private BufferRead reader;	private char c;	private String descrip;	private boolean finish;		private String table[] = {			"", "ID", "NUM", "if", "then", "else", "program", "begin", "end", "+", "-", "*", 			"/", "(", ")", ">", ">=", "<", "<=", "<>", ":=", ";", ".", ","	};		public Lexical(){		super("Lexical");		path = new JTextField(30);		path.setEditable(false);		selectButton = new JButton("Select File");		selectButton.addActionListener(			new ActionListener(){				public void actionPerformed(ActionEvent event){					if((file = open.open()) != null){						displayButton.setEnabled(true);						path.setText(file.toString());					}				}			}		);		displayButton = new JButton("Display");		displayButton.setEnabled(false);		displayButton.addActionListener(			new ActionListener(){				public void actionPerformed(ActionEvent event){					reader = new BufferRead(file);					output.setText("");					finish = false;						analyze();								}			}		);				output = new JTextArea(33,50);		container.setLayout(new FlowLayout());		container.add(path);		container.add(selectButton);		container.add(displayButton);		container.add(new JScrollPane(output));				setSize(600, 650);		setVisible(true);		setResizable(false);		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 		setLocation((int)(screenSize.getWidth()/5),				(int)(screenSize.getHeight()/11));			this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);			}		String nexttoken(){		int state = 0;		String token = new String("");		boolean point = false;		while(true){			switch(state){			case 0:				c = reader.getNextChar();				if(c == ' ' || c == '\t' || c == '\n') continue;				token = token.concat((new Character(c)).toString());				if(c == '\0'){					descrip = new String("FINISH");					finish = true;					return new String("NULL");				}else if(Character.isLetter(c)) state = 1;				else if(Character.isDigit(c)) state = 2;				else if(c == '+' || c == '-' || c == '*' || c == '/' ||						 c == '(' || c == ';' || c == ',') state = 3;					else if(c == ')') state = 4;				else if(c == '.') state = 99;				else if(c == '>' || c == '<') state = 5;								else if(c == ':') state = 6;											else state = 99;				break;				case 1:			c = reader.getNextChar();			if(c == ' ' || c == '\t' || c == '\n' || c == '+' || c == '-' || c == '*' || c == '/' || c == '(' ||					   c == ')' || c == ';'	|| c == ',' || c == '>' || c == '<' || c == ':' || c == '\0'){				reader.unget();				descrip = new String("table");				return token;			}			else if(false == Character.isLetterOrDigit(c)) state = 99;			token = token.concat((new Character(c)).toString());			break;		case 2:			c = reader.getNextChar();			if(c == ' ' || c == '\t' || c == '\n' || c == '+' || c == '-' || c == '*' || c == '/' || 					   c == ')' || c == ';'	|| c == ',' || c == '>' || c == '<' || c == ':' || c == '\0'){				reader.unget();				descrip = new String("NUM");				return token;			}else if(c == '.'){				if(point) state = 99;				else{					point = true;									}			}else if(false == Character.isDigit(c)) state = 99;			token = token.concat((new Character(c)).toString());			break;		case 3:			c = reader.getNextChar();			if(c == ' ' || c == '\t' || c == '\n') continue;			else if(Character.isLetterOrDigit(c) || c == '('){				reader.unget();				descrip = new String("table");				return token;			}else{				reader.unget();				state = 99;			}			break;		case 4:			c = reader.getNextChar();			if(c == ' ' || c == '\t' || c == '\n' || c == '+' || c == '-' || 					c == '*' || c == '/' || c == '>' || c == '<' || c == ';' || c == '\0'){				reader.unget();				descrip = new String("table");				return token;			}else{				reader.unget();				state = 99;			}			break;		case 5:			c = reader.getNextChar();			if(c == '='){				token = token.concat((new Character(c)).toString());				state = 7;			}else if(Character.isLetterOrDigit(c) || c == '('){				reader.unget();				descrip = new String("table");				return token;			}else{				reader.unget();				state = 99;			}			break;		case 6:			c = reader.getNextChar();			if(c == '='){				token = token.concat((new Character(c)).toString());				state = 7;			}else{				reader.unget();				state = 99;			}			break;		case 7:			c = reader.getNextChar();						if(c == ' ' || c == '\t' || c == '\n' || c == '\0' || Character.isLetterOrDigit(c) || c == '('){				reader.unget();				descrip = new String("table");				return token;			}else{				reader.unget();				state = 99;			}			break;		case 99:			c = reader.getNextChar();			if(c == '\0'){				descrip = new String("ERROR");				return new String("error");			}			if(!(c == ' ' || c == '\t' || c == '\n')) continue;						else{				descrip = new String("ERROR");				return new String("error");			}					}		}	}		void analyze(){		do{			String token = nexttoken();			if(descrip.equals("FINISH")) break;			else if(descrip.equals("NUM"))				output.append("2" + "     " + token + "\n");			else if(descrip.equals("ERROR")){				output.append("error\n");			}			else{				int i;				for(i = 3; i < table.length; i++){					if(table[i].equals(token)){						output.append((new Integer(i)).toString());						if(i < 10) output.append("     ");						else output.append("    ");						output.append(token + "\n");						break;					}				}				if(i >= table.length)					output.append("1" + "     " + token + "\n");			}						if(finish) break;		}while(true);	}	public static void main(String args[]){		Lexical test = new Lexical();	}}class BufferRead{	final int MAX = 200, HALF = 99;	private char buffer[];	private int forward, r;	private BufferedReader input;	private static boolean un = false;		public BufferRead(File name){		buffer = new char[MAX];		forward = -1;		try{			input = new BufferedReader(new FileReader(name));			buffer[HALF] = buffer[MAX - 1] = '\0';			input.read(buffer, 0, HALF);		}catch(Exception e){}		}		public char getNextChar(){		if(un){			un = false;			return buffer[forward];		}		forward++;		if('\0' == buffer[forward]){			if(forward == HALF){				try{									if((r = input.read(buffer, HALF + 1, HALF)) < HALF){						buffer[HALF  + r] = '\0';					}				}catch(Exception e){}				forward++;			}else if(forward == MAX - 1){				try{					if((r = input.read(buffer, 0, HALF)) < HALF){						buffer[r - 1] = '\0';					}				}catch(Exception e){}				forward = 0;			}else				return '\0';		}		return buffer[forward];	}		public void unget(){		un = true;	}}class OpenFile{	private JFileChooser fileChooser = new JFileChooser();		Component component;	public OpenFile(Component c){		component = c;		fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);	}		public File open(){		int result = fileChooser.showOpenDialog(component);					if(result == JFileChooser.CANCEL_OPTION)			return null;				File fileName = fileChooser.getSelectedFile();				if(fileName == null || fileName.getName().equals("")){					JOptionPane.showMessageDialog(component, "Invalid File Name",				"Invalid File Name", JOptionPane.ERROR_MESSAGE);			return null;		}else{			return fileName;		}	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -