您需要的是一个工具,它将涉及字符串串联的每个表达式替换为库调用,而表达式的明显特例仅涉及单个文本字符串。
一个程序转换系统,您可以在其中表达所需的模式可以做到这一点。这种制度接受以下形式的规则:
lhs_pattern -> rhs_pattern if condition ;
其中,模式是对模式变量具有语法类别约束的代码片段。这会导致工具查找与lhs_pattern匹配的语法,如果找到,则替换为rhs_pattern,其中模式匹配基于语言结构而不是文本。因此,无论代码格式,缩进,注释等如何,它都可以工作。
按照示例的样式草绘一些规则(并过度简化以保持简短):
domain Java;
nationalize_literal(s1:literal_string):
" \s1 " -> "Language.getString1(\s1 )";
nationalize_single_concatenation(s1:literal_string,s2:term):
" \s1 + \s2 " -> "Language.getString1(\s1) + \s2";
nationalize_double_concatenation(s1:literal_string,s2:term,s3:literal_string):
" \s1 + \s2 + \s3 " ->
"Language.getString3(\generate_template1\(\s1 + "{1}" +\s3\, s2);"
if IsNotLiteral(s2);
这些模式本身被括在“...”中;这些不是Java字符串文字,而是一种对多计算机语言模式匹配引擎说“...”内部的suff的方式。是(域)Java 代码。元事物用 \ 标记,例如,元变量 \s1、\s2、\s3 和嵌入式模式调用 \generate with ( and ) 以表示其元参数列表 :-}
请注意在元变量 s1 和 s3 上使用语法类别约束,以确保仅匹配字符串文本。元变量在左侧模式上匹配的内容在右侧被替换。
子模式generate_template是一个过程,该过程在转换时(例如,当规则触发时)将其已知为常量的第一个参数计算到您建议的模板字符串中并插入到库中,并返回库字符串索引。请注意,生成模式的第一个参数是此示例完全由串联的文本字符串组成。
显然,有人将不得不手动处理最终进入库中的模板化字符串,以生成外语等效项。
你是对的,因为这可能会过度模板化代码,因为某些字符串不应该放在国有化的字符串库中。只要您可以为这些情况编写编程检查,就可以将它们作为条件包含在规则中以防止触发它们。(只需稍加努力,您就可以将未转换的文本放入注释中,从而使以后更容易撤消各个转换)。
实际上,我想你必须像这样编写大约100条规则来涵盖组合学和兴趣的特殊情况。好处是您的代码会自动增强。如果操作正确,您可以在代码经历多个版本时重复将此转换应用于代码;它将把以前国有化的表达方式单独留下来,而只是修改那些快乐的幸运程序员插入的新表达方式。
可以做到这一点的系统是DMS软件再造工具包。DMS可以解析/模式匹配/转换/漂亮打印许多语言,包括Java和C#。