修改openJDK7的javac,使得java支持单引号字符串
来源:互联网 发布:mac系统上好玩的游戏 编辑:程序博客网 时间:2024/05/17 22:53
大四的毕业设计做的是,给java语言增加一些特性(比如python的列表和字典结构)。涉及到javac编译器前端(scanner,parser)的修改。现在才刚开始着手。。
成功编译了openJDK后,才发现原来javac的这部分代码完全是由java语言实现的,所以可以把javac的代码单独提出来,放到eclipse里面,并且用eclipse编译和调试。这样真的超方便。。
刚开始做了一个很简单的修改,让java支持单引号的字符串(只作为练习)。思想很简单,找到Scanner的代码,把处理单引号的代码修改为处理双引号的代码即可。
过程如下:
1.eclipse中新建一个工程。然后把openJDK7里面目录:openjdk7\langtools\src\share\classes\com,全部导入到eclipse中,运行。可能会遇到一个版本的问题,就是编译时的javac版本和eclipse环境中,配置Preferences->compiler 和Preferences->buildpath两个里面的版本一致即可。可以生成javac,测试没有问题。。
2.进入com.sun.tools.javac.Main,里面有一个main方法就是javac最外层的调用。它调用了com.sun.tools.javac.main.Main的compile方法进入编译。
3.单步跟踪,找到真正scanner和parser的位置。前面调用几个类大致如下:com.sun.tools.javac.Main->com.sun.tools.javac.main.Main->com.sun.tools.javac.main.JavaCompiler->com.sun.tools.javac.parser.JavacParser->com.sun.tools.javac.parser.Scanner. 最后可以发现Scanner的nextToken方法,就是扫描下一个符合的方法。
4.进入com.sun.tools.javac.parser.Scanner.nextToken(),ctrl+F搜索 '\'' 找到处理单引号的代码。如下
01
case
'\''
:
02
scanChar();
03
if
(ch ==
'\''
) {
04
lexError(
"empty.char.lit"
);
05
}
else
{
06
if
(ch == CR || ch == LF)
07
lexError(pos,
"illegal.line.end.in.char.lit"
);
08
scanLitChar();
09
if
(ch ==
'\''
) {
10
scanChar();
11
token = CHARLITERAL;
12
}
else
{
13
lexError(pos,
"unclosed.char.lit"
);
14
}
15
}
16
return
;
这段代码下面就有处理双引号(也就是java里面真正支持的字符串)的代码,参照此代码,把处理单引号的代码修改成以下的即可:这是我修改后的代码:
01
case
'\''
:
02
scanChar();
03
if
(ch ==
'\''
) {
04
lexError(
"empty.char.lit"
);
05
}
else
{
06
if
(ch == CR || ch == LF)
07
lexError(pos,
"illegal.line.end.in.char.lit"
);
08
scanLitChar();
09
if
(ch ==
'\''
) {
10
scanChar();
11
token = CHARLITERAL;
12
}
else
{
//////////what i add///////
13
while
(ch !=
'\''
&& ch != CR && ch != LF && bp < buflen)
14
scanLitChar();
15
if
(ch ==
'\''
) {
16
token = STRINGLITERAL;
17
scanChar();
18
}
else
{
19
lexError(pos,
"unclosed.str.lit"
);
20
}
21
22
//lexError(pos, "unclosed.char.lit");
23
}
24
}
25
return
;
测试没有问题。。
转自:http://my.oschina.net/superpdm/blog/87235?from=20121111
- 修改openJDK7的javac,使得java支持单引号字符串
- 字符串中单引号的应用
- 字符串的单引号和双引号
- 通过java后台拼接json字符串修改页面样式----一页多用 + 双引号(")和单引号(')截断字符串解决方案
- 通过java后台拼接json字符串修改页面样式----一页多用 + 双引号(")和单引号(')截断字符串解决方案
- openjdk7的编译
- java字符串判断是否含有单引号
- javac和java的使用方法
- javac 和java 的命令
- javac和java的用法!
- 升级到Maven3.1.0 以支持 OpenJDK7
- 字符串中的单引号和双引号的差别
- python字符串单引号与双引号的区别
- PHP的单引号和双引号 字符串效率
- C++中单引号“字符串”的用法
- C++中单引号“字符串”的用法
- php单引号中字符串的转义("\")
- PHP单引号和双引号字符串的区别
- jsp语法
- const小练习一则,把const int*去除常量性赋给int*
- Smarty-基础
- JDK环境变量配置的步骤
- METHODS
- 修改openJDK7的javac,使得java支持单引号字符串
- 大奖赛打分程序设计
- vps上搭建基于lnmp的wordpress站点
- page和include指令
- Win7下安装Oracle 10g常见错误解决
- unity基础开发----NGUI图集Atlas制作简介
- java垃圾回收之循环引用
- 九大隐式对象
- 多叉树结合JavaScript树形控件实现无限级树形菜单(一种构建多级有序树形结构JSON(或XML)数据源的方法)