使用解析器将"类c语言"转换为"自定义语言"

Ron*_*100 6 c parsing bison pycparser

我有一组用"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;
Run Code Online (Sandbox Code Playgroud)

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

custom_printf("hello world! Cpu number: %d \n", cpu_nr);
Run Code Online (Sandbox Code Playgroud)

语言B是100%自定义语言.此转换是必要的,以便在另一个工具中使用该文件进行调试.上面例子的翻译看起来大致如下:

definemacro MYMACRO 0x123
define_local_int regAddr
localint.set regAddr = MYMACRO
data.write regAddr 0xdeadbeef
Run Code Online (Sandbox Code Playgroud)

注意:我很清楚Stackoverflow并不是一个关于"您更喜欢哪种工具?"的公开讨论的网站.但我认为这个问题更像是"我至少需要一个能够完成工作的有意义的工具集",也就是说,无论如何,可能没有那么多明智的讨论选择.

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

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

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

编辑: 如果这似乎是一个模糊的问题,我道歉,我试着尽可能准确地说出来.我为语言A和B添加了一个示例,以使语言的组成更加清晰,并且为了表明语言A遵循某些重复出现的模式,这些模式可以很容易地理解语义.

如果这个编辑没有提高清晰度和广度,我将按照建议重新发布给程序员.

编辑2:好的,由于这个主题似乎仍然在这里被取消,我在这里撤回了这个问题.我已经从前几张海报中收到了一些有价值的信息,这些信息鼓励我使用通用解析器生成器进行进一步的实验.