词法分析学习-手工构词
2015-06-28 09:57
295 查看
这个是看MOOC学编译原理的一个作业。
识别标识符和关键字,核心在于转移图,dfa的构造
识别标识符和关键字,核心在于转移图,dfa的构造
package bingone; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.InputStreamReader; /** * 手工构造词法分析器,标注的关键字有if for 。 * @author bingone * */ enum Token{ FOR("for"), IF("if"); String name; private Token(String name){ this.name = name; } } public class ManualToken { /** * 对应转移图有 空 0, i 1, if 2,f 3,fo 4, for,5, 其他 6 * @param row * @param str */ private static void solve(int row,String str){ int cnt = 0; int tag = 0; str = new String(str+" "); char [] token = new char[100]; for(int i = 0;i<str.length();i++){ char ch = str.charAt(i); if(ch ==' '){ if(tag != 0){ if(tag==6){ System.out.print( "ID("+new String(token, 0, cnt) +")"); }else if(tag==2){ System.out.print(Token.IF); }else if(tag==5){ System.out.print(Token.FOR); } System.out.println( "("+row+","+ (i-cnt+1) + ")" ); } cnt = 0; tag = 0; continue; } token[cnt++] = ch; if(tag == 0){ switch(ch){ case 'i':tag = 1;break; case 'f':tag = 3;break; default: tag = 6;break; } }else if(tag == 1){ if(ch=='f') tag = 2; else tag = 6; }else if(tag ==2) tag = 6; else if(tag==3){ if(ch=='o') tag = 4; else tag = 6; }else if(tag==4){ if(ch=='r') tag = 5; else tag = 6; } } } public static void main(String[] args) throws Exception { // System.out.println(System.getProperty("user.dir")); BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("./src/bingone/in.txt"))) ; String aline = null; int row = 1; while((aline = br.readLine()) != null){ solve(row++,aline); } } }
相关文章推荐
- DataTable读写到XML文件的正确方法(以及对缺少根元素问题的处理)
- ACCESS通过一个连接写入的数据,另一个连接却读取不出来
- js类型判断的方法
- 软件测试行业趋势分析和思考
- nodejs使用connect-mongodb报错(Please ensure that you set the default write concern)
- hdoj1421_搬寝室(dp)
- Android之Notification的多种用法(转)
- myelipse 优化
- 程序员必须知道的10大基础实用算法及其讲解
- 程序员必须知道的10大基础实用算法及其讲解 分类: 算法 2015-06-28 09:54 10人阅读 评论(0) 收藏
- LeetCode | Contains Duplicate II
- C语言堆和堆栈
- 网易数据挖掘试题
- 仿QQ空间下拉头部缩放
- 树莓派安装node.js
- 图像处理常见方法
- jquery简单案例
- 系统进程的Watchdog [转]
- 位向量的解读(初始化、赋值、取值)
- 基于内存池的空间配置器