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

📄 compiler.java

📁 用JAVA编的一个小程序
💻 JAVA
字号:
import java.awt.*;
import java.awt.event.*;
import java.io.*;

public class Compiler extends Frame implements ActionListener{
	int row = 1;//数排列,横坐标
	int line = 1;//横排行,竖坐标。当遇到回车换行的时候,line++,row = 0;
	MenuBar mb = new MenuBar();
	Menu fileMenu = new Menu("File");
	Menu actionMenu = new Menu("Project");
	MenuItem closeWindow = new MenuItem("Exit");
	MenuItem openFile = new MenuItem("Open file");
	MenuItem lexical_check = new MenuItem("Check lex");
	
	int begin = 0;//当读到第一个字母的时候,标志其位置
	int end = 0;
	TextArea text = new TextArea(100,30);
	TextArea error_text = new TextArea(100,30);
	//FileDialog file_dialog_load;
	FileDialog file_dialog_load = new FileDialog(this, "Open file...", FileDialog.LOAD);
	
	Compiler(){
		//file_dialog_load.setVisible(true);
		this.setLayout(new FlowLayout());
		
		this.setMenuBar(mb);
		mb.add(fileMenu);
		mb.add(actionMenu);
		
		fileMenu.add(openFile);
		fileMenu.add(closeWindow);
		
		actionMenu.add(lexical_check);
		
		this.add(text);
		this.add(error_text);
		error_text.setText("Lexical Information: \n");
		
		closeWindow.addActionListener(this);
		openFile.addActionListener(this);
		lexical_check.addActionListener(this);
		this.setSize(500, 600);
		this.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
		});
		this.setVisible(true);
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Compiler compiler = new Compiler();
	}
	
	public void actionPerformed(ActionEvent e){
		if(e.getSource() == closeWindow){
			System.exit(0);
		}else if(e.getSource() == openFile){
			file_dialog_load.setVisible(true);
			File myfile = new File(file_dialog_load.getDirectory(), file_dialog_load.getFile());
			try{
				BufferedReader bufReader = new BufferedReader(new FileReader(myfile));
				String content = "";
				String str;
				while((str = bufReader.readLine()) != null){
					content += str + "\n";
					text.setText(content);
				}
			}catch(IOException ie){
				System.out.println("IOexception occurs...");
			}
		}else if(e.getSource() == lexical_check){
			//error_text.setText("Lexical Information: \n");
			error_text.setText("");
			row = 0;
			line = 1;
			checkLexical();
		}
	}
	/*
	 * 对Text区域数据区进行词法检测
	 * */
	public void checkLexical(){
		String error_info = error_text.getText();
		String content = text.getText(); 
		if(content.equals("")){
			error_info += "Text is empty! You havn't input any code!\n";
			error_text.setText(error_info);
		}
		else{
			int i = 0;//选择第i个字符进行检测。
			int N = content.length();
			//error_text.appendText("N = " + N + '\n');
			int state = 0;//状态标志
			for(i = 0; i < N; i++){//对所有字符进行检测
				row++;
				char c = content.charAt(i);
				//error_text.appendText("" + c);
				//System.out.print(content);
				switch(state){
					case 0:
						//row++;
						if(c == ','||c == '\t' || c == '{' || c =='}' || c == '(' || c == ')' || c == ';' || c == '[' || c == ']') {
							if(isDigit(content.charAt(i - 1)) && isDigit(content.charAt(begin))){
								end = i;
								error_text.append("info: 数值表达式 " + content.substring(begin, end) + '\n');
							}
							error_text.appendText("info: 分隔符 " + c + '\n');
							state = 0;
						}
						else if(c == '+') state = 1;
						else if(c == '-') state = 2;
						else if(c == '*') state = 3;
						else if(c == '/') state = 4;
						else if(c == '!') state = 5;
						else if(c == '>') state = 6;
						else if(c == '<') state = 7;
						else if(c == '=') state = 8;
						else if(((int)c) == 10) state = 9;//输入为回车
						//else if(c == '\n') state = 9;//输入为回车
						else if(isLetter(c)) {
							state = 10;
							begin = i;
						}
						else if(isDigit(c)) {
							begin = i;
							state = 11;
						}
						else if(c == '#') state = 12;
						else if(c == '&') state = 14;
						else if(c == '|') state = 15;
						else if(c == '"') state = 16;
						//else error_text.appendText("line: " + line + " row: " + row + " error: '" + c + "' Undefined character! \n");
						else state = 9;//输入为回车
						break;
					case 1://标志符是 +
						//row++;
						if(c == '+'){
							state = 0;				
							error_text.appendText("info: 运算符 '++'\n");
						}
						else if(c == '='){
							state = 0;
							error_text.appendText("info: 运算符 '+='\n");
														
						}else{
							state = 0;
							error_text.appendText("info: 运算符 '+'\n");
							i--;
							row--;
						}
						break;
					case 2://标志符是 -
						if(c == '-')
							error_text.appendText("info: 运算符 '--'\n");
						else if(c == '=') 
							error_text.appendText("info: 运算符 '-='\n");
						else{
							error_text.appendText("info: 运算符 '-'\n");
							i--;
							row--;
						}
						state = 0;
						break;
					case 3://标志符是 *
						if(c == '=')
							error_text.appendText("info: 运算符 '*='\n");
						else{
							error_text.appendText("info: 运算符 '*'\n");
							i--;
							row--;
						}
						state = 0;
						break;
					case 4://标志符是 /
						if(c == '/'){
							while((c) != '\n'){
								c = content.charAt(i);
								i++;
							}
							state = 0;
							error_text.appendText("info: 注释部分 // \n");
						}else if(c == '='){
							state = 0;
							error_text.appendText("info: 运算符 /= \n");
						}else{
							state = 0;
							error_text.appendText("info: 运算符 / \n");
							i--;
							row--;
						}
						//state = 0;
						break;
					case 5://标志符是 !
						if(c == '='){
							error_text.appendText("info: 运算符 != \n");
							state = 0;
						}else{
							state = 0;
							i--;
							row--;
							error_text.appendText("info: 运算符 ! \n");
						}
						//state = 0;
						break;
					case 6://标志符是 >
						if(c == '='){
							error_text.appendText("info: 运算符 >= \n");
							state = 0;
						}else{
							state = 0;
							error_text.appendText("info: 元算符 > \n");
						}
						//state = 0;
						break;
					case 7://标志符是 <
						if(c == '='){
							error_text.appendText("info: 运算符 <= \n");
							state = 0;
						}else{
							state = 0;
							error_text.appendText("info: 运算符 < \n");
						}
						break;
					case 8://标志符是 =
						if(c == '='){
							error_text.appendText("info: 运算符 == \n");
							state = 0;
						}else{
							state = 0;
							error_text.appendText("info: 运算符 = \n");
						}
						break;
					case 9://标志符是 回车
						state = 0;
						row = 1;
						line ++;
						break;
					case 10://标志符是 字母
						if(isLetter(c) || isDigit(c)){
							state = 10;
						}else{
							end = i;
							String id = content.substring(begin, end);
							if(isKey(id))
								error_text.appendText("info: 关键字 " + id + '\n');
							else
								error_text.appendText("info: 标志符 " + id + '\n');
							i--;
							row--;
							state = 0;
						}
						//state = 0;
						break;
					case 11://标志符是 数字
						if(c == 'e' || c == 'E')
							state = 13;
						else if(isDigit(c) || c == '.'){
							//省略跳过,i加一操作
						}else {
							if(isLetter(c)){
								error_text.appendText("error: line " + line + " row " + row + " 数字格式错误或者标志符错误\n");
							}
							//i--;
							//row--;
							int temp = i;
							i = find(i,content);
							row += (i - temp);
							state = 0;
						}
						
						break;		
					case 12://标志符是 #
						String id = "";
						while(c != '<'){
							id += c;
							i++;
							c = content.charAt(i);
						}
						if(id.trim().equals("include")){
							while(c != '>' && ( c != '\n')){
					    			i++;
								c = content.charAt(i);
							}
							if(c == '>')
								error_text.append("info: 头文件引入文法 \n");
						}else
							error_text.appendText("error: " + "line " + line + ", row " + row + " 语法错误\n");
						//i--;
						//row--;
						
						state = 0;
						break;
					case 13://检测指数表示方式
						if(c == '+' || c == '-' || isDigit(c)){
							i++;
							c = content.charAt(i);
							while(isDigit(c)){
								i++;
								c = content.charAt(i);
							}
							if(isLetter(c) || c == '.'){
								error_text.appendText("error; line " + line + " row " + row + " 指数格式错误!\n");
								state = 0;
								//i--;
								//row--;
								int temp = i;
								i = find(i,content);
								row += (i - temp);
								//error_text.appendText("i = " + i + " row = " + row + " len = " + content.length() + '\n');
							}else{
								end = i;
								error_text.appendText("info: 指数 " + content.substring(begin, end) + '\n');
							}
							/*
							end = i;
							String str = content.substring(begin, end);
							error_text.appendText("info: 指数 " + str + '\n');
							*/
							state = 0;
						}
						break;
					case 14:// 逻辑运算发 &&
						if(c == '&')
							error_text.appendText("info: 逻辑AND运算符 '&&' \n");
						else{
							i--;
							error_text.appendText("info: & 不明运算符. \n");
						}
						state = 0;
						break;
					case 15:// 逻辑运算发 ||
						if(c == '|')
							error_text.appendText("info: 逻辑OR运算符 '||' \n");
						else{
							i--;
							error_text.appendText("info: '|' 不明运算符. \n");
						}
						state = 0;
						break;
					case 16:
						error_text.appendText("info: 引号 " + '"' + '\n');
						i--;
						state = 0;
						break;
					
				}
			}		error_text.appendText("Have checked lexical! \n");
		}

			
		
	}
	boolean isLetter(char c){
		if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_')
			return true;
		return false;
	}
	boolean isDigit(char c){
		if(c >= '0' && c <= '9') return true;
		return false;
	}
	boolean isKey(String str){
		if(str.equals("int") || str.equals("real") || str.equals("for") || str.equals("while") || str.equals("do") || str.equals("begin") || str.equals("end") || str.equals("if") || str.equals("then")||
				str.equals("AND") || str.equals("OR") || str.equals("NOT") || str.equals("repeat") || str.equals("until") || str.equals("read") || str.equals("write") || str.equals("return") || str.equals("true")
				|| str.equals("false") || str.equals("boolean") || str.equals("program") || str.equals("const") || str.equals("to"))
			return true;
		return false;
	}
	int find(int begin, String str){//寻找分隔符空格、括号、回车等。
		if(begin >= str.length())
			return str.length();
		for(int i = begin; i < str.length(); i++){
			char c = str.charAt(i);
			if(c == '\n' || c == ',' || c == ' ' || c == '\t' || c == '{' || c =='}' || c == '(' || c == ')' || c == ';' || c == '=' || c == '+'|| c == '-' || c == '*' || c == '/') 
				return i - 1;	
		}
		return str.length();
	}
}

⌨️ 快捷键说明

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