update CodeGen for suiting new requirement of Python
This commit is contained in:
parent
0071e001fd
commit
09fd67fb5e
|
@ -4,6 +4,7 @@ import java.io.OutputStreamWriter;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import org.antlr.v4.runtime.*;
|
import org.antlr.v4.runtime.*;
|
||||||
|
|
||||||
|
@ -24,7 +25,7 @@ public class CommonHelper {
|
||||||
return null;
|
return null;
|
||||||
return tokens.get(0);
|
return tokens.get(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<Token> getPreChannelTokens(BufferedTokenStream stream, Token token, int channel) {
|
public static List<Token> getPreChannelTokens(BufferedTokenStream stream, Token token, int channel) {
|
||||||
return stream.getHiddenTokensToLeft(token.getTokenIndex(), channel);
|
return stream.getHiddenTokensToLeft(token.getTokenIndex(), channel);
|
||||||
}
|
}
|
||||||
|
@ -59,8 +60,7 @@ public class CommonHelper {
|
||||||
/**
|
/**
|
||||||
* Cut multiple comments.
|
* Cut multiple comments.
|
||||||
* <p>
|
* <p>
|
||||||
* Each comment will be cut the head and tail first.
|
* Each comment will be cut the head and tail first. And strip all whitespace.
|
||||||
* And strip all whitespace.
|
|
||||||
* Then join together.
|
* Then join together.
|
||||||
*
|
*
|
||||||
* @param tokens Multiple comments.
|
* @param tokens Multiple comments.
|
||||||
|
@ -75,7 +75,7 @@ public class CommonHelper {
|
||||||
return text + " ";
|
return text + " ";
|
||||||
}).collect(Collectors.joining(""));
|
}).collect(Collectors.joining(""));
|
||||||
}
|
}
|
||||||
|
|
||||||
// =========== Number Operations ===========
|
// =========== Number Operations ===========
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -90,6 +90,7 @@ public class CommonHelper {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check whether Altlr captured CKGENERAL_NUM is a hex number.
|
* Check whether Altlr captured CKGENERAL_NUM is a hex number.
|
||||||
|
*
|
||||||
* @param numstr The captured number.
|
* @param numstr The captured number.
|
||||||
* @return true if it is hex number.
|
* @return true if it is hex number.
|
||||||
*/
|
*/
|
||||||
|
@ -97,6 +98,18 @@ public class CommonHelper {
|
||||||
return numstr.startsWith("0x") || numstr.startsWith("0X");
|
return numstr.startsWith("0x") || numstr.startsWith("0X");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert accepted string into Python cupported format.
|
||||||
|
*
|
||||||
|
* It actually just remove trail "UL".
|
||||||
|
*
|
||||||
|
* @param numstr The captured number.
|
||||||
|
* @return The Python style number string.
|
||||||
|
*/
|
||||||
|
public static String convertToPythonNumber(String numstr) {
|
||||||
|
return numstr.replaceFirst("[ulUL]+$", "");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get underlying type of enum.
|
* Get underlying type of enum.
|
||||||
*
|
*
|
||||||
|
@ -113,7 +126,7 @@ public class CommonHelper {
|
||||||
enum CKParts {
|
enum CKParts {
|
||||||
CK2, VxMath
|
CK2, VxMath
|
||||||
}
|
}
|
||||||
|
|
||||||
enum LangType {
|
enum LangType {
|
||||||
CPP, Python
|
CPP, Python
|
||||||
}
|
}
|
||||||
|
@ -184,6 +197,7 @@ public class CommonHelper {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove redundent star '*' (at least 5 continuous star chars)
|
* Remove redundent star '*' (at least 5 continuous star chars)
|
||||||
|
*
|
||||||
* @param cmt The string provided.
|
* @param cmt The string provided.
|
||||||
* @return The string processed.
|
* @return The string processed.
|
||||||
*/
|
*/
|
||||||
|
@ -191,5 +205,45 @@ public class CommonHelper {
|
||||||
// only remove at least 5 continuous star chars.
|
// only remove at least 5 continuous star chars.
|
||||||
return cmt.replaceAll("\\*{5,}", "");
|
return cmt.replaceAll("\\*{5,}", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get indent char by style
|
||||||
|
*
|
||||||
|
* @param use_tab Whether indent use Tab, not Space.
|
||||||
|
* @return The indent chars
|
||||||
|
*/
|
||||||
|
public static String getIndentString(boolean use_tab) {
|
||||||
|
if (use_tab)
|
||||||
|
return "\t";
|
||||||
|
else
|
||||||
|
return " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Re-indent a block of string
|
||||||
|
*
|
||||||
|
* This function will first split block string by line. Then remove all indent
|
||||||
|
* (strip Tab and Space). At last, re-indent and join each line
|
||||||
|
*
|
||||||
|
* @param block_str The string provided.
|
||||||
|
* @param use_tab Use Tab, not Space as indent chars.
|
||||||
|
* @param indent_level The level of indent, started by 0.
|
||||||
|
* @return The re-indent string
|
||||||
|
*/
|
||||||
|
public static String reindentBlockString(String block_str, boolean use_tab, int indent_level) {
|
||||||
|
// pre-create indent string
|
||||||
|
String indentChars = getIndentString(use_tab);
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (int i = 0; i < indent_level; ++i) {
|
||||||
|
sb.append(indentChars);
|
||||||
|
}
|
||||||
|
String indents = sb.toString();
|
||||||
|
|
||||||
|
// split line
|
||||||
|
return block_str.lines().map((String line) -> {
|
||||||
|
// strip space and tab, then re-indent it.
|
||||||
|
return indents + line.trim();
|
||||||
|
}).collect(Collectors.joining(System.lineSeparator())); // then join with new line breaker and return.
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import java.io.OutputStreamWriter;
|
import java.io.OutputStreamWriter;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generic Enum Writer. Including Data Type Defination and Nameof Values.
|
* Generic Enum Writer. Including Data Type Defination and Nameof Values.
|
||||||
|
@ -85,8 +86,8 @@ public class GeneralWriter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void writeAccVals(String filename, EnumsHelper.EnumCollection_t prog,
|
public static void writeAccVals(String filename, EnumsHelper.EnumCollection_t prog, CommonHelper.CKParts parts)
|
||||||
CommonHelper.CKParts parts) throws Exception {
|
throws Exception {
|
||||||
OutputStreamWriter fs = CommonHelper.openOutputFile(filename);
|
OutputStreamWriter fs = CommonHelper.openOutputFile(filename);
|
||||||
writeAccVals(fs, prog, parts);
|
writeAccVals(fs, prog, parts);
|
||||||
fs.close();
|
fs.close();
|
||||||
|
@ -122,7 +123,8 @@ public class GeneralWriter {
|
||||||
if (enumEntry_t.mEntryValue == null) {
|
if (enumEntry_t.mEntryValue == null) {
|
||||||
indent.printf("%s = auto()", enumEntry_t.mEntryName);
|
indent.printf("%s = auto()", enumEntry_t.mEntryName);
|
||||||
} else {
|
} else {
|
||||||
indent.printf("%s = %s", enumEntry_t.mEntryName, enumEntry_t.mEntryValue);
|
indent.printf("%s = %s", enumEntry_t.mEntryName,
|
||||||
|
CommonHelper.convertToPythonNumber(enumEntry_t.mEntryValue));
|
||||||
}
|
}
|
||||||
|
|
||||||
// write entry comment after member
|
// write entry comment after member
|
||||||
|
@ -152,13 +154,24 @@ public class GeneralWriter {
|
||||||
fs.close();
|
fs.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static String extractHumanReadableEntryName(String entry_name) {
|
||||||
|
// remove first part (any content before underline '_')
|
||||||
|
entry_name = entry_name.replaceFirst("^[a-zA-Z0-9]+_", "");
|
||||||
|
|
||||||
|
// lower all chars except first char
|
||||||
|
if (entry_name.length() < 1)
|
||||||
|
return entry_name;
|
||||||
|
else
|
||||||
|
return entry_name.substring(0, 1) + entry_name.substring(1).toLowerCase(Locale.ROOT);
|
||||||
|
}
|
||||||
|
|
||||||
public static void writePyAccVals(OutputStreamWriter writer, EnumsHelper.EnumCollection_t prog) throws Exception {
|
public static void writePyAccVals(OutputStreamWriter writer, EnumsHelper.EnumCollection_t prog) throws Exception {
|
||||||
IndentHelper indent = new IndentHelper(writer, CommonHelper.LangType.Python);
|
IndentHelper indent = new IndentHelper(writer, CommonHelper.LangType.Python);
|
||||||
|
|
||||||
// write implements
|
// write implements
|
||||||
for (EnumsHelper.Enum_t enum_t : prog.mEnums) {
|
for (EnumsHelper.Enum_t enum_t : prog.mEnums) {
|
||||||
// write enum desc header
|
// write enum desc header
|
||||||
indent.printf("g_Annotation_%s: dict[int, str] = {", enum_t.mEnumName);
|
indent.printf("g_Annotation_%s: dict[int, tuple[str, str]] = {", enum_t.mEnumName);
|
||||||
indent.inc();
|
indent.inc();
|
||||||
|
|
||||||
// write enum desc entries
|
// write enum desc entries
|
||||||
|
@ -167,9 +180,9 @@ public class GeneralWriter {
|
||||||
if (enumEntry_t.mEntryComment != null) {
|
if (enumEntry_t.mEntryComment != null) {
|
||||||
comment = CommonHelper.escapeString(enumEntry_t.mEntryComment);
|
comment = CommonHelper.escapeString(enumEntry_t.mEntryComment);
|
||||||
}
|
}
|
||||||
|
|
||||||
indent.printf("%s.%s.value: \"%s\",", enum_t.mEnumName, enumEntry_t.mEntryName,
|
indent.printf("%s.%s.value: (\"%s\", \"%s\", ),", enum_t.mEnumName, enumEntry_t.mEntryName,
|
||||||
comment);
|
extractHumanReadableEntryName(enumEntry_t.mEntryName), comment);
|
||||||
}
|
}
|
||||||
|
|
||||||
// write enum tail
|
// write enum tail
|
||||||
|
|
|
@ -5,22 +5,29 @@ public class IndentHelper {
|
||||||
mIndent = 0;
|
mIndent = 0;
|
||||||
mLangType = lang_type;
|
mLangType = lang_type;
|
||||||
mWriter = writer;
|
mWriter = writer;
|
||||||
|
|
||||||
|
// set indent chars
|
||||||
|
switch (mLangType) {
|
||||||
|
case CPP:
|
||||||
|
mIndentChars = CommonHelper.getIndentString(true);
|
||||||
|
break;
|
||||||
|
case Python:
|
||||||
|
mIndentChars = CommonHelper.getIndentString(false);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
mIndentChars = "";
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private int mIndent;
|
private int mIndent;
|
||||||
private CommonHelper.LangType mLangType;
|
private CommonHelper.LangType mLangType;
|
||||||
|
private String mIndentChars;
|
||||||
private OutputStreamWriter mWriter;
|
private OutputStreamWriter mWriter;
|
||||||
|
|
||||||
private void rawIndent() throws Exception {
|
private void rawIndent() throws Exception {
|
||||||
for (int i = 0; i < mIndent; ++i) {
|
for (int i = 0; i < mIndent; ++i) {
|
||||||
switch (mLangType) {
|
mWriter.write(mIndentChars);
|
||||||
case CPP:
|
|
||||||
mWriter.write("\t");
|
|
||||||
break;
|
|
||||||
case Python:
|
|
||||||
mWriter.write(" ");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,7 +40,7 @@ public class IndentHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void indent() throws Exception {
|
public void indent() throws Exception {
|
||||||
mWriter.write("\n");
|
mWriter.write(System.lineSeparator());
|
||||||
rawIndent();
|
rawIndent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,21 +68,19 @@ public class IndentHelper {
|
||||||
|
|
||||||
switch (mLangType) {
|
switch (mLangType) {
|
||||||
case CPP:
|
case CPP:
|
||||||
rawIndent();
|
|
||||||
puts("/**");
|
puts("/**");
|
||||||
|
|
||||||
|
mWriter.write(System.lineSeparator());
|
||||||
|
mWriter.write(CommonHelper.reindentBlockString(comment, true, mIndent));
|
||||||
|
|
||||||
puts(comment);
|
|
||||||
|
|
||||||
rawIndent();
|
|
||||||
puts(" */");
|
puts(" */");
|
||||||
break;
|
break;
|
||||||
case Python:
|
case Python:
|
||||||
rawIndent();
|
|
||||||
puts("\"\"\"!");
|
puts("\"\"\"!");
|
||||||
|
|
||||||
puts(comment);
|
|
||||||
|
|
||||||
rawIndent();
|
mWriter.write(System.lineSeparator());
|
||||||
|
mWriter.write(CommonHelper.reindentBlockString(comment, false, mIndent));
|
||||||
|
|
||||||
puts("\"\"\"");
|
puts("\"\"\"");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -93,12 +98,13 @@ public class IndentHelper {
|
||||||
if (comment == null)
|
if (comment == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
mWriter.write(mIndentChars);
|
||||||
switch (mLangType) {
|
switch (mLangType) {
|
||||||
case CPP:
|
case CPP:
|
||||||
mWriter.write(String.format("\t/**< %s */", CommonHelper.removeEol(comment)));
|
mWriter.write(String.format("/**< %s */", CommonHelper.removeEol(comment)));
|
||||||
break;
|
break;
|
||||||
case Python:
|
case Python:
|
||||||
mWriter.write(String.format(" ##< %s", CommonHelper.removeEol(comment)));
|
mWriter.write(String.format("##< %s", CommonHelper.removeEol(comment)));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user