8

我正在尝试制作一种用于编写可以直接嵌入到 C/C++ 代码中的标记代码(例如 xml 和 html)的元语言。这是一个用这种语言编写的简单示例,我称之为 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; } }
     }
    }
   }
  }
 }

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

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

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

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

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

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

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

4

4 回答 4

3

bison/flex 或 yacc/lex 是执行此操作的传统方式。恕我直言,没有什么更适合手头的任务了。

请注意,该任务无法通过常规语言(即正则表达式、简单的 perl 脚本等)来完成,因此您确实需要一个解析器。

最好做对。最可能的是,一个 yacc/bison 生成的解析器将比一些手工制作的递归降序解析器更干净(更快)。

于 2010-05-20T16:17:37.007 回答
1

我可以推荐这个教程吗:http: //www.icemanind.com

那里有一个关于如何编写自己的虚拟机的教程,并配有汇编器和解释器

于 2010-05-20T16:17:01.860 回答
1

出于这种目的, Boost Spirit可能比 bison/flex 更好。

于 2010-06-22T12:35:18.117 回答
1

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

另一种选择是我们的DMS 软件再工程工具包。DMS 可以通过包含完全由语法驱动的完整 C 解析器的C 前端来获得。

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

于 2010-06-08T09:51:11.953 回答