简单的Java编译器的前端实现
来源:互联网 发布:excel数据怎么排序 编辑:程序博客网 时间:2024/06/04 18:20
最近写了个简单的Java编译器,其实做前端文本编辑,最后调用javac编译,完成Java编译器的基本功能。
首先,作为一个Java编译器,他应该具有的基本的功能包括:打开代码文本,编辑,保存,编译。
所以整体构建框架的思路就是:编辑java代码,保存代码,编译,处理出错信息。
编辑代码-----真正的代码编辑器编辑代码也就是一个高级点的文本编辑器,所以要实现一个文本编辑器的基本功能,这用一个类实现。同时,编辑代码一般都要做关键字高亮显示,所以这也用一个类实现。
根据这样的思路整个框架就出来了:
编辑代码区因为要关键字高亮,所以用JTextPane类可以实现。JTextArea类适合最普通的文本编辑的功能,但是在部分文本高亮方面比较难以实现。
具体实现:
新建功能:新建文本编辑前要确保已编辑的代码是否要保存,然后清空原来文本文字就可以了。
if(menuItem == NewItem)//新建工程 {//判断代码是否改变,提醒是否保存
codetextPane.setText("");//清空原来文本
codetextPane.setEditable(true); codetextPane.setSelectedTextColor(Color.blue);//选中的代码颜色变为蓝色 }
打开:就是读取文本文件,然后将内容写进代码文本编辑区。
if(menuItem == OpenItem)//打开 { ........... fileName=OpenFileDialog.getDirectory()+OpenFileDialog.getFile(); if(fileName != null) { try { FileReader Readfile = new FileReader(fileName); BufferedReader Buff = new BufferedReader(Readfile); while((Lineword = Buff.readLine())!= null) { Lineword.trim(); content += (Lineword+'\n'); } codetextPane.setText(content); ......... } catch ( IOException e1 ) {// TODO Auto-generated catch blocke1.printStackTrace(); } } else { return; } }
保存和另存基本一样:就是用write方法把文本写进文件保存。
private void writeFile(String fileName2) throws IOException {File file = new File(fileName);FileWriter writeOut = new FileWriter(file);writeOut.write(codetextPane.getText());//写文件writeOut.close();}
复制、粘贴、剪切、撤退很简单,直接用copy、paste等方法就可。
编译:调用javac直接编译获取编译结果。
Runtime run = Runtime.getRuntime();Process process = null;try { process = run.exec("javac "+fileName); BufferedInputStream in = new BufferedInputStream(process.getErrorStream()); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); while((str = reader.readLine()) != null) { string += str; string += "\n"; } errortextArea.setText(string+"\n");
主要比较困难的是如何动态实现关键字高亮。因为自己不会写,所以找了一个别人写好的类。
public SyntaxHighlighter(JTextPane editor) { // 准备着色使用的样式 keywordStyle = ((StyledDocument) editor.getDocument()).addStyle("Keyword_Style", null); normalStyle = ((StyledDocument) editor.getDocument()).addStyle("Keyword_Style", null); StyleConstants.setForeground(keywordStyle, Color.RED); StyleConstants.setForeground(normalStyle, Color.BLACK); String KEYWORDS[]={"abstract","assert","boolen","break","byte","case","catch","char","class","const", "continue","default","do","double","else","enum","extends","final","finally","float","for", "if","implements","import","instanceof","int","interface","long","native","new","package", "private","protected","public","return","short","static","strictfp","super","switch","synchrpnized", "this","throw","throws","transient","try","void","volatile","while"}; // 准备关键字 keywords = new HashSet<String>(); for(int i = 0; i<KEYWORDS.length; i++) { keywords.add(KEYWORDS[i]); } } ....................
做了一周时间,由于只有我和一个女生在做,两个人都属于菜鸟级,工作量有点大,做的很累,最后还有一些细节的问题没有解决,例如如何让出错的那一行代码高亮显示等。等有时间了,想法成熟了再动手完善。做完之后,意识到开发窗体程序要有容器和面板的思想,把组件放进一个面板里,但是要注意放置的位置和次序,组件间的层次关系要清楚,由于是菜鸟所以这个问题曾经弄得很烦。
最后的结果图如下:
- 简单的Java编译器的前端实现
- 简单编译器前端的实现
- 一个编译器(前端)的实现
- 实现一个简单的编译器
- 用超简单的python代码实现Java在线编译器
- 一个简单LR编译器的C++实现
- 一个简单编译器的实现过程
- 用Java编写一个简单的编译器
- java编译器eclipse的简单汉化
- python在线编译器的简单原理与超简单实现
- 【前端】完整,简单的幻灯片的实现
- 简单的C编译器
- java编译器之前端编译器
- JAVA实现一个简单的代数运算语言编译器(一)--写在前面
- JAVA实现一个简单的代数运算语言编译器(二)--词法分析准备
- JAVA实现一个简单的代数运算语言编译器(三)--词法分析
- JAVA实现一个简单的代数运算语言编译器(四)-- 表达式计算
- 前端实现一个简单的表格分页
- 线程同步
- tplink 703N拆机接ttl
- CSS实现图片阴影效果
- 二分查找,偏移循环二分查找
- JSON
- 简单的Java编译器的前端实现
- Java Web笔记 – JavaBean的使用 JavaBean的范围 与Java代码的交互
- android源码解析--Dialog
- 解决Android的ListView控件滚动时背景变黑
- PAN_ID
- JSP2.0的简单标志库扩展_SimpleTag
- 在VC中如何获得程序的当前路径?
- Android 新手listview小示例(一)
- Android 新手listview小示例(二)