我过去曾经使用过lex和yacc(更常见的是bison)用于各种项目,通常是翻译(例如EDIF的子集流入EDA应用程序).另外,我必须支持基于几十年前的lex/yacc语法的代码.所以我知道我的工具,虽然我不是专家.
我在过去的各种论坛上看过关于Antlr的积极评论,我很好奇我可能会缺少什么.因此,如果您同时使用了两者,请告诉我Antlr中哪些更好或更先进.我目前的限制是我在C++商店工作,我们发布的任何产品都不包含Java,因此生成的解析器必须遵循该规则.
我发现自己依附于一个项目,将一个解释器整合到一个现有的应用程序中.要解释的语言是Lisp的衍生物,具有特定于应用程序的内置.各个"程序"将在应用程序中以批处理方式运行.
我很惊讶多年来我编写了几个编译器和几个数据语言翻译器/解析器,但我以前从未真正编写过翻译器.原型很远,用C++实现为语法树walker.我可能会影响原型之外的架构,但不能影响实现语言(C++).所以,约束:
我真正想要的是阅读有关实施口译员基础知识的材料.我做了一些浏览SO,另一个名为Lambda the Ultimate的网站,虽然他们更倾向于编程语言理论.
到目前为止我收集的一些花絮:
Lisp in Small Pieces,作者:Christian Queinnec.推荐它的人说它"从简单的解释器到更高级的技术并完成呈现字节码和'Scheme to C'编译器."
NekoVM.正如我上面提到的,我怀疑我们是否可以合并整个VM框架来支持这个项目.
计算机程序的结构与解释.最初我建议这可能是矫枉过正,但是通过一个健康的块,我同意@JBF.信息量大,思维扩张.
关于保罗格雷厄姆的Lisp.我已经读过这篇文章,虽然它是对Lisp原理的一个信息性介绍,但还不足以快速开始构建一个解释器.
鹦鹉实施.这看起来很有趣.不确定它会为我提供基本面.
来自Scratch的计划.Peter Michaux正在攻击Scheme的各种实现,从用C编写的快速脏方案解释器(用作后续项目中的引导程序)到编译的Scheme代码.到目前为止非常有趣.
语言实现模式:创建自己的特定于域的和通用编程语言,在关于创建解释语言的书籍的注释主题中推荐.这本书包含两章专门介绍构建解释器的实践,所以我将它添加到我的阅读队列中.
那怎么样?是否有一本很好的书,用手拿新手,并展示了如何在C/C++中为类似Lisp的语言构建一个解释器?您是否喜欢语法树步行器或字节码解释器?
回答@JBF:
当前的原型是一个解释器,当我们接受任意代码文件的路径并在我们的应用程序环境中执行它时,它对我有意义.内置函数用于影响我们的内存数据表示.
它不应该是非常缓慢.目前的树木行走者似乎可以接受.
该语言基于 Lisp,但不是Lisp,因此不需要符合标准.
对于其他海报,我也会检查你的引文.谢谢,全部!
我看到了/ Gy选项,我想知道为什么要使用它?http://msdn.microsoft.com/en-us/library/xsa71f43.aspx
我一直在浏览Boost库的修订版1.38.0,试图确定那里是否有足够的珠宝来证明我公司外部软件审批流程的合理性.在编写测试程序和阅读文档的过程中,我得出了几个结论
事实上,有些图书馆对我来说似乎有点玩具.
经过短时间的调查后,我可以看到一些相当容易访问的库,比如boost :: variant(我非常喜欢访问者组件以及如果访问者缺少运算符,编译器会调整这个事实其中一种变种类型).我使用boost :: shared_ptr,除了我们的组已经有一组智能指针类型这一事实.
因此基于Stack Overflow用户的丰富经验,Boost库
请注意,这与Boost认为有害的问题有些不同?
PS - 有没有一个答案(来自litb)被删除?我在这里看不到它,只在我的用户页面上摘录...
谷歌正在赞助一个开源项目,将Python的速度提高5倍.
为什么并发这么难?
LLVM是否会解决并发问题?
硬件推进的多核之外是否有其他解决方案?
我查看了史蒂文斯,并在Posix程序员指南中,我能找到的最好的是
当流程开始时,可以使用称为环境的字符串数组.外部变量指向此数组,外部变量
environ定义为:
extern char **environ;
它是ENVIRON已经我犹豫变量.我想说
- 调用进程/ shell已经分配了空终止字符串块
- 'external'变量environ用作getenv()的入口点.
- 事实上可以随意在静态初始化程序中调用getenv().
但我无法保证environ的"静态初始化" 优先于所有其他静态初始化代码.我是否想过这个?
在我的平台上(AMD Opteron,Redhat 4,GCC 3.2.3),设置LD_DEBUG表明在调用静态初始化程序之前environ已设置.这是一个很好的事情要知道; 谢谢,@ codelogic.但这并不一定是我在所有平台上得到的结果.
此外,虽然我直观地同意@ChrisW关于C/C++运行时库的行为,但这只是我基于经验的直觉.所以任何能够在静态初始化程序之前使用来自某个地方的权威保证环境的人都会被称为奖励积分!
我一直在帮助我公司内部增加一项二十年的专有语言.它是一种图灵完整的大型语言.将它翻译成另一种语法(如Antlr)不是一种选择(我不能做出决定).
在大多数情况下,扩展语法已经顺利进行.但每隔一段时间我就会得到减少减少或减少减少
在经历了很多痛苦的盯着y.output文件和实验语法重构之后,我通常会到达我想去的地方.有时我不得不做出令人不满意的妥协.
那么,是否有任何工具可以吸收yacc语法,这可以增强浏览,试验和允许调试变更?
如果我添加一个产品,我希望看到的不仅仅是"到处使用的原子生产"(认为标识符)"与规则foo冲突"(是的,有更多的信息,s/r,r/r,比那个,但我认为你得到了我的漂移).除了戴上我的思维帽并试图想象一个符号堆栈和状态机之外,有一些相互影响的暗示会很好.
更新:我想我应该澄清一下.我们使用Berkeley Yacc.我一直在使用最新版本的Bison进行测试.对于输出,我用--report = itemset编译了语法.
我在这篇文章中的目标是寻找外部工具来增强 yacc附带的语法调试工具.今天使用默认设置很痛苦.帮助我找到更好的交互式工具,例如可以与Antlr一起使用的工具.
我们是一个完整的Unix商店(Solaris,Linux).最后一个产品周期我回到了项目领导能力,并需要制定一个时间表.我询问了我的经理会接受哪些工具,并且听到"文本文件"时感到很惊讶.我的队友和我一起尝试了这个,可能更糟的是HTML表,以跟踪我们想要调整的任务.这真是太痛苦了.
然后我们尝试了一些工具.MrProject太多了,有限并且经常崩溃.我的经理发誓说Microsoft Project不灵活.每当他们需要更改任务,重新分配资源或重新平衡时,它通常都会计划他们的计划.所以我开始在互联网上寻找一个支持Linux的项目规划工具.一个听起来很有趣的是TaskJuggler.它很简洁,因为输入是声明性文件.我觉得我正在为项目构建一个makefile.
然而.我有足够的时间专心评估这个工具,看起来相当复杂.在深入研究下一个产品周期之前,我想知道TaskJuggler是否足够强大,灵活且能够处理频繁更改的多个月,多个资源项目.因此,我呼吁所有有此工具经验的工程师分享他们的见解.谢谢!
我公司使用内部开发的软件包来支持国际化/本地化.然而,它是在大约二十年前开发的,并且图书馆仅限于一个产品系列.我对最先进的技术感兴趣.Unicode是今天所有国际努力的基本字符集吗?人们还在使用gettext()和家人吗?如果使用C++,我应该专注于该语言的语言环境支持吗?
我查看了有关国际化和本地化的维基百科条目,其中包括指向其他网站和相关主题的链接.但是那里有很多,我想要的是一个来源,特别是一本书,它是当前软件领域Linux/Unix主题的一个很好的介绍.如果实现使用C++,那很好.
例如,多年前我读过Ken Lunde的一本名为" 理解日语信息处理"的书,后来又读了他的修订书" CJKV信息处理".两者都很有趣,但当然主要关注亚洲语言.是否有一本关于当前艺术的书(口头/书面)与语言无关?
我有一个相当大的项目,包含大量链接依赖项.问题是,有一个依赖关系被链接到使用VS 2005编译并链接到vc80调试crt,而我已迁移到VS 2008.问题是这也意味着我必须安装vc80 debug crt,因为我不再使用VS 2005,所以我宁愿避免这些事情.我希望能够找到罪魁祸首并避免从头开始重新编译整个项目和所有依赖项,因此,是否有一种方便的方法可以找出哪个依赖项链接到vc80 debug crt?