我很早以前就开始在动态的图形可视化器,编辑器和算法测试平台上工作(具有节点和弧线的图形,而不是其他图形)。 对于算法测试平台,我需要让用户编写脚本或从文件中调用脚本,这将与当前加载的图形进行交互。可视化工具将执行一些操作,例如在脚本算法访问节点时点亮节点,并增加一些人为延迟,以可视化导航和执行操作的算法。 其次,脚本还将用于添加第三方功能,这些功能既可以作为程序文件夹中的预先存在的脚本提供,也可以在经过测试和运行后直接集成到c ++程序内部。
我对嵌入翻译的所有搜索都将我带到了lua; 然后,我开始为自己的类似C的语法脚本语言手写我自己的递归下降解析器(我计划使用C ++语法的子集,以便可以将用我的脚本语言编写的任何代码复制粘贴到任何C ++代码中。 这是一个有趣的疯狂想法,我一点都不后悔,我有范围,函数,循环,gotos,类型安全变量,表达式。
但是现在我要添加类,类方法,继承(将默认脚本与程序连接到程序需要一些默认类),我意识到这将花费很多时间和精力。对于一个有考试的未毕业学生的个人项目来说,要学习……实在太多了……但我还是希望完成这个项目。
脚本的自我强加要求几乎是必须的,它必须与C ++ 100%兼容,这本来是一件好事,我可以做不到。
现在的问题是,有没有一种类似c的语法来代替lua,它支持我已经做过的所有事情以及类和继承? (必须将接口脚本的自定义“类”添加到程序中)
(我无法假定用户安装了完整的c ++编译器,因此我无法在运行时将其“脚本”编译为dll来加载和调用它,尽管我希望可以)
答案 0 :(得分:5)
解析C ++很难。哎呀,解析C很难。很难做到正确,并且存在很多极端情况。值得庆幸的是,那里有一些库可以接受代码,甚至可以为您编译它。
libclang提供了许多用于解析c ++的工具。这是一个很好,干净的库,它将解析clang编译器本身将解析的所有内容。 This article here是一个很好的入门
libclang提供了一个JIT编译工具,使您可以在运行时编写和编译C ++。有关其功能以及如何使用的概述,请参见此处的this blog post。它非常通用,非常强大,并且用户编写的代码应该很快。
GCC also provides a library称为libgccjit,用于在程序运行时进行即时编译。 libgccjit是一个C库,但是库维护者也提供了一个C ++包装器。它可以编译抽象语法树并在运行时链接它们,尽管它仍处于Alpha模式。
如果您不想使用libclang,还有一个正在开发的库叫cppast,它是一个C ++解析器,它将为您提供c ++代码的抽象语法树表示。不幸的是,它不会解析函数体。
如果任何人都知道在运行时用于编译或解释C ++的任何其他库,我鼓励他们更新此文章或发表评论,以便我进行更新!
答案 1 :(得分:1)
这是让您在应用程序中嵌入类似C的脚本语言的东西(以及许多其他很酷的东西):
https://github.com/twitter/typeahead.js/issues/1627#issuecomment-406228429
有很多文档: