我正在尝试学习与编程语言相关的Chomsky Hierarchy的某些方面,我仍然需要阅读Dragon Book。
我读过大多数编程语言都可以解析为无上下文语法(CFG)。就计算能力而言,它等于下推非确定性自动机之一。我是对的吗?
如果这是真的,那么CFG怎么能保持一个不受限制的语法(UG),这是完整的?我问,因为即使编程语言是由CFG描述的,它们实际上也用于描述图灵机,所以通过UG。
我认为这是因为至少有两种不同的计算级别,第一种,即CFG的解析侧重于与语言结构(表示?)相关的语法,而另一种侧重于语义(感觉,数据本身的解释?)与图形语言的完整性相关。再次,这些假设是对的吗?
答案 0 :(得分:23)
我读过大多数编程语言都可以解析为无上下文语法(CFG)。就计算能力而言,它等于下推非确定性自动机之一。我是对的吗?
技术上是的。有用,没有。
至少有两种有用的方法可以考虑这些问题:
难点在于,虽然大多数编程语言都有一个可以通过无上下文语法轻松描述的底层结构(Tcl是一个有趣的例外),但无上下文语法所描述的许多句子实际上并不存在“在语言中”,其中“在语言中”是指“所用语言中的有效程序”。这些额外的句子通常被某种形式的静态语义排除。例如,以下话语是C程序无上下文语法中的一个句子,但它本身并不属于有效的C程序集:
int f(void) { return n + 1; }
这里的问题是n
不在范围内。 C需要“使用前声明”,并且该属性不能使用无上下文语法表达。
实际编程语言的典型决策过程是编译器或解释器的前端的一部分,它至少包含两部分:一,解析器 ,相当于下推自动机的决策权;但是第二个做了额外的检查,排除了许多话语无效。如果这些检查需要任何类型的使用前定义属性,则无法通过下推自动机或无上下文语法来完成它们。
如果这是真的,那么CFG怎么能保持一个完整的无限制语法(UG)呢?
CFG不会“持有”任何东西 - 它只是描述一种语言。
...即使编程语言由CFG描述,它们实际上也用于描述图灵机,所以通过UG。
你在这里跳过了一些重要的间接层。
我认为这是因为至少有两种不同的计算级别,第一种,即CFG的解析侧重于与语言结构(表示?)相关的语法,而另一种侧重于语义(感觉,数据本身的解释?)与图形语言的完整性相关。再次,这些假设是对的吗?
他们似乎对我有些混乱,但你走在正确的轨道上。一个关键问题是“语言和编程语言之间有什么区别?”答案是编程语言具有计算解释。计算解释有许多优良品种,并非所有这些都是图灵完整的。 但神奇的是解释,而不是语法,所以乔姆斯基的层次结构在这里并不是很相关。
为了证明我的观点,一个极端的例子:常规语言[1-9][0-9]*
是图灵完成的,具体如下:
因此整数文字的语言是Turing-complete。
如果你的脑袋现在不疼,那就应该。
答案 1 :(得分:1)
这绝对不是真的。大多数编程语言都有可以由CFG或BNG描述的语法,但符合语法并不能保证合法程序。有各种额外的条件,例如“变量必须在使用前声明”或“此表达式中的类型必须以合法的方式组合”,不涵盖在语法中,这是是什么让这些语言不受上下文限制。 (这有点像XML,它具有可正式验证的定义,但通常还有解析器无法验证的额外约束。)
答案 2 :(得分:1)
非常好的语言示例,其语法没有CFG是C ++。你似乎完全不了解UG。通用语法是一种解释问题,被描述为一种单词语言,其中包含图灵机所接受的机器和单词的代码。所以你不要对语言本身(单词集)进行编码,而是为它设置图灵机。现在要点 - 你可以拥有无限单词的语言,但你不能拥有无限符号的单词。这意味着,UG也包含有限的单词,因此图灵机的所有描述都是有限的。因此,图灵机(程序设计语言中的程序)的描述具有有限数量的符号(语句),因此描述语言(编程语言语法语法)可以是规则的。请查看Binary Combinatory Logic。
的示例