改造JAVA,给OpenJDK10添加中文关键词
OpenJDK10的编译参照 : 在WSL上编译OpenJDK10
魔改JAVA,添加中文关键词,改的不多,仅仅改了javac的源代码,分别属于java.compiler、jdk.compiler 两个模块
中文关键词,我用了自己的风格,不喜欢的话,可以自行修改。
jdk10langtoolssrcjava.compilershareclassesjavaxlangmodelSourceVersion.java
改最后一个函数,添加一些中文关键字的判断:
public static boolean isKeyword(CharSequence s, SourceVersion version) {
String id = s.toString();
switch(id) {
// A trip through history
case "strictfp":
case "严":
return version.compareTo(RELEASE_2) >= 0;
case "assert":
case "断":
return version.compareTo(RELEASE_4) >= 0;
case "enum":
case "举":
return version.compareTo(RELEASE_5) >= 0;
case "_":
return version.compareTo(RELEASE_9) >= 0;
// Keywords common across versions
// Modifiers
case "public": case "protected": case "private":
case "abstract": case "static": case "final":
case "transient": case "volatile": case "synchronized":
case "native":
case "公": case "保": case "私":
case "象": case "固": case "终":
case "暂": case "易": case "同":
case "原":
// Declarations
case "class": case "interface": case "extends":
case "package": case "throws": case "implements":
case "类": case "接": case "承":
case "包": case "弃": case "成":
// Primitive types and void
case "boolean": case "byte": case "char":
case "short": case "int": case "long":
case "float": case "double":
case "void":
case "不二": case "字": case "符":
case "短": case "整": case "长":
case "浮": case "双":
case "空":
// Control flow
case "if": case "else":
case "try": case "catch": case "finally":
case "do": case "while":
case "for": case "continue":
case "switch": case "case": case "default":
case "break": case "throw": case "return":
case "如": case "另":
case "试": case "捕": case "末":
case "运": case "当":
case "为": case "继":
case "分": case "例": case "默":
case "破": case "抛": case "返":
// Other keywords
case "this": case "new": case "super":
case "import": case "instanceof":
case "此": case "新": case "超":
case "进": case "是":
// Forbidden!
case "goto": case "const":
case "去": case "常":
// literals
case "null": case "true": case "false":
case "无": case "真": case "假":
return true;
default:
return false;
}
jdk10langtoolssrcjdk.compilershareclassescomsuntoolsjavacparserTokens.java
修改 Tokens 这个类
public class Tokens {
...
/** The names of all tokens.
*/
//private Name[] tokenName = new Name[TokenKind.values().length];
private Name[] tokenName = new Name[2 * TokenKind.values().length];
// 添加了中文关键字,长度*2
...
/* 原代码
protected Tokens(Context context) {
context.put(tokensKey, this);
names = Names.instance(context);
for (TokenKind t : TokenKind.values()) {
if (t.name != null)
enterKeyword(t.name, t);
else
tokenName[t.ordinal()] = null;
}
key = new TokenKind[maxKey+1];
for (int i = 0; i <= maxKey; i++) key[i] = TokenKind.IDENTIFIER;
for (TokenKind t : TokenKind.values()) {
if (t.name != null)
key[tokenName[t.ordinal()].getIndex()] = t;
}
}
private void enterKeyword(String s, TokenKind token) {
Name n = names.fromString(s);
tokenName[token.ordinal()] = n;
if (n.getIndex() > maxKey) maxKey = n.getIndex();
}
*/
protected Tokens(Context context) {
context.put(tokensKey, this);
names = Names.instance(context);
for (TokenKind t : TokenKind.values()) {
if (t.name != null) {
Name n = names.fromString(t.name);
tokenName[2 * t.ordinal()] = n;
if (n.getIndex() > maxKey) maxKey = n.getIndex();
if (t.name_cn != null) {
Name n_cn = names.fromString(t.name_cn);
tokenName[2 * t.ordinal() + 1] = n_cn;
if (n_cn.getIndex() > maxKey) maxKey = n_cn.getIndex();
}
else {
tokenName[2 * t.ordinal() + 1] = null;
}
}
//enterKeyword(t.name, t);
//直接不用了,重新写了
else {
tokenName[2 * t.ordinal()] = null;
tokenName[2 * t.ordinal() + 1] = null;
}
}
key = new TokenKind[maxKey+1];
for (int i = 0; i <= maxKey; i++) key[i] = TokenKind.IDENTIFIER;
for (TokenKind t : TokenKind.values()) {
if (t.name != null) {
key[tokenName[2 * t.ordinal()].getIndex()] = t;
if (t.name_cn != null) {
key[tokenName[2 * t.ordinal() + 1].getIndex()] = t;
}
}
}
}
}
...
/**
* This enum defines all tokens used by the javac scanner. A token is
* optionally associated with a name.
*/
//添加中文关键词表,在英文单词,后面加一个中文词
// e.g. ABSTRACT("abstract"), --> ABSTRACT("abstract", "象"),
// ASSERT("assert", Tag.NAMED), --> ASSERT("assert", "断", Tag.NAMED),
// 具体实现可看结尾的构造函数,比较简单
public enum TokenKind implements Formattable, Filter<TokenKind> {
EOF(),
ERROR(),
IDENTIFIER(Tag.NAMED),
ABSTRACT("abstract", "象"),
ASSERT("assert", "断", Tag.NAMED),
BOOLEAN("boolean", "不二", Tag.NAMED),
BREAK("break", "破"),
BYTE("byte", "字", Tag.NAMED),
CASE("case", "例"),
CATCH("catch", "捕"),
CHAR("char", "符", Tag.NAMED),
CLASS("class", "类"),
CONST("const", "常"),
CONTINUE("continue", "继"),
DEFAULT("default", "默"),
DO("do", "运"),
DOUBLE("double", "双", Tag.NAMED),
ELSE("else", "另"),
ENUM("enum", "举", Tag.NAMED),
EXTENDS("extends", "承"),
FINAL("final", "终"),
FINALLY("finally", "末"),
FLOAT("float", "浮", Tag.NAMED),
FOR("for", "为"),
GOTO("goto", "去"),
IF("if", "如"),
IMPLEMENTS("implements", "成"),
IMPORT("import", "进"),
INSTANCEOF("instanceof", "是"),
INT("int", "整", Tag.NAMED),
INTERFACE("interface", "接"),
LONG("long", "长", Tag.NAMED),
NATIVE("native", "原"),
NEW("new", "新"),
PACKAGE("package", "包"),
PRIVATE("private", "私"),
PROTECTED("protected", "保"),
PUBLIC("public", "公"),
RETURN("return", "返"),
SHORT("short", "短", Tag.NAMED),
STATIC("static", "固"),
STRICTFP("strictfp", "严"),
SUPER("super", "超", Tag.NAMED),
SWITCH("switch", "分"),
SYNCHRONIZED("synchronized", "同"),
THIS("this", "此", Tag.NAMED),
THROW("throw", "抛"),
THROWS("throws", "弃"),
TRANSIENT("transient", "暂"),
TRY("try", "试"),
VOID("void", "空", Tag.NAMED),
VOLATILE("volatile", "易"),
WHILE("while", "当"),
INTLITERAL(Tag.NUMERIC),
LONGLITERAL(Tag.NUMERIC),
FLOATLITERAL(Tag.NUMERIC),
DOUBLELITERAL(Tag.NUMERIC),
CHARLITERAL(Tag.NUMERIC),
STRINGLITERAL(Tag.STRING),
TRUE("true", "真", Tag.NAMED),
FALSE("false", "假", Tag.NAMED),
NULL("null", "无", Tag.NAMED),
UNDERSCORE("_", Tag.NAMED),
ARROW("->"),
COLCOL("::"),
LPAREN("("),
RPAREN(")"),
LBRACE("{"),
RBRACE("}"),
LBRACKET("["),
RBRACKET("]"),
SEMI(";"),
COMMA(","),
DOT("."),
ELLIPSIS("..."),
EQ("="),
GT(">"),
LT("<"),
BANG("!"),
TILDE("~"),
QUES("?"),
COLON(":"),
EQEQ("=="),
LTEQ("<="),
GTEQ(">="),
BANGEQ("!="),
AMPAMP("&&"),
BARBAR("||"),
PLUSPLUS("++"),
SUBSUB("--"),
PLUS("+"),
SUB("-"),
STAR("*"),
SLASH("/"),
AMP("&"),
BAR("|"),
CARET("^"),
PERCENT("%"),
LTLT("<<"),
GTGT(">>"),
GTGTGT(">>>"),
PLUSEQ("+="),
SUBEQ("-="),
STAREQ("*="),
SLASHEQ("/="),
AMPEQ("&="),
BAREQ("|="),
CARETEQ("^="),
PERCENTEQ("%="),
LTLTEQ("<<="),
GTGTEQ(">>="),
GTGTGTEQ(">>>="),
MONKEYS_AT("@"),
CUSTOM;
public final String name;
public final String name_cn; //添加的中文关键词的String
public final Tag tag;
//因为添加了一个中文关键字的String,初始化得简单修改
TokenKind() {
//this(null, Tag.DEFAULT); //原代码
this(null, null, Tag.DEFAULT); //新代码
}
TokenKind(String name) {
//this(name, Tag.DEFAULT); //原代码
this(name, null, Tag.DEFAULT); //新代码
}
TokenKind(Tag tag) {
//this(null, tag); //原代码
this(null, null, tag); //新代码
}
// 原有的构造函数,改为调用新的构造函数
TokenKind(String name, Tag tag) {
//this.name = name;
//this.tag = tag;
this(name, null, tag);
}
// 添加新的构造形式
TokenKind(String name, String name_cn) {
//this.name = name;
//this.tag = tag;
this(name, name_cn, Tag.DEFAULT);
}
// 新添加的构造函数
TokenKind(String name, String name_cn, Tag tag) {
this.name = name;
this.name_cn = name_cn;
this.tag = tag;
}
以上两个源文件改好之后,保存为UTF-8格式。主要是我比较喜欢UTF-8格式,如果你想用GBK等其他格式,后面的参数,和中文源代码,都配套用相同格式就行。
加好代码后,编译参数也需要改一下,因为源代码里加了utf-8字符给 java.compiler、jdk.compiler 加上-encoding UTF-8 的选项。
jdk10/make/CompileJavaModules.gmk
line 88:
java.compiler_ADD_JAVAC_FLAGS += -encoding UTF-8 -Xdoclint:all/protected '-Xdoclint/package:java.*,javax.*'
line 354:
jdk.compiler_ADD_JAVAC_FLAGS += -encoding UTF-8 -Xdoclint:all/protected '-Xdoclint/package:-com.sun.tools.*,-jdk.internal.*' \
-XDstringConcat=inline
编译完成之后,下面这段代码,可以顺利编译,打印。
OpenJDK10估计默认源代码为UTF-8,所以编译不需要加 -encoding UTF-8 参数。
包 hello;
公 类 Hello {
公 固 空 main(String[] args) {
System.out.println("你好 SwizL!");
}
}
OpenJDK10估计默认源代码为UTF-8,所以编译不需要加 -encoding UTF-8 参数。
参考:

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
中文代码之Spring Boot添加基本日志
之前中文代码之Spring Boot实现简单REST服务的演示服务不知为何中止. 新开issue: 演示服务中止 · Issue #2 · program-in-chinese/programming_term_dictionary. 毫无线索的情况下, 先添加日志: program-in-chinese/programming_term_dictionary application.yml: logging: file: 日志.log 词典控制器.java: @RestController public class 词典控制器 { private static final Logger 笔录 = LoggerFactory.getLogger(词典控制器.class); ... @GetMapping("/") @ResponseBody public 词条 取词条(@RequestParam(name = "term", required = false, defaultValue = "") String 英文术语) { 笔录.info("输入: " + 英文术语); ... }...
-
下一篇
中文代码之Spring Boot集成H2内存数据库
续前文: 中文代码之Spring Boot添加基本日志, 源码库地址相同. 鉴于此项目中的数据总量不大(即使万条词条也在1MB之内), 当前选择轻量级而且配置简单易于部署的H2内存数据库比较合理. 此文仅演示实现H2的集成, 还未修改服务本身功能. 相关commit在: 集成H2数据库 · program-in-chinese/programming_term_dictionary@dc29be7 应用.java public class 应用 implements CommandLineRunner { private static final Logger 笔录 = LoggerFactory.getLogger(应用.class); private final 词库接口 词库; @Autowired public 应用(词库接口 词库) { this.词库 = 词库; } ... @Override public void run(String ...参数) throws Exception { 词条 词条1 = new 词条(1L, "集合"); 词条 词条2 = new 词条...
相关文章
文章评论
共有0条评论来说两句吧...