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 參數。
參考: