Java 编写的 C 语言词法分析器

2017-12-28 16:31:05 +08:00
 javahih

lexer1.1.0

Java 编写的 C 语言词法分析器

Github 项目链接: https://github.com/u014427391/lexer1.1.0

1~20 号为关键字,用下标表示,i+1 就是其机器码; 21~40 号为操作符,用下标表示,i+21 就是其机器码; 41~60 号为分界符, 用下标表示,i+41 就是其机器码; 用户自定义的标识符,其机器码为 51; 常数的机器码为 52 ; 不可以识别的标识符,其机器码为 0

选择打开按钮,选择文件所在的路径,单击打开,分析器会获取文件的内容,并将其复制到文本域里,本词法分析器就可以对文本域里的内容进行剪切复制黏贴和清除等编辑操作

保存文件,选择文件的保存路径,点击保存,即可进行文件保存

进行词法分析,输出标识符所在的行及其机器码,不可以被识别的在控制台输出

 用户可以查看帮助文档,点击帮助按钮就可以打开

附录:核心代码

/**
 * 将字符串分成一个个单词,存放在数组列表
 */
public ArrayList<Word> divide(String str){
	ArrayList<Word> list=new ArrayList<Word>();
	
	String s="";
	char ch;
	int i;
	int row=1;
	
	for(i=0;i<str.length();i++){
		ch=str.charAt(i);
		if(i==0&&ch==' ')//字符串的第一个字符
			continue;
		if(ch==' '){//' '或者'\t'或者'\r'的情况
			if(s!=""){
				list.add(new Word(row, s));
				s="";//置空
			}else{
				continue;
			}
		}else if(isDigit(ch)||isLetter(ch)){
			if(s==""||isDigit(s.charAt(s.length()-1))||isLetter(s.charAt(s.length()-1))){
				s = s + ch;
			}else{
				list.add(new Word(row, s));
				s = "";
				s=s + ch;
			}	
		}else{
			if(isTwoOperator(s, ch)){//两个运算符的情况
				s = s + ch;
			}else{
				if(s==""&&ch!='$'){
					s = s + ch;
				}else if(s==""&&ch=='$'){//若检测到$符号,就换行
					row++;//行数加一
				}else{
					list.add(new Word(row, s));
					s = "";
					if(ch!='$'){
						s=s + ch;
					}else{
						row++;
					}
				}
			}	
		}
	}
	if(s!=""){
		list.add(new Word(row, s));
	}
	return list;
}
3654 次点击
所在节点    Java
11 条回复
bramblex
2017-12-28 18:03:26 +08:00
嗯...

楼主编译原理一定没好好学
jiqing
2017-12-28 19:35:12 +08:00
感觉楼上说得对
qfdk
2017-12-28 19:42:41 +08:00
楼上的没毛病
0915240
2017-12-28 19:45:19 +08:00
ast ?




其实我也没学过编译原理。。。
aristotll
2017-12-28 19:46:36 +08:00
antlr 建议...
nutting
2017-12-28 20:39:12 +08:00
这核心代码什么鬼?外行造轮子
x87648510
2017-12-28 21:15:44 +08:00
这也算的话,那....
misaka19000
2017-12-28 23:01:18 +08:00
楼主这勉强也算个状态机吧
GeruzoniAnsasu
2017-12-29 10:46:51 +08:00
..........................

楼上都在说啥?
antlr ?
ast ?
语法分析的范畴 你搬自己都不太懂的名词出来是不是会砸自己脚?


当然我是百度了一圈才敢回来回帖的,并且我也不敢说我看懂 lz 的东西或他写得对不对,承认自己菜
sorra
2017-12-29 14:39:37 +08:00
词法分析包含有限自动机、正则表达式(的实现)等概念,也可以包含简单的 AST。可以从词法规则自动生成,也可以手写。

我好奇的是,为什么楼主的换行符是$,而不是\n ?
maokabc
2018-03-19 02:29:43 +08:00
这玩意儿就当 demo 玩吧。一般都是 jflex,

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/418340

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX