代码之家  ›  专栏  ›  技术社区  ›  Rizo

如何高效地用C语言构建解释器(lexer+parser)?

  •  8
  • Rizo  · 技术社区  · 16 年前

    我尝试制作一个元语言来编写标记代码(比如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; } }
         }
        }
       }
      }
     }
    

    基本上,它是一个修改过的C源代码,具有用户友好的html界面。 如您所见,传统的基于标记的样式被类似C的命令所取代,块由花括号分隔。 我需要建立一个解释器来把这段代码翻译成html,然后再把它插入到C中,这样就可以编译了。C部分保持完整。

    因此,例如,标题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创建lexer和解析器。已经试过flex和bison了,但是我不确定它们是否是最好的工具。有什么好的选择吗?创建这样一个解释器的最佳方法是什么?你能提供一些关于这个问题的简要资料吗?

    4 回复  |  直到 8 年前
        1
  •  1
  •   Ira Baxter    16 年前

    如果您对此非常认真,那么您要做的就是修改现有的C解析器。这个 Edison Design Group C Front End 也许是个选择 真正地 想成为 只是 C(C++)前端。

    另一个选择是我们的 DMS Software Reengineering Toolkit . DMS可以通过 C Front End 它包含完全由语法驱动的完整C解析器。

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

        2
  •  3
  •   Ingo    16 年前

    bison/flex或yacc/lex是传统的方法。

    请注意,这项任务不能由常规语言(如regex、简单perl脚本等)完成,因此您确实需要一个解析器。

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

        3
  •  1
  •   Icemanind    16 年前

    http://www.icemanind.com

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

        4
  •  1
  •   Alexandre C.    16 年前

    Boost spirit 在这种情况下可能比bison/flex更好。