您需要的是程序转换系统 (PTS)。
这是一个将源代码解析为 AST、转换树,然后从树中重新生成有效源代码的工具。有关背景信息,请参阅我在 rewriting Python text 上的 SO 回答。
使用像(我公司的)DMS Software Reengineering Toolkiit 这样的 PTS,您可以编写规则来执行常量折叠,这意味着本质上是在执行编译时算术。
对于您展示的示例,以下规则可以完成OP的示例:
rule fold_subtract_naturals(n:NATURAL,m:NATURAL): sum->sum =
" \n + \m " -> " \subtract_naturals\(\n\,\m\) ";
rule convert_chr_to_string(c:NATURAL): term->term =
" chr(\c) " -> make_string_from_natural(c) ;
rule convert_character_literal_to_string(c:CHARACTER): term->term =
" \c " -> make_string_from_character(c) ;
rule fold_concatenate_strings(s1:STRING, s2:STRING): sum->sum =
" \s1 + \s2 " -> " \concatenate_strings\(\s1\,\s2\) ";
ruleset fold_strings = {
fold_subtract_naturals,
convert_chr_to_string,
convert_characater_to_string,
fold_concatenate_strings };
每个单独的规则都匹配相应的语法/树。它们的编写方式仅适用于文字常量。
fold_add_naturals 查找由加法运算连接的 NATURAL 常量对,并使用内置函数将其替换为求和,该函数将两个值相加并生成包含总和的文字值节点。 p>
convert_chr_to_string 将 chr(c) 转换为对应的字符串字面量。
convert_character_to_string 将“C”转换为对应的字符串“C”。
fold_concatenate_strings 组合了两个由加法运算符分隔的文字字符串。它的工作方式类似于 fold_add_naturals 的工作方式。
subtract_naturals 和 concatenate_strings 内置在 DMS 中。 convert_chr_to_string 和 convert_character_to_string 需要使用 DMS 的元编程语言 PARLANSE 进行自定义编码,但这些例程非常简单(可能 10 行)。
规则集将规则集打包,因此它们都可以应用。
未显示的是打开文件、调用解析器、调用规则集转换器(应用规则直到没有规则应用)的基本代码。最后一步是调用prettyprinter重新打印修改后的AST。
许多其他 PTS 也提供类似的设施。