V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
javahih
V2EX  ›  Java

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

  •  
  •   javahih · 2017-12-28 16:31:05 +08:00 · 3696 次点击
    这是一个创建于 2557 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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;
    }
    
    11 条回复    2018-03-19 02:29:43 +08:00
    bramblex
        1
    bramblex  
       2017-12-28 18:03:26 +08:00
    嗯...

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




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

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


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

    我好奇的是,为什么楼主的换行符是$,而不是\n ?
    maokabc
        11
    maokabc  
       2018-03-19 02:29:43 +08:00 via Android
    这玩意儿就当 demo 玩吧。一般都是 jflex,
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2587 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 06:11 · PVG 14:11 · LAX 22:11 · JFK 01:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.