与C+相比,Vala是一种理智的解析语言吗+;? 解析C++的问题是众所周知的。它不能纯粹基于语法进行解析,不能作为LALR(不管是什么术语,我不是语言理论家),语言规范有无数页,等等。出于这个和其他原因,我决定为我的个人项目选择一种替代语言

与C+相比,Vala是一种理智的解析语言吗+;? 解析C++的问题是众所周知的。它不能纯粹基于语法进行解析,不能作为LALR(不管是什么术语,我不是语言理论家),语言规范有无数页,等等。出于这个和其他原因,我决定为我的个人项目选择一种替代语言,c++,parsing,vala,C++,Parsing,Vala,瓦拉看起来是一种很好的语言。虽然C++提供了很多改进,但解析也是一样麻烦吗?或者它是否有一个整洁、合理长度的形式语法,或者一些逻辑描述,适合为编译器、源代码分析器和其他工具构建解析器 不管答案是什么,这是否适用于精灵替代语法 (我也对D和其他后C++非VM语言感到疑惑,尽管不那么强烈。)C++是最复杂(如果不是最复杂的话)的编程语言之一。特别困难的是它的名称查找规则和模板实例化规则。C++不是使用LALR(1)解析器(如BISY和YACC生成的解析器)可解析的,但它完全可以解析(毕竟,人们每天使

瓦拉看起来是一种很好的语言。虽然C++提供了很多改进,但解析也是一样麻烦吗?或者它是否有一个整洁、合理长度的形式语法,或者一些逻辑描述,适合为编译器、源代码分析器和其他工具构建解析器

不管答案是什么,这是否适用于精灵替代语法


(我也对D和其他后C++非VM语言感到疑惑,尽管不那么强烈。)

C++是最复杂(如果不是最复杂的话)的编程语言之一。特别困难的是它的名称查找规则和模板实例化规则。C++不是使用LALR(1)解析器(如BISY和YACC生成的解析器)可解析的,但它完全可以解析(毕竟,人们每天使用解析C++没有问题的解析器)。(事实上,早期版本的G++是建立在Bison的广义LR解析器框架之上的,实际上不是,请参见注释),直到最近才被手写的递归下降解析器取代)

另一方面,我不确定我看到Vala对C++提供了什么改进。这些语言试图实现相同的目标。另一方面,除了使用Vala接口编写的GTK+之外,您可能找不到太多其他内容。您将使用C接口来实现其他所有功能,这实际上违背了使用这种语言的意义

如果你不喜欢C++,因为它的复杂性,它可能是一个好主意,考虑Objy-C代替,因为它是C的简单扩展,(像Vala),但是有一个更大的程序员社区,你可以借鉴它的基础,为所有的MAC土地。


最后,我不明白为什么解析语言本身的困难与程序员在使用该语言时应该关心什么有关。就我的2美分。

很简单。您可以使用libvala进行解析、语义分析和代码生成,而不是编写自己的代码。

功能是为项目选择特定语言的一个很好的理由,但解析该语言有多困难又有什么关系呢?(除非您的个人项目正在为所述语言编写编译器)。在这一点上,C++不是一个LR(1)语法,像java和C是,并且可能涉及无限的前瞻。想要构建编程工具的人似乎把重点放在解析上。这只是许多问题中的一个,事实上,这是最容易的,因为它已经很好地解决了。更困难的部分是掌握语言语义并对其进行处理。我把这称为“攀登珠穆朗玛峰”问题;解析可以让你到达山麓,这一步很容易。从山麓走向顶峰需要一整套全新的技术、工程和汗水(请参阅我的Bio,以了解它可能是什么样子)。对于那些想知道解析能力可能很重要的人来说,解析C++实际上是不可判定的,你可能会喜欢“编程语言在程序员教育中的作用”。丹尼尔·弗里德曼(见)。@jleedev:你似乎在选福德。提到的这篇文章比你的简短评论中所暗示的要微妙得多。作为一个实际问题,解析C++是可判定的,或者程序员将停止使用C++编译器。本地歧义与模板之间的混淆不是问题。使用标准解析器技术可以轻松解决某些短语的局部歧义(我在解析器中使用GLR,效果很好)。计算停止谓词的模板是不同的,但实际上没有人编写这些谓词,编译器对启动的模板处理设置了有限的限制。+1对于最后一部分,可解析性甚至不应该成为普通开发人员所关心的问题。我怀疑g++是否基于Bison的通用LR解析器基础设施:该基础设施已于2002年在1.5版中添加。AFEK,预3.4解析器是LAL或多或少的干净黑客,使它处理C++。@程序员:恐怕我不明白。C++不是用LALR可解析的。一个GHCC的早期版本通过使用BISON作为纯LALR(1)解析器来解析C++,其中一些非常糟糕的黑客涉及符号表和类型信息来解决歧义。(请参阅我的答案,以了解有关其工作原理的更多详细信息)。较新的版本使用手写的救援下降。。。我认为同样重要的黑客行为可以避免前瞻性。至于“需要解析的糟糕语言”,我投了很多票:PHP的定义太差;在任何地方都有关键字,有时是标识符,有时不是标识符,这是很自然的;如果您想发疯,可以尝试解析任何动态HTML,其中人们将JavaScript片段与HTML块和客户端代码混合在一起,这些代码使用第三种语言(C#,JSP,…)生成JavaScript片段。(如果你想分析一个HTML页面,你需要这样做)。