实际上,对于最终可以被编译/转换为系统级指令的语言,是否有必要采用上下文无关的语法?
例如:所有编程/脚本语言都是上下文无关的语法吗?Java是基于CFG的,但是实际上所有编程语言都是基于CFG的吗?
它似乎不是强制性的,但是我的理解存在空白。
问题的上下文:我正在查看Java语言规范,该规范还提供了语法规则。这使我想到了这个问题。
实际上,对于最终可以被编译/转换为系统级指令的语言,是否有必要采用上下文无关的语法?
例如:所有编程/脚本语言都是上下文无关的语法吗?Java是基于CFG的,但是实际上所有编程语言都是基于CFG的吗?
它似乎不是强制性的,但是我的理解存在空白。
问题的上下文:我正在查看Java语言规范,该规范还提供了语法规则。这使我想到了这个问题。
Answers:
两次没有
首先,大多数HPL不是上下文无关的。尽管它们通常具有基于CFG的语法,但它们也具有人们所谓的静态语义(这也经常包含在术语语法中)。这可以包括必须签出正确程序的名称和类型。例如,
class A {
String a = "a";
int b = a + d;
}
是语法上正确的Java程序,但由于d
未定义且a
没有合适的类型而无法编译。
其次,您可以解析非上下文无关的语言(编译器的存在证明了这一点)。通常,只有CFG可以有效地解析,而CSG通常无法解析。但是,您可以添加某些非上下文无关的功能,同时保持效率。
编译器通常分阶段运行:首先进行标记化(常规),然后进行无上下文解析,然后进行名称和类型分析(对上下文敏感,有时甚至更困难)。您可以通过收到的错误消息来观察该行为。
public class Program { public static void main(String[] args) { ... } }
... Java不会让您如此轻松。:-)
class A { ... }
它足以javac
编译您实际上无法执行的内容(由于缺少入口点)。但是,是的。
无法解析perl。
我不认为Python的语法是上下文无关的。相同代码块中的行具有相同缩进量的要求不是上下文无关语法处理得很好的事情。
更准确地说,Python块形式的语言似乎具有同态性
如果条件: 1号线 2号线 3号线 其他: 4号线
到非上下文无关的语言,其中第一个零块来自第1行开始处的空格,第二个块来自第2行开始处的空格,第三个块来自第3行开始处的一组空格,其余行以及else等迫使第1行,第2行和第3行属于同一块。
foo * bar;
的声明foo
为指针bar
或乘法foo
倍bar
?
Bodo Manthey和MartinBöhme表明,每个C ++编译器都必须是Turing完整的,也就是说,它可以在编译时计算任何部分递归函数。因此,这比上下文敏感要糟糕得多。
http://wwwhome.math.utwente.nl/~mantheyb/journals/BotEATCS_BoehmeManthey_CompilingCPP.pdf
我认为使用变量之前的声明和OOP语言的功能多态性是上下文无关语法无法处理的编程语言规范的其他示例:
int myfun(int a) { ... }
int myfun(int a, int b) { ... }
int myfun(int a, int b, int c, ...) { ... }
...
int I_m_I_cfg = myfun(1,2);
...
我做了一个小谷歌搜索,我发现这篇文章:“ 一个布尔语法的简单布尔语 ”由A.Okhotin(2004年); 据他介绍,真正的问题是找到一种用正式语法完全描述的编程语言:
定义了一种玩具程序编程语言,并 为使用该语言的格式良好的程序集构建了布尔语法。显然,这完全是形式语法对编程语言的第一个规范。
本文的简介部分很简短,但很清楚。
我相信C的语法在技术上仅是上下文无关的,因为解析器始终使用非上下文无关的技术来支持Duff的设备。
基于缩进的语言自然也不像David所说的那样没有上下文,但是相对于参数化的缩进令牌而言,它们变得没有上下文。
Haskell使您可以使用infix和infixl更改运算符优先级。Perl的严格编译指示模块使用词法设置$ ^ H和%^ H来实现,这使其不是上下文无关的,可能还有其他设置。
有些宏扩展器语言(例如TeX)在其中不执行afaik解析就没有意义。
甚至可能有两个上下文无关的语法,它们的交集不是上下文无关的,但仍然描述了图灵机。
Java和汇编器可能自然都与上下文无关。
(a)-b
使C上下文敏感不模糊吗?(a
可能是变量,也可能是
至于“所有编程/脚本语言都是上下文无关的语法吗?” 关于部分,答案是肯定的。
关于“对于最终可以被编译/转换成系统级指令的语言”的主要问题,我不知道为什么它必须成为CFG。但是,可能会有更好的解释。
编程语言需要基于某种语法形式主义,其中CFG就是一个例子。虽然CFG是最常见的(并且是大学编译器课程中教的常识),但还有其他形式主义,例如解析表达式语法,您可以在此处(pdf)或Wikipedia上了解更多有关此内容的内容。