From bf640bd7e5d7424dcacc3c2de09861ea3a54f57c Mon Sep 17 00:00:00 2001 From: zhou2022 Date: Fri, 12 Jul 2024 00:08:14 +0800 Subject: [PATCH 1/7] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9EMOP=E8=BD=ACCJ?= =?UTF-8?q?=E5=A4=84=E7=90=86=EF=BC=8C=E4=BD=86=E9=9C=80=E8=A6=81=E6=89=8B?= =?UTF-8?q?=E5=8A=A8=E5=88=A0=E9=99=A4=E9=87=8D=E5=90=8D=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/codegen/AssignStatement.java | 11 ++- .../java/com/example/codegen/AstNode.java | 2 + .../com/example/codegen/CallExpression.java | 5 ++ .../com/example/codegen/CallStatement.java | 4 + .../java/com/example/codegen/CodeGenCJ.java | 82 +++++++++++++++++++ .../com/example/codegen/CodeGenCSharp.java | 1 - .../java/com/example/codegen/CodeGenJava.java | 10 +-- .../java/com/example/codegen/Constant.java | 4 + .../example/codegen/DeclareExpression.java | 15 ++++ src/main/java/com/example/codegen/Field.java | 12 ++- .../java/com/example/codegen/Identifier.java | 4 + src/main/java/com/example/codegen/Klass.java | 14 ++++ .../com/example/codegen/LoopStatement.java | 5 ++ src/main/java/com/example/codegen/Method.java | 38 +++++++++ .../example/codegen/NewArrayExpression.java | 16 ++++ .../codegen/NewInstanceExpression.java | 5 ++ .../com/example/codegen/NewStatement.java | 5 ++ .../java/com/example/codegen/Parameter.java | 5 ++ src/main/java/com/example/codegen/Parser.java | 6 +- .../com/example/codegen/ReturnStatement.java | 5 ++ .../com/example/codegen/SpawnExpression.java | 11 +++ .../com/example/codegen/SpawnStatement.java | 5 ++ src/main/java/com/example/codegen/Type.java | 36 ++++++++ .../java/com/example/codegen/Variable.java | 37 +++++++++ .../java/com/example/codegen/Variables.java | 22 ++++- src/main/java/com/example/utils/CJUtils.java | 30 +++++++ .../java/com/example/utils/classNode.java | 15 ++++ 27 files changed, 393 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/example/codegen/CodeGenCJ.java create mode 100644 src/main/java/com/example/utils/CJUtils.java create mode 100644 src/main/java/com/example/utils/classNode.java diff --git a/src/main/java/com/example/codegen/AssignStatement.java b/src/main/java/com/example/codegen/AssignStatement.java index 9631383..4689ef7 100644 --- a/src/main/java/com/example/codegen/AssignStatement.java +++ b/src/main/java/com/example/codegen/AssignStatement.java @@ -4,7 +4,7 @@ import java.util.Optional; public class AssignStatement implements Statement { public DeclareExpression declareVariable; - // please wrap both type and left expression in a bracket if you want to force cast like (int)(a.b) + // please wrap the type and left expression in a bracket if you want to force cast like (int)(a.b) public Optional castType; public Expression leftExpression; @@ -31,4 +31,13 @@ public class AssignStatement implements Statement { public String toCSharp() { return declareVariable.toCSharp() + " = " + (castType.isPresent() ? "(" + castType.get().toCSharp() + ")" : "") + (castType.isPresent() ? "(" : "") + leftExpression.toCSharp() + (castType.isPresent() ? ")" : "") + ";"; } + + @Override + public String toCJ() { + String typeChange = ""; + if(castType.isPresent()){ + typeChange = " as " + (castType.get().toCJ().charAt(0)=='?' ? castType.get().toCJ().substring(1) : castType.get().toCJ()); + } + return declareVariable.toCJ() + " = " + leftExpression.toCJ() + typeChange ; + } } diff --git a/src/main/java/com/example/codegen/AstNode.java b/src/main/java/com/example/codegen/AstNode.java index 17653ea..9b09c7a 100644 --- a/src/main/java/com/example/codegen/AstNode.java +++ b/src/main/java/com/example/codegen/AstNode.java @@ -8,4 +8,6 @@ public interface AstNode { String toJs(); String toCSharp(); + + String toCJ(); } diff --git a/src/main/java/com/example/codegen/CallExpression.java b/src/main/java/com/example/codegen/CallExpression.java index 5bdebe1..2e379f3 100644 --- a/src/main/java/com/example/codegen/CallExpression.java +++ b/src/main/java/com/example/codegen/CallExpression.java @@ -34,4 +34,9 @@ public class CallExpression implements Expression { public String toCSharp() { return (className.map(s -> s + ".").orElse("")) + methodName + "(" + String.join(", ", args.stream().map(Variables::toCSharp).toArray(String[]::new)) + ")"; } + + @Override + public String toCJ() { + return (className.map(s -> s + ".").orElse("")) + methodName + "(" + String.join(", ", args.stream().map(Variables::toCJ).toArray(String[]::new)) + ")"; + } } diff --git a/src/main/java/com/example/codegen/CallStatement.java b/src/main/java/com/example/codegen/CallStatement.java index 685e1de..4de3e1e 100644 --- a/src/main/java/com/example/codegen/CallStatement.java +++ b/src/main/java/com/example/codegen/CallStatement.java @@ -24,4 +24,8 @@ public class CallStatement implements Statement { public String toCSharp() { return callExpression.toCSharp() + ";"; } + + public String toCJ() { + return callExpression.toCJ(); + } } diff --git a/src/main/java/com/example/codegen/CodeGenCJ.java b/src/main/java/com/example/codegen/CodeGenCJ.java new file mode 100644 index 0000000..838eafd --- /dev/null +++ b/src/main/java/com/example/codegen/CodeGenCJ.java @@ -0,0 +1,82 @@ +package com.example.codegen; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.FileReader; +import java.io.FileWriter; +import java.util.Optional; + +public class CodeGenCJ { + public static void main(String[] args) { + String name = "gcbench1"; + String kLassPath = "src/main/resources/"+name+"/MainClasses.txt"; + String dSLProgramPath = "src/main/resources/"+name+"/dslProgram.txt"; + String dslInitPath = "src/main/resources/"+name+"/"; + String outputJavaDir = "src/main/resources/"+name+"/cj/"; + String outputMainPath = outputJavaDir + "main.cj"; +// String name = "array"; +// String kLassPath = "src/main/resources/"+name+"/"+name+"Class.txt"; +// String dSLProgramPath = "src/main/resources/"+name+"/"+name+"Func.txt"; +// String dslInitPath = "src/main/resources/"+name+"/"; +// String outputJavaDir = "src/main/resources/"+name+"/"; +// String outputMainPath = outputJavaDir + "Program.cj"; + try { + Type.disableInterface = false; + BufferedWriter writer = new BufferedWriter(new FileWriter(outputMainPath)); + BufferedReader klassReader = new BufferedReader(new FileReader(kLassPath)); + BufferedReader dSLProgramReader = new BufferedReader(new FileReader(dSLProgramPath)); + writer.write("from std import collection.*\n\n"); + // test is klassReader is empty without readline + Optional klass = Optional.empty(); + do { + klass = Parser.parserKlass(klassReader); + if (klass.isPresent()) { + Klass k = klass.get(); + writer.write(k.toCJ().replace('$', '_')); + writer.newLine(); + } + } while (klass.isPresent()); + writer.newLine(); + Type.disableInterface = true; + + writer.newLine(); + Optional program = Optional.empty(); + do { + program = Parser.parserMethod("", dSLProgramReader); + if (program.isPresent()) { + Method m = program.get(); + writer.write(m.toCJ().replace('$', '_')); + writer.newLine(); + } + } while (program.isPresent()); + writer.newLine(); + writer.close(); + klassReader.close(); + dSLProgramReader.close(); + + // find all Main*.txt files expect MainClasses.txt in dslInitPath + // for each file, generate a Main*.cs file under outputJavaDir using parserKlass + Optional klassInit = Optional.empty(); + for (String file : new java.io.File(dslInitPath).list()) { + if (file.startsWith("Main") && file.endsWith(".txt") && !file.equals("MainClasses.txt")) { + BufferedReader klassInitReader = new BufferedReader(new FileReader(dslInitPath + file)); + String outputInitPath = outputJavaDir + file.replace(".txt", ".cj"); + writer = new BufferedWriter(new FileWriter(outputInitPath)); + do { + klassInit = Parser.parserKlass(klassInitReader); + if (klassInit.isPresent()) { + Klass k = klassInit.get(); + writer.write(k.toCJ().replace('$', '_')); + writer.newLine(); + } + } while (klassInit.isPresent()); + writer.close(); + klassInitReader.close(); + } + } + + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/example/codegen/CodeGenCSharp.java b/src/main/java/com/example/codegen/CodeGenCSharp.java index 224d5ce..7c96f01 100644 --- a/src/main/java/com/example/codegen/CodeGenCSharp.java +++ b/src/main/java/com/example/codegen/CodeGenCSharp.java @@ -33,7 +33,6 @@ public class CodeGenCSharp { } } while (klass.isPresent()); writer.newLine(); - // collect all classes first, all type not in classSet will be treated as Interface and be replaced by Object Type.disableInterface = true; writer.write("class Example {"); diff --git a/src/main/java/com/example/codegen/CodeGenJava.java b/src/main/java/com/example/codegen/CodeGenJava.java index 9b6ace5..82474d4 100644 --- a/src/main/java/com/example/codegen/CodeGenJava.java +++ b/src/main/java/com/example/codegen/CodeGenJava.java @@ -8,10 +8,11 @@ import java.util.Optional; public class CodeGenJava { public static void main(String[] args) { - String kLassPath = "src/main/resources/guava/MainClasses.txt"; - String dSLProgramPath = "src/main/resources/guava/dslProgram.txt"; - String dslInitPath = "src/main/resources/guava/"; - String outputJavaDir = "src/main/resources/java/"; + String name = "gcbench1"; + String kLassPath = "src/main/resources/"+name+"/MainClasses.txt"; + String dSLProgramPath = "src/main/resources/"+name+"/dslProgram.txt"; + String dslInitPath = "src/main/resources/"+name+"/"; + String outputJavaDir = "src/main/resources/"+name+"/java/"; String outputMainPath = outputJavaDir + "Main.java"; try { Type.disableInterface = false; @@ -31,7 +32,6 @@ public class CodeGenJava { } } while (klass.isPresent()); writer.newLine(); - // collect all classes first, all type not in classSet will be treated as Interface and be replaced by Object Type.disableInterface = true; writer.write("public class Main {"); diff --git a/src/main/java/com/example/codegen/Constant.java b/src/main/java/com/example/codegen/Constant.java index e2b3182..c0a940b 100644 --- a/src/main/java/com/example/codegen/Constant.java +++ b/src/main/java/com/example/codegen/Constant.java @@ -25,4 +25,8 @@ public class Constant implements Expression { public String toCSharp() { return value; } + + public String toCJ() { + return value; + } } diff --git a/src/main/java/com/example/codegen/DeclareExpression.java b/src/main/java/com/example/codegen/DeclareExpression.java index 67fe1c5..d6db198 100644 --- a/src/main/java/com/example/codegen/DeclareExpression.java +++ b/src/main/java/com/example/codegen/DeclareExpression.java @@ -1,5 +1,7 @@ package com.example.codegen; +import com.example.utils.CJUtils; + import java.util.Optional; public class DeclareExpression implements Expression { @@ -32,4 +34,17 @@ public class DeclareExpression implements Expression { public String toCSharp() { return (variableType.map(type -> type.toCSharp() + " ").orElse("")) + variable.toCSharp(); } + + @Override + public String toCJ() { + String name = variable.toCJ(); + if(variableType.isPresent()){ + if(CJUtils.spawnParamSet.contains(name)) + return "let " + name + ": " + variableType.get().toCJ(); + else + return "var " + name + ": " + variableType.get().toCJ(); + }else { + return name; + } + } } diff --git a/src/main/java/com/example/codegen/Field.java b/src/main/java/com/example/codegen/Field.java index 35a69fc..c2902d5 100644 --- a/src/main/java/com/example/codegen/Field.java +++ b/src/main/java/com/example/codegen/Field.java @@ -1,14 +1,19 @@ package com.example.codegen; +import com.example.utils.CJUtils; +import com.example.utils.classNode; + public class Field implements AstNode { public boolean isStatic; public Type fieldType; public Variable fieldName; + public String className; - public Field(boolean isStatic, Type type, Variable s) { + public Field(boolean isStatic, Type type, Variable s, String className) { this.isStatic = isStatic; this.fieldType = type; this.fieldName = s; + this.className = className; } public String toJava() { @@ -32,4 +37,9 @@ public class Field implements AstNode { public String toCSharp() { return "public " + (isStatic ? "static " : "") + fieldType.toCSharp() + " " + fieldName.toCSharp() + ";"; } + + public String toCJ() { + + return "public " + (isStatic ? "static "+ "var "+ className+ "_" +fieldName.toCJ() : "var "+ fieldName.toCJ()) + ": " + fieldType.toCJ() + " = " + CJUtils.getDefaultValue(fieldType.toCJ()); + } } diff --git a/src/main/java/com/example/codegen/Identifier.java b/src/main/java/com/example/codegen/Identifier.java index b405148..0fb9bf0 100644 --- a/src/main/java/com/example/codegen/Identifier.java +++ b/src/main/java/com/example/codegen/Identifier.java @@ -26,4 +26,8 @@ public class Identifier implements AstNode { public String toCSharp() { return name; } + + public String toCJ() { + return name; + } } diff --git a/src/main/java/com/example/codegen/Klass.java b/src/main/java/com/example/codegen/Klass.java index 399f40c..1c9e5f9 100644 --- a/src/main/java/com/example/codegen/Klass.java +++ b/src/main/java/com/example/codegen/Klass.java @@ -1,5 +1,8 @@ package com.example.codegen; +import com.example.utils.CJUtils; +import com.example.utils.classNode; + import java.util.ArrayList; import java.util.Arrays; import java.util.Optional; @@ -88,4 +91,15 @@ public class Klass implements AstNode { } }}) + "\n}"; } + + public String toCJ(){ + return "public open class " + className.replace('$', '_') + Super.map(s -> " <: " + (s.fieldType.toCJ().charAt(0)=='?' ? s.fieldType.toCJ().substring(1) : s.fieldType.toCJ()).replace('$', '_')).orElse("") + " {\n" + String.join("\n", new ArrayList() {{ + for (Field field : fields) { + add(field.toCJ()); + } + for (Method method : methods) { + add(method.toCJ()); + } + }}) + "\n}\n"; + } } diff --git a/src/main/java/com/example/codegen/LoopStatement.java b/src/main/java/com/example/codegen/LoopStatement.java index 3e0852e..537dae0 100644 --- a/src/main/java/com/example/codegen/LoopStatement.java +++ b/src/main/java/com/example/codegen/LoopStatement.java @@ -43,4 +43,9 @@ public class LoopStatement implements Statement { return String.format("for(int %s = %s; %s < %s; %s += %s)", indexVar.toCSharp(), startVal.toCSharp(), indexVar.toCSharp(), endVal.toCSharp(), indexVar.toCSharp(), stepVal.toCSharp()) + "{\n" + String.join("\n", statements.stream().map(Statement::toCSharp).toArray(String[]::new)) + "\n}"; } + + public String toCJ() { + return String.format("for (%s in %s..%s:%s)", indexVar.toCJ(), startVal.toCJ(), endVal.toCJ(), stepVal.toCJ()) + + "{\n" + String.join("\n", statements.stream().map(Statement::toCJ).toArray(String[]::new)) + "\n}"; + } } diff --git a/src/main/java/com/example/codegen/Method.java b/src/main/java/com/example/codegen/Method.java index 070e959..5f0bda9 100644 --- a/src/main/java/com/example/codegen/Method.java +++ b/src/main/java/com/example/codegen/Method.java @@ -1,5 +1,7 @@ package com.example.codegen; +import com.example.utils.CJUtils; + import java.util.Arrays; import java.util.Optional; @@ -52,4 +54,40 @@ public class Method implements AstNode { String post_spawn = useSpawn ? String.format("\n%s.ForEach(thread => {\n" + "thread.Join();\n" + "});\n", SpawnStatement.threadsPool) : ""; return "public static " + returnType.toCSharp() + " " + className.map(s -> s + ".").orElse("") + (funcName.equals("main") ? "Main" : funcName) + "(" + String.join(", ", Arrays.stream(parameters).map(Parameter::toCSharp).toArray(String[]::new)) + ")" + "{" + pre_spawn + "\n" + String.join("\n", Arrays.stream(stmts).map(Statement::toCSharp).toArray(String[]::new)) + post_spawn + "\n}"; } + + public String toCJ(){ + String paramList = ""; + for(Parameter par : parameters){ + paramList += par.toCJ() + ", "; + } + if(!paramList.equals("")) + paramList = paramList.substring(0, paramList.length()-2); + String stmtList = ""; + String returnStmt = ""; + if(stmts.length > 0){ + for (int i = 0; i < stmts.length-1; i++) { + stmtList += "\t" + stmts[i].toCJ() + "\n"; + } + if(stmts[stmts.length-1] instanceof ReturnStatement ) + returnStmt = "\t" + stmts[stmts.length-1].toCJ() + "\n"; + else + stmtList += "\t" + stmts[stmts.length-1].toCJ() + "\n"; + } + + CJUtils.spawnParamSet.clear(); + + String classStr = ""; + if(className.isPresent()) + classStr = className.get()+"."; + String preSpawn = ""; + String postSpawn = ""; + if(useSpawn){ + preSpawn = "\tvar futureList = ArrayList>()\n"; + postSpawn = "\tfor (fut in futureList) { fut.get() }\n"; + } + if(funcName.equals("main")) + return funcName+ "(" + paramList+"): " + returnType.toCJ() + " {\n" + preSpawn + stmtList + postSpawn + returnStmt + "\n}\n"; + else + return "func "+ classStr + funcName+ "(" + paramList+"): " + returnType.toCJ() + " {\n" + preSpawn + stmtList + postSpawn + returnStmt + "\n}\n"; + } } diff --git a/src/main/java/com/example/codegen/NewArrayExpression.java b/src/main/java/com/example/codegen/NewArrayExpression.java index 7740838..fb0bb25 100644 --- a/src/main/java/com/example/codegen/NewArrayExpression.java +++ b/src/main/java/com/example/codegen/NewArrayExpression.java @@ -1,5 +1,7 @@ package com.example.codegen; +import com.example.utils.CJUtils; + public class NewArrayExpression implements Expression { public Type type; public long dimensions; @@ -32,4 +34,18 @@ public class NewArrayExpression implements Expression { public String toCSharp() { return "new " + type.toCSharp() + "[" + length.toCSharp() + "]" + "[]".repeat((int) (dimensions - 1)); } + + public String toCJ(){ + assert dimensions > 0; + String innerType = type.toCJ(); + if(innerType.startsWith("Option<")) + innerType = innerType.substring(7, innerType.length()-1); + for (int i = 0; i < dimensions - 1; i++) { + innerType = "?Array<" + innerType + ">"; + } + + String initVal = CJUtils.getDefaultValue(innerType); + + return "Array<" + innerType + ">("+ length.toCJ() + ", item: "+ initVal + ")"; + } } diff --git a/src/main/java/com/example/codegen/NewInstanceExpression.java b/src/main/java/com/example/codegen/NewInstanceExpression.java index 6fe8783..c4ef783 100644 --- a/src/main/java/com/example/codegen/NewInstanceExpression.java +++ b/src/main/java/com/example/codegen/NewInstanceExpression.java @@ -26,4 +26,9 @@ public class NewInstanceExpression implements Expression { public String toCSharp() { return "new " + className.toCSharp() + "()"; } + + @Override + public String toCJ() { + return className.toCJ() + "()"; + } } diff --git a/src/main/java/com/example/codegen/NewStatement.java b/src/main/java/com/example/codegen/NewStatement.java index 3ad5519..bab80ee 100644 --- a/src/main/java/com/example/codegen/NewStatement.java +++ b/src/main/java/com/example/codegen/NewStatement.java @@ -24,4 +24,9 @@ public class NewStatement implements Statement { public String toCSharp() { return newExpr.toCSharp() + ";"; } + + @Override + public String toCJ() { + return newExpr.toCJ(); + } } diff --git a/src/main/java/com/example/codegen/Parameter.java b/src/main/java/com/example/codegen/Parameter.java index 9bf5443..b43c7bc 100644 --- a/src/main/java/com/example/codegen/Parameter.java +++ b/src/main/java/com/example/codegen/Parameter.java @@ -26,4 +26,9 @@ public class Parameter implements AstNode { public String toCSharp() { return parameterType.toCSharp() + " " + parameterName; } + + @Override + public String toCJ() { + return parameterName + ": " + parameterType.toCJ(); + } } diff --git a/src/main/java/com/example/codegen/Parser.java b/src/main/java/com/example/codegen/Parser.java index 918bab6..288a7d6 100644 --- a/src/main/java/com/example/codegen/Parser.java +++ b/src/main/java/com/example/codegen/Parser.java @@ -131,7 +131,7 @@ public class Parser { // // 实例变量类型, 如 static String str // field = ["static "], type, " ", identifier; - public static Optional parserField(String line) { + public static Optional parserField(String line, String className) { String[] strs = line.strip().split("[;\\s]+"); if (strs.length != 3 && strs.length != 2) { return Optional.empty(); @@ -155,7 +155,7 @@ public class Parser { if (variable.isEmpty()) { return Optional.empty(); } - return Optional.of(new Field(isStatic, type.get(), variable.get())); + return Optional.of(new Field(isStatic, type.get(), variable.get(), className)); } @@ -570,7 +570,7 @@ public class Parser { if (line.strip().isEmpty()) { continue; } - Optional field = parserField(line); + Optional field = parserField(line, className); if (field.isPresent()) { fields.add(field.get()); continue; diff --git a/src/main/java/com/example/codegen/ReturnStatement.java b/src/main/java/com/example/codegen/ReturnStatement.java index 09cdb0d..9c57e30 100644 --- a/src/main/java/com/example/codegen/ReturnStatement.java +++ b/src/main/java/com/example/codegen/ReturnStatement.java @@ -24,4 +24,9 @@ public class ReturnStatement implements Statement { public String toCSharp() { return "return" + " " + variables.toCSharp() + ";"; } + + @Override + public String toCJ() { + return "return " + variables.toCJ(); + } } diff --git a/src/main/java/com/example/codegen/SpawnExpression.java b/src/main/java/com/example/codegen/SpawnExpression.java index 59bc17e..1be3dc7 100644 --- a/src/main/java/com/example/codegen/SpawnExpression.java +++ b/src/main/java/com/example/codegen/SpawnExpression.java @@ -1,10 +1,16 @@ package com.example.codegen; +import com.example.utils.CJUtils; + public class SpawnExpression implements Expression { public CallExpression callExpression; public SpawnExpression(CallExpression callExpression) { this.callExpression = callExpression; + // for CJ let + for(Variables arg : callExpression.args){ + CJUtils.spawnParamSet.add(arg.toCJ()); + } } @Override @@ -26,4 +32,9 @@ public class SpawnExpression implements Expression { public String toCSharp() { return "new Thread(() => " + callExpression.toCSharp() + ")"; } + + @Override + public String toCJ() { + return "spawn { => "+ callExpression.toCJ() +" }"; + } } diff --git a/src/main/java/com/example/codegen/SpawnStatement.java b/src/main/java/com/example/codegen/SpawnStatement.java index ad67c79..b9874c0 100644 --- a/src/main/java/com/example/codegen/SpawnStatement.java +++ b/src/main/java/com/example/codegen/SpawnStatement.java @@ -30,4 +30,9 @@ public class SpawnStatement implements Statement { public String toCSharp() { return threadsPool + ".Add(" + spawnExpression.toCSharp() + ");\n" + threadsPool + ".Last().Start();"; } + + @Override + public String toCJ() { + return "futureList.append(" + spawnExpression.toCJ() + ")"; + } } diff --git a/src/main/java/com/example/codegen/Type.java b/src/main/java/com/example/codegen/Type.java index 63bc224..cd0ff26 100644 --- a/src/main/java/com/example/codegen/Type.java +++ b/src/main/java/com/example/codegen/Type.java @@ -1,6 +1,10 @@ package com.example.codegen; +import com.example.utils.CJUtils; + +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; public class Type implements AstNode { public String type; @@ -146,4 +150,36 @@ public class Type implements AstNode { public String toCSharp() { return toCSharpType(type) + "[]".repeat(dimension); } + + public static String toCJType(String type){ + Map map = new HashMap<>(); + map.put("byte", "Byte"); + map.put("char", "Char"); + map.put("boolean", "Bool"); + map.put("short", "Int8"); + map.put("int", "Int64"); + map.put("float", "Float32"); + map.put("double", "Float64"); + map.put("long", "Int64"); + map.put("void", "Unit"); + map.put("null", "None"); + map.put("", ""); + String res = type; + if(map.containsKey(res)) + res = map.get(res); + if(CJUtils.defaultValue.containsKey(res)) + return res; + return "?" + res; + } + + public String toCJ(){ + String typeTem = type; + if(type.equals("java_lang_Object")) + typeTem = "Object"; + String res = toCJType(typeTem); + for (int i = 0; i < dimension; i++) { + res = "?Array<" + res + ">"; + } + return res; + } } diff --git a/src/main/java/com/example/codegen/Variable.java b/src/main/java/com/example/codegen/Variable.java index 15f6a80..e88dadd 100644 --- a/src/main/java/com/example/codegen/Variable.java +++ b/src/main/java/com/example/codegen/Variable.java @@ -1,7 +1,9 @@ package com.example.codegen; import java.util.Arrays; +import java.util.HashSet; import java.util.Optional; +import java.util.Set; public class Variable implements Expression { // please handle null for each language in the toXXX method @@ -51,4 +53,39 @@ public class Variable implements Expression { // the null is keyword in C# return (IsCSharpKeywordExpectNULL(identifier) ? "@" + identifier : identifier) + (indexes.map(index -> "[" + String.join("][", index) + "]").orElse("")); } + + public boolean isCJKeyword(String s){ + Set keywords = new HashSet<>(); + // 将单词添加到 HashSet 中 + String[] words = { + "as", "abstract", "break", "Bool", "case", "catch", "class", "const", "continue", + "Char", "do", "else", "enum", "extend", "for", "from", "func", "false", "finally", + "foreign", "Float16", "Float32", "Float64", "if", "in", "is", "init", "import", + "interface", "Int8", "Int16", "Int32", "Int64", "IntNative", "let", "mut", "main", + "macro", "match", "Nothing", "open", "operator", "override", "prop", "public", + "package", "private", "protected", "quote", "redef", "return", "spawn", "super", + "static", "struct", "synchronized", "try", "this", "true", "type", "throw", "This", + "unsafe", "Unit", "UInt8", "UInt16", "UInt32", "UInt64", "UIntNative", "var", "where", "while" + }; + + for (String word : words) { + keywords.add(word); + } + return keywords.contains(s); + } + + @Override + public String toCJ() { + String str = ""; + if(indexes.isPresent()){ + for(String s : indexes.get()) + str += ".getOrThrow()["+ s +"]"; + } + if(isCJKeyword(identifier)) + return identifier+"HadTurn" + str; + else if(identifier.equals("null")) + return "None" + str; + else + return identifier + str; + } } diff --git a/src/main/java/com/example/codegen/Variables.java b/src/main/java/com/example/codegen/Variables.java index 6a8e87c..60ff294 100644 --- a/src/main/java/com/example/codegen/Variables.java +++ b/src/main/java/com/example/codegen/Variables.java @@ -1,11 +1,13 @@ package com.example.codegen; +import com.example.utils.CJUtils; + import java.util.ArrayList; import java.util.Optional; public class Variables implements Expression { // resvered for force cast - // please wrap both type and variables in a bracket if you want to force cast like (int)(a.b) + // please wrap the type and variables in a bracket if you want to force cast like (int)(a.b) public Optional type; public ArrayList variables; @@ -46,4 +48,22 @@ public class Variables implements Expression { public String toCSharp() { return (type.isPresent() ? "(" + type.get().toJava() + ")" : "") + (type.isPresent() ? "(" : "") + String.join(".", variables.stream().map(Expression::toCSharp).toArray(String[]::new)) + (type.isPresent() ? ")" : ""); } + + @Override + public String toCJ() { + String res = ""; + for (int i = 0; i < variables.size()-1; i++) { + String tmp = variables.get(i).toCJ(); + if(Type.classSet.contains(tmp)){ + res += tmp + "." + tmp + "_"; + } else { + res += tmp + ".getOrThrow()."; + } + } + + res += variables.get(variables.size()-1).toCJ(); + if(type.isPresent()) + return "(" + res + " as " + type.get().toCJ() +").getOrThrow()"; + return res; + } } diff --git a/src/main/java/com/example/utils/CJUtils.java b/src/main/java/com/example/utils/CJUtils.java new file mode 100644 index 0000000..5594ce0 --- /dev/null +++ b/src/main/java/com/example/utils/CJUtils.java @@ -0,0 +1,30 @@ +package com.example.utils; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +public class CJUtils { + public static Set spawnParamSet = new HashSet<>(); + public static Map classNodes = new HashMap<>(); + public static Map defaultValue = new HashMap<>(); + static { + defaultValue.put("Byte", "0"); + defaultValue.put("Char", "' '"); + defaultValue.put("Bool", "false"); + defaultValue.put("Int8", "0"); + defaultValue.put("Int32", "0"); + defaultValue.put("Float32", "0.0"); + defaultValue.put("Float64", "0.0"); + defaultValue.put("Int64", "0"); + defaultValue.put("Unit", "()"); + defaultValue.put("String", "\"\""); + } + public static String getDefaultValue(String rawType){ + if(defaultValue.containsKey(rawType)){ + return defaultValue.get(rawType); + } + return "None"; + } +} diff --git a/src/main/java/com/example/utils/classNode.java b/src/main/java/com/example/utils/classNode.java new file mode 100644 index 0000000..1046edc --- /dev/null +++ b/src/main/java/com/example/utils/classNode.java @@ -0,0 +1,15 @@ +package com.example.utils; + +import java.util.HashSet; +import java.util.Set; + +public class classNode { + public String className; + public String parent; + public Set fields; + public classNode(String className, String parent){ + this.className = className; + this.parent = parent; + + } +} -- Gitee From c7f53ac292ac47721218cfb6f57298409c9b03a9 Mon Sep 17 00:00:00 2001 From: zhou2022 Date: Fri, 12 Jul 2024 00:12:57 +0800 Subject: [PATCH 2/7] =?UTF-8?q?fix=EF=BC=9A=E8=83=BD=E5=A4=84=E7=90=86?= =?UTF-8?q?=E7=88=B6=E5=AD=90=E5=90=8C=E5=90=8D=E5=AD=97=E6=AE=B5=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/codegen/CodeGenCJ.java | 43 +++++++------- src/main/java/com/example/codegen/Field.java | 2 +- src/main/java/com/example/codegen/Klass.java | 12 ++++ .../java/com/example/codegen/Variable.java | 38 ++++++------ .../java/com/example/codegen/Variables.java | 58 ++++++++++++++++--- .../java/com/example/utils/classNode.java | 5 +- 6 files changed, 105 insertions(+), 53 deletions(-) diff --git a/src/main/java/com/example/codegen/CodeGenCJ.java b/src/main/java/com/example/codegen/CodeGenCJ.java index 838eafd..142b91b 100644 --- a/src/main/java/com/example/codegen/CodeGenCJ.java +++ b/src/main/java/com/example/codegen/CodeGenCJ.java @@ -21,6 +21,28 @@ public class CodeGenCJ { // String outputJavaDir = "src/main/resources/"+name+"/"; // String outputMainPath = outputJavaDir + "Program.cj"; try { + + // find all Main*.txt files expect MainClasses.txt in dslInitPath + // for each file, generate a Main*.cs file under outputJavaDir using parserKlass + Optional klassInit = Optional.empty(); + for (String file : new java.io.File(dslInitPath).list()) { + if (file.startsWith("Main") && file.endsWith(".txt") && !file.equals("MainClasses.txt")) { + BufferedReader klassInitReader = new BufferedReader(new FileReader(dslInitPath + file)); + String outputInitPath = outputJavaDir + file.replace(".txt", ".cj"); + BufferedWriter writer = new BufferedWriter(new FileWriter(outputInitPath)); + do { + klassInit = Parser.parserKlass(klassInitReader); + if (klassInit.isPresent()) { + Klass k = klassInit.get(); + writer.write(k.toCJ().replace('$', '_')); + writer.newLine(); + } + } while (klassInit.isPresent()); + writer.close(); + klassInitReader.close(); + } + } + Type.disableInterface = false; BufferedWriter writer = new BufferedWriter(new FileWriter(outputMainPath)); BufferedReader klassReader = new BufferedReader(new FileReader(kLassPath)); @@ -54,27 +76,6 @@ public class CodeGenCJ { klassReader.close(); dSLProgramReader.close(); - // find all Main*.txt files expect MainClasses.txt in dslInitPath - // for each file, generate a Main*.cs file under outputJavaDir using parserKlass - Optional klassInit = Optional.empty(); - for (String file : new java.io.File(dslInitPath).list()) { - if (file.startsWith("Main") && file.endsWith(".txt") && !file.equals("MainClasses.txt")) { - BufferedReader klassInitReader = new BufferedReader(new FileReader(dslInitPath + file)); - String outputInitPath = outputJavaDir + file.replace(".txt", ".cj"); - writer = new BufferedWriter(new FileWriter(outputInitPath)); - do { - klassInit = Parser.parserKlass(klassInitReader); - if (klassInit.isPresent()) { - Klass k = klassInit.get(); - writer.write(k.toCJ().replace('$', '_')); - writer.newLine(); - } - } while (klassInit.isPresent()); - writer.close(); - klassInitReader.close(); - } - } - } catch (Exception e) { e.printStackTrace(); } diff --git a/src/main/java/com/example/codegen/Field.java b/src/main/java/com/example/codegen/Field.java index c2902d5..0794b53 100644 --- a/src/main/java/com/example/codegen/Field.java +++ b/src/main/java/com/example/codegen/Field.java @@ -40,6 +40,6 @@ public class Field implements AstNode { public String toCJ() { - return "public " + (isStatic ? "static "+ "var "+ className+ "_" +fieldName.toCJ() : "var "+ fieldName.toCJ()) + ": " + fieldType.toCJ() + " = " + CJUtils.getDefaultValue(fieldType.toCJ()); + return "public " + (isStatic ? "static " : "") + "var "+ className+ "_" +fieldName.toCJ()+ " : " + fieldType.toCJ() + " = " + CJUtils.getDefaultValue(fieldType.toCJ()); } } diff --git a/src/main/java/com/example/codegen/Klass.java b/src/main/java/com/example/codegen/Klass.java index 1c9e5f9..0427b72 100644 --- a/src/main/java/com/example/codegen/Klass.java +++ b/src/main/java/com/example/codegen/Klass.java @@ -6,6 +6,7 @@ import com.example.utils.classNode; import java.util.ArrayList; import java.util.Arrays; import java.util.Optional; +import java.util.Set; public class Klass implements AstNode { public String className; @@ -93,6 +94,17 @@ public class Klass implements AstNode { } public String toCJ(){ + if(Super.isPresent()){ + Field s = Super.get(); + String parentName = s.fieldType.toCJ().charAt(0)=='?' ? s.fieldType.toCJ().substring(1) : s.fieldType.toCJ(); + CJUtils.classNodes.put(className.toLowerCase(), new classNode(className, parentName)); + } else { + CJUtils.classNodes.put(className.toLowerCase(), new classNode(className, null)); + } + Set fieldName = CJUtils.classNodes.get(className.toLowerCase()).fields; + for(Field field: fields){ + fieldName.add(field); + } return "public open class " + className.replace('$', '_') + Super.map(s -> " <: " + (s.fieldType.toCJ().charAt(0)=='?' ? s.fieldType.toCJ().substring(1) : s.fieldType.toCJ()).replace('$', '_')).orElse("") + " {\n" + String.join("\n", new ArrayList() {{ for (Field field : fields) { add(field.toCJ()); diff --git a/src/main/java/com/example/codegen/Variable.java b/src/main/java/com/example/codegen/Variable.java index e88dadd..e939862 100644 --- a/src/main/java/com/example/codegen/Variable.java +++ b/src/main/java/com/example/codegen/Variable.java @@ -16,7 +16,23 @@ public class Variable implements Expression { // filter the empty string this.indexes = indexes.map(indexes1 -> Arrays.stream(indexes1).filter(index -> !index.isEmpty()).toArray(String[]::new)); } + private static Set keywords = new HashSet<>(); + static { + String[] words = { + "as", "abstract", "break", "Bool", "case", "catch", "class", "const", "continue", + "Char", "do", "else", "enum", "extend", "for", "from", "func", "false", "finally", + "foreign", "Float16", "Float32", "Float64", "if", "in", "is", "init", "import", + "interface", "Int8", "Int16", "Int32", "Int64", "IntNative", "let", "mut", "main", + "macro", "match", "Nothing", "open", "operator", "override", "prop", "public", + "package", "private", "protected", "quote", "redef", "return", "spawn", "super", + "static", "struct", "synchronized", "try", "this", "true", "type", "throw", "This", + "unsafe", "Unit", "UInt8", "UInt16", "UInt32", "UInt64", "UIntNative", "var", "where", "while" + }; + for (String word : words) { + keywords.add(word); + } + } public boolean containUpper() { for (char c : identifier.toCharArray()) { if (Character.isUpperCase(c)) { @@ -54,26 +70,6 @@ public class Variable implements Expression { return (IsCSharpKeywordExpectNULL(identifier) ? "@" + identifier : identifier) + (indexes.map(index -> "[" + String.join("][", index) + "]").orElse("")); } - public boolean isCJKeyword(String s){ - Set keywords = new HashSet<>(); - // 将单词添加到 HashSet 中 - String[] words = { - "as", "abstract", "break", "Bool", "case", "catch", "class", "const", "continue", - "Char", "do", "else", "enum", "extend", "for", "from", "func", "false", "finally", - "foreign", "Float16", "Float32", "Float64", "if", "in", "is", "init", "import", - "interface", "Int8", "Int16", "Int32", "Int64", "IntNative", "let", "mut", "main", - "macro", "match", "Nothing", "open", "operator", "override", "prop", "public", - "package", "private", "protected", "quote", "redef", "return", "spawn", "super", - "static", "struct", "synchronized", "try", "this", "true", "type", "throw", "This", - "unsafe", "Unit", "UInt8", "UInt16", "UInt32", "UInt64", "UIntNative", "var", "where", "while" - }; - - for (String word : words) { - keywords.add(word); - } - return keywords.contains(s); - } - @Override public String toCJ() { String str = ""; @@ -81,7 +77,7 @@ public class Variable implements Expression { for(String s : indexes.get()) str += ".getOrThrow()["+ s +"]"; } - if(isCJKeyword(identifier)) + if(keywords.contains(identifier)) return identifier+"HadTurn" + str; else if(identifier.equals("null")) return "None" + str; diff --git a/src/main/java/com/example/codegen/Variables.java b/src/main/java/com/example/codegen/Variables.java index 60ff294..112fae7 100644 --- a/src/main/java/com/example/codegen/Variables.java +++ b/src/main/java/com/example/codegen/Variables.java @@ -1,6 +1,7 @@ package com.example.codegen; import com.example.utils.CJUtils; +import com.example.utils.classNode; import java.util.ArrayList; import java.util.Optional; @@ -49,19 +50,60 @@ public class Variables implements Expression { return (type.isPresent() ? "(" + type.get().toJava() + ")" : "") + (type.isPresent() ? "(" : "") + String.join(".", variables.stream().map(Expression::toCSharp).toArray(String[]::new)) + (type.isPresent() ? ")" : ""); } + public static String getFromWhichClass(String classNow, String field){ + classNode tmp = CJUtils.classNodes.get(classNow.toLowerCase()); + if(tmp != null){ + for(Field field1 : tmp.fields){ + if(field1.fieldName.toCJ().equals(field)){ + return classNow; + } + } + // no found + if(tmp.parent != null){ + return getFromWhichClass(tmp.parent, field); + } + } + return null; + } @Override public String toCJ() { String res = ""; - for (int i = 0; i < variables.size()-1; i++) { - String tmp = variables.get(i).toCJ(); - if(Type.classSet.contains(tmp)){ - res += tmp + "." + tmp + "_"; - } else { - res += tmp + ".getOrThrow()."; + int size = variables.size(); + if(size < 1) + return null; + else if(size == 1) + res = variables.get(0).toCJ(); + else { + String firstVar = variables.get(0).toCJ(); + String classOfFirst = firstVar.replaceFirst("(_\\d+)$", ""); + + if(CJUtils.classNodes.containsKey(classOfFirst)) + classOfFirst = CJUtils.classNodes.get(classOfFirst).className; + for (int i = 1; i < variables.size(); i++) { + String tmp = variables.get(i).toCJ(); + String tmpClass = getFromWhichClass(classOfFirst, tmp); + if(!firstVar.equals(classOfFirst)) + res += firstVar + ".getOrThrow()." + tmpClass + "_"; + else + res += firstVar + "." + tmpClass + "_"; + firstVar = tmp; + classOfFirst = tmpClass; } + res += firstVar ; } - - res += variables.get(variables.size()-1).toCJ(); +// for (int i = 0; i < variables.size()-1; i++) { +// String tmp = variables.get(i).toCJ(); +// String next = variables.get(i+1).toCJ(); +// String classNameNow = +// String className = ""; +// if(Type.classSet.contains(tmp)){ +// res += tmp + "." + className + "_"; +// } else { +// res += tmp + ".getOrThrow()." + className + "_"; +// } +// } +// +// res += variables.get(variables.size()-1).toCJ(); if(type.isPresent()) return "(" + res + " as " + type.get().toCJ() +").getOrThrow()"; return res; diff --git a/src/main/java/com/example/utils/classNode.java b/src/main/java/com/example/utils/classNode.java index 1046edc..2bc1c66 100644 --- a/src/main/java/com/example/utils/classNode.java +++ b/src/main/java/com/example/utils/classNode.java @@ -1,15 +1,16 @@ package com.example.utils; +import com.example.codegen.Field; + import java.util.HashSet; import java.util.Set; public class classNode { public String className; public String parent; - public Set fields; + public Set fields = new HashSet<>(); public classNode(String className, String parent){ this.className = className; this.parent = parent; - } } -- Gitee From 36862434c423f58853984d8f856ecc2ba56a9c91 Mon Sep 17 00:00:00 2001 From: zhou2022 Date: Sun, 14 Jul 2024 16:46:09 +0800 Subject: [PATCH 3/7] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E5=90=8D=E4=B8=BA=E7=B1=BB=E5=90=8D=E5=8A=A0=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/codegen/CodeGenCJ.java | 44 +++++++++---------- src/main/java/com/example/codegen/Field.java | 2 +- .../java/com/example/codegen/Variable.java | 2 +- .../java/com/example/codegen/Variables.java | 39 ++++++++-------- 4 files changed, 44 insertions(+), 43 deletions(-) diff --git a/src/main/java/com/example/codegen/CodeGenCJ.java b/src/main/java/com/example/codegen/CodeGenCJ.java index 142b91b..0b599c2 100644 --- a/src/main/java/com/example/codegen/CodeGenCJ.java +++ b/src/main/java/com/example/codegen/CodeGenCJ.java @@ -8,7 +8,7 @@ import java.util.Optional; public class CodeGenCJ { public static void main(String[] args) { - String name = "gcbench1"; + String name = "gcbenchMT"; String kLassPath = "src/main/resources/"+name+"/MainClasses.txt"; String dSLProgramPath = "src/main/resources/"+name+"/dslProgram.txt"; String dslInitPath = "src/main/resources/"+name+"/"; @@ -22,27 +22,6 @@ public class CodeGenCJ { // String outputMainPath = outputJavaDir + "Program.cj"; try { - // find all Main*.txt files expect MainClasses.txt in dslInitPath - // for each file, generate a Main*.cs file under outputJavaDir using parserKlass - Optional klassInit = Optional.empty(); - for (String file : new java.io.File(dslInitPath).list()) { - if (file.startsWith("Main") && file.endsWith(".txt") && !file.equals("MainClasses.txt")) { - BufferedReader klassInitReader = new BufferedReader(new FileReader(dslInitPath + file)); - String outputInitPath = outputJavaDir + file.replace(".txt", ".cj"); - BufferedWriter writer = new BufferedWriter(new FileWriter(outputInitPath)); - do { - klassInit = Parser.parserKlass(klassInitReader); - if (klassInit.isPresent()) { - Klass k = klassInit.get(); - writer.write(k.toCJ().replace('$', '_')); - writer.newLine(); - } - } while (klassInit.isPresent()); - writer.close(); - klassInitReader.close(); - } - } - Type.disableInterface = false; BufferedWriter writer = new BufferedWriter(new FileWriter(outputMainPath)); BufferedReader klassReader = new BufferedReader(new FileReader(kLassPath)); @@ -61,6 +40,27 @@ public class CodeGenCJ { writer.newLine(); Type.disableInterface = true; + // find all Main*.txt files expect MainClasses.txt in dslInitPath + // for each file, generate a Main*.cs file under outputJavaDir using parserKlass + Optional klassInit = Optional.empty(); + for (String file : new java.io.File(dslInitPath).list()) { + if (file.startsWith("Main") && file.endsWith(".txt") && !file.equals("MainClasses.txt")) { + BufferedReader klassInitReader = new BufferedReader(new FileReader(dslInitPath + file)); + String outputInitPath = outputJavaDir + file.replace(".txt", ".cj"); + BufferedWriter writer1 = new BufferedWriter(new FileWriter(outputInitPath)); + do { + klassInit = Parser.parserKlass(klassInitReader); + if (klassInit.isPresent()) { + Klass k = klassInit.get(); + writer1.write(k.toCJ().replace('$', '_')); + writer1.newLine(); + } + } while (klassInit.isPresent()); + writer1.close(); + klassInitReader.close(); + } + } + writer.newLine(); Optional program = Optional.empty(); do { diff --git a/src/main/java/com/example/codegen/Field.java b/src/main/java/com/example/codegen/Field.java index 0794b53..74fedbe 100644 --- a/src/main/java/com/example/codegen/Field.java +++ b/src/main/java/com/example/codegen/Field.java @@ -40,6 +40,6 @@ public class Field implements AstNode { public String toCJ() { - return "public " + (isStatic ? "static " : "") + "var "+ className+ "_" +fieldName.toCJ()+ " : " + fieldType.toCJ() + " = " + CJUtils.getDefaultValue(fieldType.toCJ()); + return "public " + (isStatic ? "static " : "") + "var "+ className+ "_" + fieldName.toCJ()+ " : " + fieldType.toCJ() + " = " + CJUtils.getDefaultValue(fieldType.toCJ()); } } diff --git a/src/main/java/com/example/codegen/Variable.java b/src/main/java/com/example/codegen/Variable.java index e939862..e00da87 100644 --- a/src/main/java/com/example/codegen/Variable.java +++ b/src/main/java/com/example/codegen/Variable.java @@ -16,7 +16,7 @@ public class Variable implements Expression { // filter the empty string this.indexes = indexes.map(indexes1 -> Arrays.stream(indexes1).filter(index -> !index.isEmpty()).toArray(String[]::new)); } - private static Set keywords = new HashSet<>(); + public static Set keywords = new HashSet<>(); static { String[] words = { "as", "abstract", "break", "Bool", "case", "catch", "class", "const", "continue", diff --git a/src/main/java/com/example/codegen/Variables.java b/src/main/java/com/example/codegen/Variables.java index 112fae7..fba8ee6 100644 --- a/src/main/java/com/example/codegen/Variables.java +++ b/src/main/java/com/example/codegen/Variables.java @@ -54,7 +54,7 @@ public class Variables implements Expression { classNode tmp = CJUtils.classNodes.get(classNow.toLowerCase()); if(tmp != null){ for(Field field1 : tmp.fields){ - if(field1.fieldName.toCJ().equals(field)){ + if(field1.fieldName.toCJ().replaceFirst("HadTurn$","").equals(field)){ return classNow; } } @@ -63,7 +63,17 @@ public class Variables implements Expression { return getFromWhichClass(tmp.parent, field); } } - return null; + return ""; + } + public static String getClassNameOfField(String fieldName, String className){ + classNode nowNode = CJUtils.classNodes.get(className.toLowerCase()); + if(nowNode == null) return ""; + for(Field field: nowNode.fields){ + if(field.fieldName.toCJ().equals(fieldName)){ + return field.fieldType.toCJ().replace("?", ""); + } + } + return ""; } @Override public String toCJ() { @@ -79,31 +89,22 @@ public class Variables implements Expression { if(CJUtils.classNodes.containsKey(classOfFirst)) classOfFirst = CJUtils.classNodes.get(classOfFirst).className; + else if(CJUtils.classNodes.containsKey(classOfFirst.replaceFirst("(_array_\\d+_\\d+)$",""))) + classOfFirst = CJUtils.classNodes.get(classOfFirst.replaceFirst("(_array_\\d+_\\d+)$","")).className; + for (int i = 1; i < variables.size(); i++) { String tmp = variables.get(i).toCJ(); - String tmpClass = getFromWhichClass(classOfFirst, tmp); + String tmpClass = getFromWhichClass(classOfFirst, variables.get(i).identifier); + String frontClass = tmpClass.equals("") ? "" : tmpClass+ "_"; if(!firstVar.equals(classOfFirst)) - res += firstVar + ".getOrThrow()." + tmpClass + "_"; + res += firstVar + ".getOrThrow()." + frontClass; else - res += firstVar + "." + tmpClass + "_"; + res += firstVar + "." + frontClass; firstVar = tmp; - classOfFirst = tmpClass; + classOfFirst = getClassNameOfField(variables.get(i).identifier, tmpClass); } res += firstVar ; } -// for (int i = 0; i < variables.size()-1; i++) { -// String tmp = variables.get(i).toCJ(); -// String next = variables.get(i+1).toCJ(); -// String classNameNow = -// String className = ""; -// if(Type.classSet.contains(tmp)){ -// res += tmp + "." + className + "_"; -// } else { -// res += tmp + ".getOrThrow()." + className + "_"; -// } -// } -// -// res += variables.get(variables.size()-1).toCJ(); if(type.isPresent()) return "(" + res + " as " + type.get().toCJ() +").getOrThrow()"; return res; -- Gitee From d529cfc675f26b5f0a23121f9a927e1cb60028e6 Mon Sep 17 00:00:00 2001 From: zhou2022 Date: Mon, 15 Jul 2024 23:34:41 +0800 Subject: [PATCH 4/7] =?UTF-8?q?fix:=20=E5=A2=9E=E5=8A=A0turnClass=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E4=BD=9C=E4=B8=BA=E7=B1=BB=E5=9E=8B=E8=BD=AC=E5=8C=96?= =?UTF-8?q?=E6=96=B9=E5=BC=8F=EF=BC=8C=E8=B0=83=E6=95=B4=E4=BA=86=E9=83=A8?= =?UTF-8?q?=E5=88=86=E6=8E=92=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/codegen/AssignStatement.java | 14 +++++++++++--- src/main/java/com/example/codegen/CodeGenCJ.java | 6 ++++++ .../java/com/example/codegen/CodeGenCSharp.java | 14 ++++++++++---- .../java/com/example/codegen/LoopStatement.java | 2 +- src/main/java/com/example/codegen/Variables.java | 10 ++++++++-- 5 files changed, 36 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/example/codegen/AssignStatement.java b/src/main/java/com/example/codegen/AssignStatement.java index 4689ef7..a1d1df7 100644 --- a/src/main/java/com/example/codegen/AssignStatement.java +++ b/src/main/java/com/example/codegen/AssignStatement.java @@ -34,10 +34,18 @@ public class AssignStatement implements Statement { @Override public String toCJ() { - String typeChange = ""; + boolean typeChange = true; if(castType.isPresent()){ - typeChange = " as " + (castType.get().toCJ().charAt(0)=='?' ? castType.get().toCJ().substring(1) : castType.get().toCJ()); + String typeName = castType.get().toCJ(); + if(typeName.startsWith("?Array<")) { + typeChange = false; + } } - return declareVariable.toCJ() + " = " + leftExpression.toCJ() + typeChange ; + String left = leftExpression.toCJ(); + if(left.equals("None") || (leftExpression instanceof NewArrayExpression) || (leftExpression instanceof NewInstanceExpression)) + typeChange = false; + if(typeChange) + left = "turnClass(" + leftExpression.toCJ() + ")"; + return declareVariable.toCJ() + " = " + left ; } } diff --git a/src/main/java/com/example/codegen/CodeGenCJ.java b/src/main/java/com/example/codegen/CodeGenCJ.java index 0b599c2..5b530ce 100644 --- a/src/main/java/com/example/codegen/CodeGenCJ.java +++ b/src/main/java/com/example/codegen/CodeGenCJ.java @@ -37,6 +37,12 @@ public class CodeGenCJ { writer.newLine(); } } while (klass.isPresent()); + writer.write("func turnClass(a: ?T1) :?T2 {\n" + + " match (a) {\n" + + " case Some(v) => v as T2\n" + + " case None => Option.None\n" + + " }\n" + + "}\n"); writer.newLine(); Type.disableInterface = true; diff --git a/src/main/java/com/example/codegen/CodeGenCSharp.java b/src/main/java/com/example/codegen/CodeGenCSharp.java index 7c96f01..fb55a44 100644 --- a/src/main/java/com/example/codegen/CodeGenCSharp.java +++ b/src/main/java/com/example/codegen/CodeGenCSharp.java @@ -9,11 +9,17 @@ import java.util.Optional; public class CodeGenCSharp { public static void main(String[] args) { - String kLassPath = "src/main/resources/guava/MainClasses.txt"; - String dSLProgramPath = "src/main/resources/guava/dslProgram.txt"; - String dslInitPath = "src/main/resources/guava/"; - String outputJavaDir = "src/main/resources/csharp/"; + String name = "gcbench1"; + String kLassPath = "src/main/resources/"+name+"/MainClasses.txt"; + String dSLProgramPath = "src/main/resources/"+name+"/dslProgram.txt"; + String dslInitPath = "src/main/resources/"+name+"/"; + String outputJavaDir = "src/main/resources/"+name+"/CS/"; String outputMainPath = outputJavaDir + "Program.cs"; + // String kLassPath = "src/main/resources/guava/MainClasses.txt"; + // String dSLProgramPath = "src/main/resources/guava/dslProgram.txt"; + // String dslInitPath = "src/main/resources/guava/"; + // String outputJavaDir = "src/main/resources/csharp/"; + // String outputMainPath = outputJavaDir + "Program.cs"; try { Type.disableInterface = false; BufferedWriter writer = new BufferedWriter(new FileWriter(outputMainPath)); diff --git a/src/main/java/com/example/codegen/LoopStatement.java b/src/main/java/com/example/codegen/LoopStatement.java index 537dae0..6465dd8 100644 --- a/src/main/java/com/example/codegen/LoopStatement.java +++ b/src/main/java/com/example/codegen/LoopStatement.java @@ -46,6 +46,6 @@ public class LoopStatement implements Statement { public String toCJ() { return String.format("for (%s in %s..%s:%s)", indexVar.toCJ(), startVal.toCJ(), endVal.toCJ(), stepVal.toCJ()) - + "{\n" + String.join("\n", statements.stream().map(Statement::toCJ).toArray(String[]::new)) + "\n}"; + + "{\n\t" + String.join("\n\t", statements.stream().map(Statement::toCJ).toArray(String[]::new)) + "\t\n}"; } } diff --git a/src/main/java/com/example/codegen/Variables.java b/src/main/java/com/example/codegen/Variables.java index fba8ee6..10609ff 100644 --- a/src/main/java/com/example/codegen/Variables.java +++ b/src/main/java/com/example/codegen/Variables.java @@ -105,8 +105,14 @@ public class Variables implements Expression { } res += firstVar ; } - if(type.isPresent()) - return "(" + res + " as " + type.get().toCJ() +").getOrThrow()"; + if(type.isPresent()){ + String typeName = type.get().toCJ(); + if(typeName.startsWith("?Array<")) + return res; + if(typeName.charAt(0) == '?') + // return res + " as " + typeName.substring(1); + return "turnClass(" + res + ")"; + } return res; } } -- Gitee From 3a1750c7541326c2a95856035812ca9aef6ed53a Mon Sep 17 00:00:00 2001 From: zhou2022 Date: Tue, 16 Jul 2024 00:24:37 +0800 Subject: [PATCH 5/7] =?UTF-8?q?feat=EF=BC=9A=20=E6=96=B0=E5=A2=9E=E5=85=A8?= =?UTF-8?q?=E5=B1=80=E5=8F=98=E9=87=8FisVariableNameNormalized=EF=BC=8C?= =?UTF-8?q?=E7=94=A8=E4=BA=8E=E5=8C=BA=E5=88=86=E5=8F=98=E9=87=8F=E5=90=8D?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E8=A7=84=E6=A0=BC=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/codegen/AssignStatement.java | 30 ++++++---- .../java/com/example/codegen/CodeGenCJ.java | 25 ++++---- .../java/com/example/codegen/CodeGenGo.java | 1 + src/main/java/com/example/codegen/Field.java | 3 +- .../com/example/codegen/LoopStatement.java | 2 +- .../java/com/example/codegen/Variables.java | 57 +++++++++++-------- src/main/java/com/example/utils/CJUtils.java | 2 + 7 files changed, 72 insertions(+), 48 deletions(-) diff --git a/src/main/java/com/example/codegen/AssignStatement.java b/src/main/java/com/example/codegen/AssignStatement.java index a1d1df7..5cc2a7d 100644 --- a/src/main/java/com/example/codegen/AssignStatement.java +++ b/src/main/java/com/example/codegen/AssignStatement.java @@ -1,5 +1,7 @@ package com.example.codegen; +import com.example.utils.CJUtils; + import java.util.Optional; public class AssignStatement implements Statement { @@ -34,18 +36,24 @@ public class AssignStatement implements Statement { @Override public String toCJ() { - boolean typeChange = true; - if(castType.isPresent()){ - String typeName = castType.get().toCJ(); - if(typeName.startsWith("?Array<")) { - typeChange = false; + if(CJUtils.isVariableNameNormalized) { + boolean typeChange = true; + if (castType.isPresent()) { + String typeName = castType.get().toCJ(); + if (typeName.startsWith("?Array<")) { + typeChange = false; + } } + String left = leftExpression.toCJ(); + if (left.equals("None") || (leftExpression instanceof NewArrayExpression) || (leftExpression instanceof NewInstanceExpression)) + typeChange = false; + if (typeChange) + left = "turnClass(" + leftExpression.toCJ() + ")"; + return declareVariable.toCJ() + " = " + left; + } else { + if(castType.isPresent()) + return declareVariable.toCJ() + " = " +"turnClass(" + leftExpression.toCJ() + ")"; + return declareVariable.toCJ() + " = " + leftExpression.toCJ() ; } - String left = leftExpression.toCJ(); - if(left.equals("None") || (leftExpression instanceof NewArrayExpression) || (leftExpression instanceof NewInstanceExpression)) - typeChange = false; - if(typeChange) - left = "turnClass(" + leftExpression.toCJ() + ")"; - return declareVariable.toCJ() + " = " + left ; } } diff --git a/src/main/java/com/example/codegen/CodeGenCJ.java b/src/main/java/com/example/codegen/CodeGenCJ.java index 5b530ce..6059a2e 100644 --- a/src/main/java/com/example/codegen/CodeGenCJ.java +++ b/src/main/java/com/example/codegen/CodeGenCJ.java @@ -1,5 +1,7 @@ package com.example.codegen; +import com.example.utils.CJUtils; + import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; @@ -8,18 +10,19 @@ import java.util.Optional; public class CodeGenCJ { public static void main(String[] args) { - String name = "gcbenchMT"; - String kLassPath = "src/main/resources/"+name+"/MainClasses.txt"; - String dSLProgramPath = "src/main/resources/"+name+"/dslProgram.txt"; - String dslInitPath = "src/main/resources/"+name+"/"; - String outputJavaDir = "src/main/resources/"+name+"/cj/"; - String outputMainPath = outputJavaDir + "main.cj"; -// String name = "array"; -// String kLassPath = "src/main/resources/"+name+"/"+name+"Class.txt"; -// String dSLProgramPath = "src/main/resources/"+name+"/"+name+"Func.txt"; + CJUtils.isVariableNameNormalized = false;//true 表示变量命名规格化,为class_n +// String name = "gcbenchMT"; +// String kLassPath = "src/main/resources/"+name+"/MainClasses.txt"; +// String dSLProgramPath = "src/main/resources/"+name+"/dslProgram.txt"; // String dslInitPath = "src/main/resources/"+name+"/"; -// String outputJavaDir = "src/main/resources/"+name+"/"; -// String outputMainPath = outputJavaDir + "Program.cj"; +// String outputJavaDir = "src/main/resources/"+name+"/cj/"; +// String outputMainPath = outputJavaDir + "main.cj"; + String name = "BD"; + String kLassPath = "src/main/resources/"+name+"/"+name+"Class.txt"; + String dSLProgramPath = "src/main/resources/"+name+"/"+name+"Func.txt"; + String dslInitPath = "src/main/resources/"+name+"/"; + String outputJavaDir = "src/main/resources/"+name+"/"; + String outputMainPath = outputJavaDir + "Program.cj"; try { Type.disableInterface = false; diff --git a/src/main/java/com/example/codegen/CodeGenGo.java b/src/main/java/com/example/codegen/CodeGenGo.java index f7f43a0..b42e8fa 100644 --- a/src/main/java/com/example/codegen/CodeGenGo.java +++ b/src/main/java/com/example/codegen/CodeGenGo.java @@ -8,6 +8,7 @@ import java.util.Optional; public class CodeGenGo { public static void main(String[] args) { + String kLassPath = "src/main/resources/classDB.txt"; String dSLProgramPath = "src/main/resources/programDB.txt"; String outputJavaDir = "src/main/resources/"; diff --git a/src/main/java/com/example/codegen/Field.java b/src/main/java/com/example/codegen/Field.java index 74fedbe..58ae540 100644 --- a/src/main/java/com/example/codegen/Field.java +++ b/src/main/java/com/example/codegen/Field.java @@ -39,7 +39,6 @@ public class Field implements AstNode { } public String toCJ() { - - return "public " + (isStatic ? "static " : "") + "var "+ className+ "_" + fieldName.toCJ()+ " : " + fieldType.toCJ() + " = " + CJUtils.getDefaultValue(fieldType.toCJ()); + return "public " + (isStatic ? "static " : "") + "var "+(CJUtils.isVariableNameNormalized ? className+ "_" + fieldName.toCJ() : fieldName.toCJ())+ " : " + fieldType.toCJ() + " = " + CJUtils.getDefaultValue(fieldType.toCJ()); } } diff --git a/src/main/java/com/example/codegen/LoopStatement.java b/src/main/java/com/example/codegen/LoopStatement.java index 6465dd8..93eea76 100644 --- a/src/main/java/com/example/codegen/LoopStatement.java +++ b/src/main/java/com/example/codegen/LoopStatement.java @@ -46,6 +46,6 @@ public class LoopStatement implements Statement { public String toCJ() { return String.format("for (%s in %s..%s:%s)", indexVar.toCJ(), startVal.toCJ(), endVal.toCJ(), stepVal.toCJ()) - + "{\n\t" + String.join("\n\t", statements.stream().map(Statement::toCJ).toArray(String[]::new)) + "\t\n}"; + + "{\n\t" + String.join("\n\t\t", statements.stream().map(Statement::toCJ).toArray(String[]::new)) + "\n\t}"; } } diff --git a/src/main/java/com/example/codegen/Variables.java b/src/main/java/com/example/codegen/Variables.java index 10609ff..f15b542 100644 --- a/src/main/java/com/example/codegen/Variables.java +++ b/src/main/java/com/example/codegen/Variables.java @@ -78,39 +78,50 @@ public class Variables implements Expression { @Override public String toCJ() { String res = ""; - int size = variables.size(); - if(size < 1) - return null; - else if(size == 1) - res = variables.get(0).toCJ(); - else { - String firstVar = variables.get(0).toCJ(); - String classOfFirst = firstVar.replaceFirst("(_\\d+)$", ""); + if(CJUtils.isVariableNameNormalized) { + int size = variables.size(); + if (size < 1) + return null; + else if (size == 1) + res = variables.get(0).toCJ(); + else { + String firstVar = variables.get(0).toCJ(); + String classOfFirst = firstVar.replaceFirst("(_\\d+)$", ""); - if(CJUtils.classNodes.containsKey(classOfFirst)) - classOfFirst = CJUtils.classNodes.get(classOfFirst).className; - else if(CJUtils.classNodes.containsKey(classOfFirst.replaceFirst("(_array_\\d+_\\d+)$",""))) - classOfFirst = CJUtils.classNodes.get(classOfFirst.replaceFirst("(_array_\\d+_\\d+)$","")).className; + if (CJUtils.classNodes.containsKey(classOfFirst)) + classOfFirst = CJUtils.classNodes.get(classOfFirst).className; + else if (CJUtils.classNodes.containsKey(classOfFirst.replaceFirst("(_array_\\d+_\\d+)$", ""))) + classOfFirst = CJUtils.classNodes.get(classOfFirst.replaceFirst("(_array_\\d+_\\d+)$", "")).className; - for (int i = 1; i < variables.size(); i++) { + for (int i = 1; i < variables.size(); i++) { + String tmp = variables.get(i).toCJ(); + String tmpClass = getFromWhichClass(classOfFirst, variables.get(i).identifier); + String frontClass = tmpClass.equals("") ? "" : tmpClass + "_"; + if (!firstVar.equals(classOfFirst)) + res += firstVar + ".getOrThrow()." + frontClass; + else + res += firstVar + "." + frontClass; + firstVar = tmp; + classOfFirst = getClassNameOfField(variables.get(i).identifier, tmpClass); + } + res += firstVar; + } + } else { + for (int i = 0; i < variables.size()-1; i++) { String tmp = variables.get(i).toCJ(); - String tmpClass = getFromWhichClass(classOfFirst, variables.get(i).identifier); - String frontClass = tmpClass.equals("") ? "" : tmpClass+ "_"; - if(!firstVar.equals(classOfFirst)) - res += firstVar + ".getOrThrow()." + frontClass; - else - res += firstVar + "." + frontClass; - firstVar = tmp; - classOfFirst = getClassNameOfField(variables.get(i).identifier, tmpClass); + if(Type.classSet.contains(tmp)){ + res += tmp + "."; + } else { + res += tmp + ".getOrThrow()."; + } } - res += firstVar ; + res += variables.get(variables.size()-1).toCJ(); } if(type.isPresent()){ String typeName = type.get().toCJ(); if(typeName.startsWith("?Array<")) return res; if(typeName.charAt(0) == '?') - // return res + " as " + typeName.substring(1); return "turnClass(" + res + ")"; } return res; diff --git a/src/main/java/com/example/utils/CJUtils.java b/src/main/java/com/example/utils/CJUtils.java index 5594ce0..81b4043 100644 --- a/src/main/java/com/example/utils/CJUtils.java +++ b/src/main/java/com/example/utils/CJUtils.java @@ -6,6 +6,8 @@ import java.util.Map; import java.util.Set; public class CJUtils { + // 变量名是否规格化 + public static boolean isVariableNameNormalized = true; public static Set spawnParamSet = new HashSet<>(); public static Map classNodes = new HashMap<>(); public static Map defaultValue = new HashMap<>(); -- Gitee From 145ac257acbced4dbcc9f7d40f90956637de2325 Mon Sep 17 00:00:00 2001 From: zhou2022 Date: Tue, 16 Jul 2024 21:43:45 +0800 Subject: [PATCH 6/7] =?UTF-8?q?feat:=20=E8=B0=83=E6=95=B4=E7=B1=BB?= =?UTF-8?q?=E5=86=85=E6=96=B9=E6=B3=95=E4=B8=BA=E9=9D=99=E6=80=81=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/codegen/CodeGenCJ.java | 27 ++++++++++--------- src/main/java/com/example/codegen/Method.java | 4 +-- src/main/java/com/example/utils/CJUtils.java | 1 + 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/example/codegen/CodeGenCJ.java b/src/main/java/com/example/codegen/CodeGenCJ.java index 6059a2e..e4a08e0 100644 --- a/src/main/java/com/example/codegen/CodeGenCJ.java +++ b/src/main/java/com/example/codegen/CodeGenCJ.java @@ -10,22 +10,23 @@ import java.util.Optional; public class CodeGenCJ { public static void main(String[] args) { - CJUtils.isVariableNameNormalized = false;//true 表示变量命名规格化,为class_n -// String name = "gcbenchMT"; -// String kLassPath = "src/main/resources/"+name+"/MainClasses.txt"; -// String dSLProgramPath = "src/main/resources/"+name+"/dslProgram.txt"; -// String dslInitPath = "src/main/resources/"+name+"/"; -// String outputJavaDir = "src/main/resources/"+name+"/cj/"; -// String outputMainPath = outputJavaDir + "main.cj"; - String name = "BD"; - String kLassPath = "src/main/resources/"+name+"/"+name+"Class.txt"; - String dSLProgramPath = "src/main/resources/"+name+"/"+name+"Func.txt"; + CJUtils.isVariableNameNormalized = true;//true 表示变量命名规格化,为class_n + String name = "guava"; + String kLassPath = "src/main/resources/"+name+"/MainClasses.txt"; + String dSLProgramPath = "src/main/resources/"+name+"/dslProgram.txt"; String dslInitPath = "src/main/resources/"+name+"/"; - String outputJavaDir = "src/main/resources/"+name+"/"; - String outputMainPath = outputJavaDir + "Program.cj"; + String outputJavaDir = "src/main/resources/"+name+"/cj/"; + String outputMainPath = outputJavaDir + "main.cj"; +// String name = "BD"; +// String kLassPath = "src/main/resources/"+name+"/"+name+"Class.txt"; +// String dSLProgramPath = "src/main/resources/"+name+"/"+name+"Func.txt"; +// String dslInitPath = "src/main/resources/"+name+"/"; +// String outputJavaDir = "src/main/resources/"+name+"/"; +// String outputMainPath = outputJavaDir + "Program.cj"; try { Type.disableInterface = false; + CJUtils.inClass = true; BufferedWriter writer = new BufferedWriter(new FileWriter(outputMainPath)); BufferedReader klassReader = new BufferedReader(new FileReader(kLassPath)); BufferedReader dSLProgramReader = new BufferedReader(new FileReader(dSLProgramPath)); @@ -69,7 +70,7 @@ public class CodeGenCJ { klassInitReader.close(); } } - + CJUtils.inClass = false; writer.newLine(); Optional program = Optional.empty(); do { diff --git a/src/main/java/com/example/codegen/Method.java b/src/main/java/com/example/codegen/Method.java index 5f0bda9..2645a67 100644 --- a/src/main/java/com/example/codegen/Method.java +++ b/src/main/java/com/example/codegen/Method.java @@ -86,8 +86,8 @@ public class Method implements AstNode { postSpawn = "\tfor (fut in futureList) { fut.get() }\n"; } if(funcName.equals("main")) - return funcName+ "(" + paramList+"): " + returnType.toCJ() + " {\n" + preSpawn + stmtList + postSpawn + returnStmt + "\n}\n"; + return funcName+ "(" + paramList+"): " + returnType.toCJ() + " {\n" + preSpawn + stmtList + postSpawn + returnStmt + "}\n"; else - return "func "+ classStr + funcName+ "(" + paramList+"): " + returnType.toCJ() + " {\n" + preSpawn + stmtList + postSpawn + returnStmt + "\n}\n"; + return (CJUtils.inClass ?"public static func " : "func ")+ classStr + funcName+ "(" + paramList+"): " + returnType.toCJ() + " {\n" + preSpawn + stmtList + postSpawn + returnStmt + "}\n"; } } diff --git a/src/main/java/com/example/utils/CJUtils.java b/src/main/java/com/example/utils/CJUtils.java index 81b4043..7fc8733 100644 --- a/src/main/java/com/example/utils/CJUtils.java +++ b/src/main/java/com/example/utils/CJUtils.java @@ -8,6 +8,7 @@ import java.util.Set; public class CJUtils { // 变量名是否规格化 public static boolean isVariableNameNormalized = true; + public static boolean inClass = false; public static Set spawnParamSet = new HashSet<>(); public static Map classNodes = new HashMap<>(); public static Map defaultValue = new HashMap<>(); -- Gitee From 279c84c21efa71b1b04eb6b6f6558885a685b3cf Mon Sep 17 00:00:00 2001 From: zhou2022 Date: Wed, 17 Jul 2024 11:48:36 +0800 Subject: [PATCH 7/7] update readme.md --- README.md | 62 +++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 87e8f64..5a80e74 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,31 @@ 通过src/main/java/com/example/codegen/CodeGen*.java运行,可以将输入的class文件和输入的MOP程序文件生成对对应的宿主语言程序。 -CodegenJava.java可以生成Java程序, CodegenCSharp.java可以生成C#程序。 +CodeGenJava.java可以生成Java程序, CodeGenCSharp.java可以生成C#程序,CodeGenCJ.java用于生成仓颉程序。 在程序运行前,需要在程序的Line11-Line14中设置输入的class文件和输入的MOP程序文件的路径, 以及设置输出的宿主语言程序的路径。 目前转换后结果存放在同一个文件中。 -执行前,请先使用src/main/resources/run.sh脚本生成主函数, run.sh脚本参数为MOP程序文件夹路径。 +执行前,**请先使用src/main/resources/run.sh脚本生成主函数**, run.sh脚本参数为MOP程序文件夹路径,脚本将对路径下的dslProgram.txt做出修改 ```shell cd src/main/resources bash run.sh guava -mkdir java ``` -以当前项目中存在的guava MOP程序为例(请保证路径文件夹存在) +以当前项目中存在的guava MOP程序为例(**请保证路径文件夹存在**,若路径中文件夹不存在,请手动添加) + +Java语言执行方式: + +在CodeGenJava.java中配置路径 ```java -String kLassPath = "src/main/resources/guava/MainClasses.txt"; -String dSLProgramPath = "src/main/resources/guava/dslProgram.txt"; -String dslInitPath = "src/main/resources/guava/"; -String outputJavaDir = "src/main/resources/java/"; -String outputMainPath = outputJavaDir + "Main.java"; + String name = "guava";// 项目名称(仅作为路径判断,名称不影响程序执行) + String kLassPath = "src/main/resources/"+name+"/MainClasses.txt"; //类文件 + String dSLProgramPath = "src/main/resources/"+name+"/dslProgram.txt"; //MOP程序 + String dslInitPath = "src/main/resources/"+name+"/"; //全局变量初始化文件路径,文件命名格式为MainX.txt, X为数字 + String outputJavaDir = "src/main/resources/"+name+"/java/"; //输出文件路径 + String outputMainPath = outputJavaDir + "Main.java"; // 输出的主类文件 ``` -运行对应程序后,会在outputJavaDir中生成Main.java文件,即为转换后的Java程序。之后可以直接运行 +运行程序后,会在outputJavaDir中生成Main.java文件以及全局变量初始化文件MainX.java,即为转换后的Java程序。之后可以直接运行 ```shell cd src/main/resources/java @@ -32,11 +36,12 @@ java Main C#语言执行类似 ```java -String kLassPath = "src/main/resources/guava/MainClasses.txt"; -String dSLProgramPath = "src/main/resources/guava/dslProgram.txt"; -String dslInitPath = "src/main/resources/guava/"; -String outputJavaDir = "src/main/resources/csharp/"; -String outputMainPath = outputJavaDir + "Program.cs"; + String name = "guava"; + String kLassPath = "src/main/resources/"+name+"/MainClasses.txt"; + String dSLProgramPath = "src/main/resources/"+name+"/dslProgram.txt"; + String dslInitPath = "src/main/resources/"+name+"/"; + String outputJavaDir = "src/main/resources/"+name+"/CS/"; + String outputMainPath = outputJavaDir + "Program.cs"; ``` 运行后,会在outputJavaDir中生成cs文件, 之后建立dotnet项目,将所有cs文件加入项目中,之后可以直接运行 @@ -51,4 +56,29 @@ dotnet run example.csproj > log.out 2>&1 ```shell dotnet run example.csproj > log.out 2>&1 -``` \ No newline at end of file +``` + +仓颉语言执行方式 + +路径配置同上,其中CJUtils.isVariableNameNormalized是记录变量名是否符合变量命名规格化class_n形式,用于方便转化人工编写的MOP程序,对于自动转化出来的MOP程序请设置为true,对于人工编写且父子类无同名字段的MOP程序可以设置为false + +```java + CJUtils.isVariableNameNormalized = true;//true 表示变量命名规格化,为class_n,无特殊情况请默认为ture + String name = "guava"; + String kLassPath = "src/main/resources/"+name+"/MainClasses.txt"; + String dSLProgramPath = "src/main/resources/"+name+"/dslProgram.txt"; + String dslInitPath = "src/main/resources/"+name+"/"; + String outputJavaDir = "src/main/resources/"+name+"/cj/"; + String outputMainPath = outputJavaDir + "main.cj"; +``` + +获取到资源文件后,需要建立仓颉项目,将所有资源放于src文件夹路径下,然后编译执行(如果需要屏蔽编译过程中关于未使用变量的提醒,可以在配置文件cjpm.toml的compiler-option选项中添加-Woff unused) + +```shell +cd CJProm +cjpm init +mv /path/*.cj ./src +cjpm build +cjpm run +``` + -- Gitee