转换" c-like语言"到#34;自定义语言"使用解析器

时间:2015-11-16 09:16:09

标签: c parsing bison pycparser

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

Illustration of desired toolchain

语言A 是嵌入式软件代码,即低级语言。它是90%的标准C-Code和10%" custom"代码,即 这些文件还包含标准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并不是一个关于&#34的公开讨论的网站;您更喜欢哪种工具?"。但我想这个问题 更像是"我需要至少一个有意义的工具集才能完成工作",无论如何,可能没有那么多明智的讨论选择。

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

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

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

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

如果此编辑没有提高清晰度和宽度,我将按照建议重新发布给程序员。

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

0 个答案:

没有答案