6

我有一组用语言“A”编写的文件,需要翻译成语言“B”的相应文件。我想创建一个可以自动执行此任务的程序/解析器(可能是一个工具链而不是单个程序)。但是,我正在努力为我的工具链程序找到合适的选择。

所需工具链的插图

语言A是嵌入式软件代码,即低级语言。它是 90% 的标准 C 代码和 10% 的“自定义”代码,即文件还包含标准 C 编译器无法理解的小段。90% 的 C 代码不是C 中可能出现的任何随机 C 构造(这在语义方面很难解析),而是遵循某些重复出现的表达式、动作和模式。它总是以(或多或少)相同的方式遵循这些模式。它主要执行对内存的写操作,包括复杂的结构,如 C-struct 或 enum 等。

语言 A 中的常规低级 C 代码示例:

#define MYMACRO 0x123
uint32_t regAddr;
regAddr = MYMACRO;
*(uint32_t*)(regAddr) = 0xdeadbeef;

语言 A 中的“自定义代码”示例:

custom_printf("hello world! Cpu number: %d \n", cpu_nr);

语言 B是 100% 自定义语言。这种转换是必要的,以便在另一个工具中使用该文件进行调试。上面示例的翻译大致如下所示:

definemacro MYMACRO 0x123
define_local_int regAddr
localint.set regAddr = MYMACRO
data.write regAddr 0xdeadbeef

注意:我很清楚 Stackoverflow 并不是一个公开讨论“您更喜欢哪种工具?”的网站。但我认为这个问题更像是“我需要至少一个有意义的工具集来完成工作”,即无论如何可能没有那么多明智的讨论选项。

到目前为止,这些是我的考虑和方法:

  • 性能与我的工具链无关。它只应该易于实施和适应变化。
  • 第一种方法:由于语言 A 主要是 C-Code,我首先想到了pycparser Python Plugin,它提供了一个 C-parser,可以将 C-Code 解析为 AST(抽象语法树)。我的计划是读入语言 A 文件,然后编写一个 Python 程序,从 AST 中创建语言 B 文件。但是,我发现很难适应/教授 pycparser 插件以完全支持语言 A 的 10% 自定义属性。
  • 第二种方法:使用“通用解析器生成器”,例如 Yacc/Bison 或 ANTLR。然而,在这里,我不确定哪些工具适合我的需求(带有 LALR 解析器的 Yacc/Bison 或带有 LL 解析器的 ANTLR)以及如何设置一个包含此类解析器的适当工具链,然后处理(例如使用 Python)数据生成的解析器为创建自定义语言 B 而创建的结构。如果选择的解析器生成器提供一个现有的 C 语言定义,该定义可以轻松适应 10% 的自定义 C 语言部分,这也会很有帮助。我还应该提到,我以前从未使用过通用解析器。

任何人都可以给我一些关于用于这项任务的有意义的工具集的建议吗?

编辑: 如果这似乎是一个模糊的问题,我深表歉意,我试图尽可能准确地提出它。我为语言 A 和 B 添加了一个示例,以使语言的组成更加清晰,并表明语言 A 遵循某些在语义方面易于理解的重复模式。

如果此编辑不能提高清晰度和广泛性,我将按照建议重新发布给程序员。

Edit2:好的,由于主题显然似乎仍然在这里被取代,我在此撤回问题。我已经从前几张海报中收到了一些有价值的意见,这鼓励我对通用解析器生成器进行进一步的实验。

4

0 回答 0