如何在C中有效地构建解释器(词法分析器+解析器)?

Riz*_*izo 8 html c parsing interpreter lexer

我正在尝试编写一种用于编写标记代码的元语言(例如xml和html),它可以直接嵌入到C/C++代码中.这是一个用这种语言编写的简单示例,我称之为WDI(Web开发接口):

 /*
  * Simple wdi/html sample source code
  */
 #include <mySite>

 string name = "myName";
 string toCapital(string str);

 html
 {
  head {
   title { mySiteTitle; }
   link(rel="stylesheet", href="style.css");
  }
  body(id="default") {
   // Page content wrapper
   div(id="wrapper", class="some_class") {
    h1 { "Hello, " + toCapital(name) + "!"; }

    // Lists post
    ul(id="post_list") {
     for(post in posts) {
      li { a(href=post.getID()) { post.tilte; } }
     }
    }
   }
  }
 }
Run Code Online (Sandbox Code Playgroud)

基本上它是一个修改过的C源代码,具有用户友好的html界面.正如您所看到的,传统的基于标签的样式被类似C的命令所取代,其中的块由花括号分隔.我需要构建一个解释器来将此代码转换为html,然后将其插入到C中,以便可以编译它.C部分保持不变.在wdi源代码内部没有必要使用print,每个return语句都将用于输出(在printf函数中).该程序的输出将是干净的HTML代码.

因此,例如标题1标记将被转换为:

h1 { "Hello, " + toCapital(name) + "!"; }
// would become:
printf("<h1>Hello, %s!</h1>", toCapital(name));
Run Code Online (Sandbox Code Playgroud)

我的主要目标是创建一个解释器来将wdi源转换为html,如下所示:

tag(attributes) {content} => <tag attributes>content</tag>

其次,解释器返回的html代码必须用printfs插入到C代码中.wdi中发生的变量和函数也应该进行排序,以便将它们用作printf参数(示例源中的toCapital(name)的情况).

我正在寻找有效的(我想创建一个快速解析器)方法来为wdi创建词法分析器和解析器.已经尝试过flex和bison,但我不确定它们是否是最好的工具.有什么好的选择吗?创建这样一个解释器的最佳方法是什么?你能就这个问题提供一些简短的文献吗?

Ira*_*ter 2

如果您真的对此很认真,那么您想要做的就是修改现有的 C 解析器。Edison Design Group C 前端可能是一个选择,尽管它确实希望只是一个 C (C++) 前端。

另一个选择是我们的DMS 软件重组工具包可以通过C 前端获得 DMSDMS 可以通过包含完全由语法驱动的完整 C 解析器的

DMS 提供了对构建语言方言的直接支持,而您想要做的是构建 C 方言,因此它将支持您的目标。DMS 还提供了许多用于构建翻译器的机制,因此将您的方言翻译成真正的 C 代码并发出它会相当容易。