SrcAnalyse.java
import java.awt.*; import java.awt.event.*; import java.io.*; import javax.swing.JButton; public class SrcAnalyse extends Frame implements ActionListener{ int row = 1; int line = 1; public static JButton button1=new JButton("打开文件"); public static JButton button2=new JButton("开始分析"); public static JButton button3=new JButton("退出"); TextArea text = new TextArea(15,60); TextArea analyse_text = new TextArea(15,60); int begin = 0; int end = 0; FileDialog file_dialog_load = new FileDialog(this, "打开文件", FileDialog.LOAD); SrcAnalyse(){ this.setLayout(new FlowLayout()); this.add(text); this.add(button1);//打开 this.add(button2);//分析 this.add(button3);//退出 this.add(analyse_text); analyse_text.setText("分析信息如下: \n"); button1.addActionListener(this); button2.addActionListener(this); button3.addActionListener(this); this.setSize(500, 650); this.setResizable(false);//设为窗口不可变 this.setLocation(400,150); text.setEditable(true); analyse_text.setEditable(false); this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); this.setVisible(true); } public static void main(String[] args) { SrcAnalyse compiler = new SrcAnalyse(); compiler.setTitle("词法分析程序v1.0——(C语言版) Power by luosng007"); } public void actionPerformed(ActionEvent e){ if(e.getSource() == button3){ System.exit(0); }else if(e.getSource() == button1){ 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() == button2){ analyse_text.setText(""); row = 0; line = 1; analyse(); } } /**词法分析*/ public void analyse(){ String analyse_info = analyse_text.getText(); String content = text.getText(); String content1 =""; if(content.equals("")){ analyse_info += "Text is empty! You havn't input any code!\n"; analyse_text.setText(analyse_info); } else{ int i = 0; int N = content.length(); int state = 0; System.out.println(end); for(i = 0; i < N; i++){ row++; char code; char c = content.charAt(i);//当前读取字符 code = c; System.out.print(code); switch(state){ case 0: if(c == ',' || c == ' ' || c == '\t' || c == '{' || c =='}' || c == '(' || c == ')' || c == ';' || c == '[' || c == ']') { if(isDigit(content.charAt(i - 1)) && isDigit(content.charAt(begin))){ end = i; analyse_text.append("info:0 数值表达式: " + content.substring(begin, end) +'\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(isLetter(c)) { state = 10; begin = i; } //isDigit(int) 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 analyse_text.append("line: " + line + " row: " + row + " error: '" + c + "' Undefined character! \n"); break; case 1://标识符为 + //row++; if(c == '+'){ state = 0; analyse_text.append("info:1 运算符'++':\n"); } else if(c == '='){ state = 0; analyse_text.append("info:1 运算符'+=':\n"); }else{ state = 0; analyse_text.append("info:1 运算符 '+':\n"); i--; row--; } break; case 2://标志符为 - if(c == '-') analyse_text.append("info:2 运算符'--':\n"); else if(c == '=') analyse_text.append("info:2 运算符'-=':\n"); else{ analyse_text.append("info:2 运算符'-':\n"); i--; row--; } state = 0; break; case 3://运算符 * if(c == '=') analyse_text.append("info:3 运算符 '*=':\n"); else{ analyse_text.append("info:3 运算符 '*':\n"); i--; row--; } state = 0; break; case 4://运算符 / if(c == '/'){ if((c=content.charAt(i+1))=='*') state=3; else{ while((c) != '\n'){ c=content.charAt(i); i++; } System.out.println(""); c = content.charAt(i); state = 0; analyse_text.append("info:4 注释部分 //: \n"); } }else if(c == '='){ state = 0; analyse_text.append("info:4 运算符 /= :\n"); }else{ state = 0; analyse_text.append("info:4 运算符 / :\n"); i--; row--; } break; case 5://运算符 ! if(c == '='){ analyse_text.append("info:5 运算符 != :\n"); state = 0; }else{ state = 0; i--; row--; analyse_text.append("info:5 运算符 !: \n"); } break; case 6://运算符 > if(c == '='){ analyse_text.append("info:6 运算符 >= :\n"); state = 0; }else{ state = 0; analyse_text.append("info:6 运算符 >: \n"); } break; case 7://运算符 < if(c == '='){ analyse_text.append("info:7 运算符 <= :\n"); state = 0; }else{ state = 0; analyse_text.append("info:7 运算符 <: \n"); } break; case 8://运算符 = if(c == '='){ analyse_text.append("info:8 运算符 == :\n"); state = 0; }else{ state = 0; analyse_text.append("info:8 运算符 = :\n"); } break; case 9://回车 state = 0; row = 1; line ++; analyse_text.append("info:9 回车 : \n"); break; case 10:// 字母 if(isLetter(c) || isDigit(c)){ state = 10; }else{ end = i; String id = content.substring(begin, end); if(isKey(id)) analyse_text.append("info:关键字 : "+id+'\n'); //error_text.appendText("info ? : 10" + id + '\n'); else analyse_text.append("info:标识符 :" + id + '\n'); i--; row--; state = 0; } break; case 11:// 数字 if(c == 'e' || c == 'E') state = 13; else if(isDigit(c) || c == '.'){ }else { if(isLetter(c)){ analyse_text.append("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); System.out.print(c); } if(id.trim().equals("include")){ while(c != '>' && ( c != '\n')){ i++; c = content.charAt(i); System.out.print(c); } if(c == '>') analyse_text.append("info # :12 : \n"); }else analyse_text.append("error: " + "line " + line + ", row " + row + " ?\n"); 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 == '.'){ analyse_text.append("error line " + line + " row " + row + "指数格式错误!\n"); state = 0; int temp = i; i = find(i,content); row += (i - temp); }else{ end = i; analyse_text.append("info:13 指数: " + content.substring(begin, end) + '\n'); } state = 0; } break; case 14://&& if(c == '&') analyse_text.append("info:14 '&' : \n"); else{ i--; analyse_text.append("info:14 '&&' : \n"); } state = 0; break; case 15://|| if(c == '|') analyse_text.append("info:15 '||': \n"); else{ i--; analyse_text.append("info:15 '|': \n"); } state = 0; break; case 16://"" analyse_text.append("info:16 引号 :"+ '"' + '\n'); i--; state = 0; break; } } } analyse_text.append("分析完成 \r\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("char") || str.equals("double") || str.equals("enum") || str.equals("float") || str.equals("int") || str.equals("long") || str.equals("short") || str.equals("signed") || str.equals("struct")||str.equals("void") || str.equals("unsigned") || str.equals("union") || str.equals("for") || str.equals("do") || str.equals("while") || str.equals("break") || str.equals("continue") || str.equals("if")||str.equals("else")||str.equals("goto") || str.equals("switch") || str.equals("case") || str.equals("default") || str.equals("return") || str.equals("auto")||str.equals("extern")||str.equals("register")||str.equals("static") ||str.equals("const")||str.equals("sizeof")||str.equals("typedef")||str.equals("volatile") ) 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(); } }
相关推荐
java词法分析器java词法分析器
本词法分析器能分析出java中常见的大部分字符,比如说运算符,界符,常量等等。对一些错误的字符也能读取出来,比如说非法运算符,非法标识符,非法浮点型等等。另外,本词法分析器对java中的注释也进行了处理,解析...
这个是java词法分析器,包含全部的源码,我以前提交的只有一些源代码,不好意思。和其他的词法分析器不同,这个包含了图形模拟功能。就是能够把整个字符匹配过程显示出来。 <br> 我希望大家使用了后,能够提出...
java词法分析器源代码,用eclipse打开就行,免费下载哦,
一个能用的 JAVA版的JAVA词法分析器 我对这个程序稍微做了修改 可以用Eclipse直接打开
由于这学期学了编译原理这门课,实验要求写词法分析器以及语法分析器,这才写的,不同网络其他的代码,我采用的是java实现的,也算费了好多脑细胞,希望能大伙看看咋样,不喜勿喷哦,各自学习就是了!
编译原理CompilingPrinciple java语言开发的词法分析器含GUI界面, 按照编译原理状态机方式编写,写法简单,基于JDK开发不需要单独下载依赖jar包 下载后用eclipse或者时其他编辑器打开运行src->compiled->view->...
词法分析器java版词法分析器java版词法分析器java版词法分析器java版词法分析器java版词法分析器java版词法分析器java版词法分析器java版词法分析器java版词法分析器java版词法分析器java版词法分析器java版
用于java词法分析,输入java源文件,程序会调用有穷自动机进行词法分析,格式良好,能识别关键字。
编译原理大作业 含FA图 java词法分析器 C语言编写
通过Java语言编写一个词法分析器完成输入是字符串(或源程序文本文件),输出是源程序中各单词的字符串、起止位置、词的类别。附带实验报告。
我在2008年的时候上传了java词法分析器,我还说包含了全部的源码,可是最近我自己下下来看的时候,却发现有几个关键的程序没有。而那个程序却又一百多人下载了,呵呵,我真是过意不去,我现在又上次一次,希望补过。...
自己写的词法分析器,java实现,编译原理课程的作业
用JAVA语言写出词法分析器程序,程序输出单词编号和单词自身的值!!
Java版的编译词法分析器 内含词法分析器 输入好的文件 和编译好的源文件
c语言,Java,词法分析,词法分析界面,编译原理课程实验,这是完整的可运行源代码,是用intellij IDEA写的
编译原理课上的词法分析器作业,具体功能以及缺陷都在文档中详细说明。望多多指教批评。
Java实现的一个词法分析器