Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C/C+中实现解释器所需的参考资料+;_C++_Lisp_Interpreter - Fatal编程技术网

C++ 在C/C+中实现解释器所需的参考资料+;

C++ 在C/C+中实现解释器所需的参考资料+;,c++,lisp,interpreter,C++,Lisp,Interpreter,我发现自己加入了一个将解释器集成到现有应用程序中的项目。要解释的语言是Lisp的派生语言,具有特定于应用程序的内置语言。单个“程序”将在应用程序中以批处理方式运行 我感到惊讶的是,这些年来我编写了两个编译器和几个数据语言翻译器/解析器,但我以前从未真正编写过解释器。该原型非常简单,在C++中实现为语法树Walk。我可能会影响原型之外的体系结构,但不会影响实现语言(C++)。因此,限制条件: 实现将使用C语言++ 解析可能会使用yacc/bison语法(现在是) 对于这个项目来说,像NekoVM

我发现自己加入了一个将解释器集成到现有应用程序中的项目。要解释的语言是Lisp的派生语言,具有特定于应用程序的内置语言。单个“程序”将在应用程序中以批处理方式运行

我感到惊讶的是,这些年来我编写了两个编译器和几个数据语言翻译器/解析器,但我以前从未真正编写过解释器。该原型非常简单,在C++中实现为语法树Walk。我可能会影响原型之外的体系结构,但不会影响实现语言(C++)。因此,限制条件:

  • 实现将使用C语言++
  • 解析可能会使用yacc/bison语法(现在是)
  • 对于这个项目来说,像NekoVM和LLVM这样的完整VM/解释器生态的建议可能并不实用。自给自足更好,即使这听起来像NIH
我真正想要的是阅读关于实现口译员的基础知识的材料。我浏览了SO和另一个名为的网站,尽管它们更倾向于编程语言理论

到目前为止,我收集的一些花絮:

  • ,作者克里斯蒂安·奎内克。推荐它的人说,它“从简单的解释器发展到更先进的技术,并完成了字节码和“Scheme to C”编译器的演示。”

  • 。正如我上面提到的,我怀疑是否允许我们合并一个完整的VM框架来支持这个项目

  • 。起初,我认为这可能有些过分,但在处理了一个健康的块之后,我同意@JBF。信息量大,思维开阔

  • 保罗·格雷厄姆。我读过这篇文章,虽然它是对Lisp原则的一个信息性介绍,但这还不足以快速构建一个解释器

  • 。这本书看起来很有趣。我不确定它是否能为我提供基础知识

  • 。Peter Michaux正在攻击Scheme的各种实现,从用C编写的快速而肮脏的Scheme解释器(在以后的项目中用作引导程序)到编译的Scheme代码。到目前为止非常有趣

  • ,建议在的注释线程中使用。这本书有两章专门介绍如何构建口译员,因此我将其添加到我的阅读队列中

  • 新的(也是旧的,即1979年):P.J.布朗著。这本书早已绝版,但在提供与基本解释器的实现相关的各种任务的概要方面很有意思。我已经看到了这一个混合评论,但因为它是便宜的(我有它的订单使用约3.50美元),我会给它一个旋转
那怎么样?有没有一本好书可以让初学者亲身体验如何用C/C++为类似Lisp的语言构建解释器?您是否喜欢语法树漫游器或字节码解释器

要回答@JBF:

  • 当前的原型是一个解释器,这对我来说是有意义的,因为我们正在接受一个指向任意代码文件的路径,并在我们的应用程序环境中执行它。内置项用于影响内存中的数据表示

  • 它不应该太慢。目前的树行者似乎可以接受

  • 该语言基于Lisp,但不是Lisp,因此不需要符合标准

  • 如上所述,我们不太可能被允许添加一个完整的外部VM/解释器项目来解决这个问题
对于其他的海报,我也会查看你的引文。谢谢大家

退房。我发现这很简单,理解和移植到C++。嗯,不知道使用脚本作为脚本语言——教JNRS是繁琐的,感觉过时(HeloooO 1980)。

< > Samuel Kamin的程序设计语言,一种基于解释的方法,由Timothy Budd翻译成C++。我不确定裸源代码会有多有用,因为它是本书的配套内容,但它是一本很好的书,涵盖了在较低级别语言中实现Lisp的基础知识,包括垃圾收集等(这不是本书的重点,本书主要是编程语言,但它涵盖了这一点)

Lisp在小片段中更深入,但这对您的案例既有好处也有坏处。编译时有很多材料,这些与你无关,而且它的简单解释程序在方案中,而不是C++。 SICP绝对是好的。这并不过分,但写口译员当然只是这本书的一小部分

JScheme建议也是一个很好的建议(它包含了我编写的一些代码),但对GC之类的事情没有帮助

我以后可能会提出更多的建议来充实这一点

编辑:一些人说他们从我的工作中学到了东西。这无疑是一个奇怪的建议,但它非常小、可读、实际可用,并且与其他微小但可读的玩具Lisp不同,它实现了自己的垃圾收集器和数据表示,而不是依赖底层的高级实现语言来提供它们。

简短回答:

lisp解释器的基本阅读列表是SICP。如果你觉得自己对本书第一部分的要求过高,那么我一点也不认为这是过分的,跳到第四章开始口译吧(尽管我觉得这是一个损失,因为第1-3章真的很好!)

在第1-3章的小段中添加LISP(从现在起为LISP)。特别是第3章,如果您需要实现任何非平凡的控制表单

请参阅Jens Axel Søgaard关于最小自托管方案的文章:

回答稍微长一点:

如果不知道你需要从口译员那里得到什么,就很难给出建议

  • 它真的需要成为一个interpre吗
    ConsBoxFactory &GetConsBoxFactory() { return mConsFactory; }
    AtomFactory &GetAtomFactory() { return mAtomFactory; }
    Environment &GetEnvironment() { return mEnvironment; }
    t_ConsBox *Read(iostream &stm);
    t_ConsBox *Eval(t_ConsBox *box);
    void Print(basic_ostream<char> &stm, t_ConsBox *box);
    void RunProgram(char *program);
    void RunProgram(iostream &stm);
    
    t_ConsBox *ConsBoxFactory::Cadr(t_ConsBox *list)
    {
        return Car(Cdr(list));
    }