Java的作业
来源:互联网 发布:各编程语言比较 编辑:程序博客网 时间:2024/06/05 15:02
词法分析器,是这次编译原理的作业。上课也没怎么听课,结果在上机知道作业是做这个东西之后,才开始看啊找啊的。
结果是我只弄了个明白基础的它是要干什么,读取什么输出什么。老师说用什么语言完成都可以,那我就用Java咯。在网上也看了几个例子,但是真没看懂,所以我就用我目前所掌握的所达到的能力来完成这次作业。今天让老师检查了,是完成。而且老师也说我是下了好多功夫。但仍然需要修改,说完全是我自己思路写出来,没有按照书上,我想也应该就是用编译原理的思想和方法解决这个问题吧。这里就看看我的方法。
用Java的思路就是,把关于关键字、变量、数字、符号(分析四个)写成一个类,功能是判断字符串。
package work;public class fuHao{ String[] fh = { "+", "-", "*", "/", "<", ">", "=", "(", ")", "#", ";", "|", "&" }; public boolean isDanFuhao(String s) { for(int i = 0; i < fh.length; i++) if(fh[i].equals(s)) return true; return false; }}public class number{ public boolean isNumber(String s) { for(int i = 0; i < s.length(); i++) { if(s.charAt(0) == '-' || Character.isDigit(s.charAt(i))) { return true; } } return false; }}public class biaoShiFu{ String[] bsf = { "boolean", "int", "long", "short", "byte", "float", "double", "char", "class", "interface", "if", "else", "do", "while", "for", "switch", "case", "default", "break", "countinue", "return", "try", "catch", "finally", "public", "protect", "default", "private", "final", "void", "static", "strictfp", "abstract", "transient", "synchronized", "volatile", "native", "package", "import", "throw", "throws", "extends", "implements", "this", "super", "instanceof", "new", "true", "false", "null", "goto", "const" }; public boolean isBiaoshifu(String s) { for(int i = 0; i < bsf.length; i++) { if(bsf[i].equals(s)) { return true; } } return false; }}import java.util.regex.Pattern;public class bianLiang{ public boolean isBianliang(String s) { Pattern pattern = Pattern.compile(".*[a-zA-Z]+.*"); return pattern.matcher(s).matches(); }}符号和关键字是用遍历字符串数组方法
数字用了Character.isDigit()
变量用了正则表达式和pattern
接下来是关键的判断得到的字符串究竟是什么类型的功能类
// 'X'="X";public class func{ String test, test1; char[] word = new char[50]; char[] word1 = new char[50]; int k = 0, l = 0, m = 0; biaoShiFu bsh = new biaoShiFu(); number num = new number(); fuHao fh = new fuHao(); bianLiang bl = new bianLiang(); public void judege(String s) { for(int i = 0; i < s.length(); i++) { word[k] = s.charAt(i); k++; if(s.charAt(i) == ' ' || s.charAt(i) == '\n') { k--; char[] Word = new char[k]; for(int w = 0; w < k; w++) Word[w] = word[w]; k = 0; test = String.valueOf(Word); if(bsh.isBiaoshifu(test)) { System.out.println("关键字..." + test); } else { for(int p = 0; p < test.length(); p++) { test1 = String.valueOf(word[p]); if(fh.isDanFuhao(test1)) { if((p + 1) < test.length() && fh.isDanFuhao(String.valueOf(word[p + 1]))) { test1 = test1 + String.valueOf(word[p + 1]); p++; } System.out.println("符号..." + test1); } else if(bl.isBianliang(test1)) { while((p + 1) < test.length() && bl.isBianliang(String.valueOf(word[p + 1]))) { test1 = test1 + String.valueOf(word[p + 1]); p++; } System.out.println("变量..." + test1); } else if(num.isNumber(test1)) { while((p + 1) < test.length() && num.isNumber(String.valueOf(word[p + 1]))) { test1 = test1 + String.valueOf(word[p + 1]); p++; } System.out.println("数字..." + test1); } } } } } }}主要用的方法就是得到空格之前的字符串,把其分割每个字符先放入字符数组里面,然后再依次取出这个字符,把其变成字符串,对其进行四个类型的判断。
因为符号最多是两个字符,所以在进行第一次判断之后,再次用if判断。
可是数字和变量却有很多位,所以用是while持续进行下一委判断。
public class test{ public static void main(String[] args) { String sr; sr = "int num; num=0; if (num<=100) num=200;\nint ii=0; while (i>=100) i++;\n"; System.out.println(sr); func f = new func(); f.judege(sr); }}
以上是测试代码,目前对于变量名正常定义的都可以实现了。
当然,变量名首字母不能为数字,如果变量名是数字和字母的混合,这两个问题还是需要解决的。所以老师说下去继续改进言之有理。
0 0
- Java的作业
- 我的Java Web作业---计算器作业
- JAVA作业,GC的效果
- JAVA课堂上的作业
- 第一次的Java编程作业
- 显示日期的JAVA作业
- java作业代码的分析
- java作业:复数的加减法
- 8.10号的Java作业
- JAVA作业 简单的计算器
- JAVA作业
- Java作业
- Java作业
- java作业
- java作业
- JAVA作业
- java作业
- java作业
- 字符串匹配的KMP算法
- Linux下安装Tomcat服务器和部署Web应用
- 22个HTML5初级技巧
- 多线程实现数据库的并发操作
- 插入排序/选择排序/交换排序/归并排序/基数排序
- Java的作业
- SortedSet接口与TreeSet实现类(二)
- 第一天
- Map集合常用方法
- 看博客的日常
- C++ 链表实现
- Spring定时任务的简单例子(转载)
- Java-面向对象(高级篇)--接口的基本概念
- C++ primer | 第八章 IO 库