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;
}
1
bramblex 2017-12-28 18:03:26 +08:00
嗯...
楼主编译原理一定没好好学 |
2
jiqing 2017-12-28 19:35:12 +08:00
感觉楼上说得对
|
3
qfdk 2017-12-28 19:42:41 +08:00 via iPhone
楼上的没毛病
|
4
0915240 2017-12-28 19:45:19 +08:00
ast ?
其实我也没学过编译原理。。。 |
5
aristotll 2017-12-28 19:46:36 +08:00
antlr 建议...
|
6
nutting 2017-12-28 20:39:12 +08:00 via Android
这核心代码什么鬼?外行造轮子
|
7
x87648510 2017-12-28 21:15:44 +08:00 via Android
这也算的话,那....
|
8
misaka19000 2017-12-28 23:01:18 +08:00
楼主这勉强也算个状态机吧
|
9
GeruzoniAnsasu 2017-12-29 10:46:51 +08:00
..........................
楼上都在说啥? antlr ? ast ? 语法分析的范畴 你搬自己都不太懂的名词出来是不是会砸自己脚? 当然我是百度了一圈才敢回来回帖的,并且我也不敢说我看懂 lz 的东西或他写得对不对,承认自己菜 |
10
sorra 2017-12-29 14:39:37 +08:00
词法分析包含有限自动机、正则表达式(的实现)等概念,也可以包含简单的 AST。可以从词法规则自动生成,也可以手写。
我好奇的是,为什么楼主的换行符是$,而不是\n ? |
11
maokabc 2018-03-19 02:29:43 +08:00 via Android
这玩意儿就当 demo 玩吧。一般都是 jflex,
|