![]() |
1
5
我很难理解这个问题,但我想你会发现了解一些有关 术语重写系统 这似乎是你的建议。无论机制是树重写(始终有效)还是正则表达式(在某些语言中某些时间有效,而其他语言则始终有效),都是次要的。 通过术语重写来优化对象代码是绝对可能的。你可能也会从学习一些关于 窥视孔优化 戴维森和弗雷泽的一篇论文是关于 retargetable peephole optimizer . 还有 excellent later work 贝尼特斯和戴维森。 |
![]() |
2
8
实际上你应该做的是建立一个 Abstract Syntax Tree (AST) . 它是以树的形式表示的源代码,这非常容易使用,尤其是进行转换和优化。 用树表示的代码应该类似于:
然后您可以尝试进行一些转换:总和是所有项的总和:
然后您可以扫描树,您可以有以下规则:
然后你将得到你想要的:
任何一本关于编译器写作的好书都会在ASTS上讨论很多。函数式编程语言特别适合这项任务,因为通常很容易表示树,并进行模式匹配来解析和转换树。 通常,对于这个任务, 应避免使用正则表达式 . 正则表达式定义了数学家所说的 常规语言 .任何 常规语言 可以是 解析 通过一组正则表达式。但是,我认为您的语言不是常规语言,因此不能由regexps正确解析。 人们试着,试着,试着用正则表达式解析HTML等语言。这在这里已经被广泛讨论过了,所以您不能用正则表达式解析HTML。总是会有一个例外情况,在这种情况下,您的正则表达式会失败,您必须对它进行调整。 对于您的语言来说可能是一样的:如果它不是规则的,您应该避免很多麻烦,并且不要试图使用正则表达式解析它(尤其是“转换”它)。 |
![]() |
Ilya Loskutov · 无法将单词加载到寄存器中 2 年前 |
![]() |
Ari157 · x86_64 Linux程序集中的逻辑与实现 2 年前 |
![]() |
Arya · 汇编语言中的“标签”——操作码 3 年前 |
![]() |
S1mple · 通过gcc生成64位共享库时的“未定义的主引用” 3 年前 |
![]() |
R0M2 · 为什么“GCC”忽略汇编代码的-fno pic 3 年前 |
![]() |
Akagi Akira · 如何在gnu汇编程序中组装MIPS cpu 3 年前 |