我经常听到C++是一种上下文敏感语言的说法.请看以下示例:
a b(c);
Run Code Online (Sandbox Code Playgroud)
这是变量定义还是函数声明?这取决于符号的含义c.如果c是变量,则a b(c);定义名为btype 的变量a.它是直接初始化的c.但是如果c是一个类型,则a b(c);声明一个名为a的函数b,c并返回一个a.
如果您查找无上下文语言的定义,它基本上会告诉您所有语法规则必须具有仅由一个非终端符号组成的左侧.另一方面,上下文敏感语法允许左侧的任意字符串的终端和非终端符号.
浏览"C++编程语言"的附录A,除了左侧的单个非终端符号之外,我找不到单个语法规则.这意味着C++是无上下文的.(当然,在无上下文语言形成上下文敏感语言的子集的意义上,每种无上下文语言也都是上下文敏感的,但这不是重点.)
那么,C++是无上下文还是上下文敏感?
c++ syntax grammar context-free-grammar context-sensitive-grammar
我已经编程了几个月了,一个经常使用的词是类中的"上下文".喜欢ServletContext(Java),Activity(Android),Service(Java,Android),NSManagedContext(Objective-C,iOS).
通过查看词典,我看到这个词意味着:情境,环境,环境等等.但是,因为我不是母语为英语的人,所以我不明白我应该直接将其翻译成什么.例如,如果我要编写一个已命名的类SomeClassContext,或者一个具有上下文参数的方法,我不明白何时应该将其命名为context,因为我不理解它.
我一直在寻找Stack Overflow的上下文,但没有问题/答案能够帮助我.
如果有人可以向我提供解释,我会很高兴.
我几个月前在D新闻组上发布了这个,但由于某种原因,答案从未真正说服过我,所以我想我会在这里问.
但是,C++的语法不是(即使没有宏).(请仔细阅读!)
现在被授予,我对编译器,词法分析器和解析器一无所知(正式).我所知道的只是我在网上学到的东西.
以下是(我相信)我对上下文的理解,在非技术术语中:
语言的语法是无上下文的,当且仅当你能够总是理解给定代码片段的含义(尽管不一定是确切的行为)而不需要在任何其他地方"看".
或者,更严格:
如果我需要,语法不能无上下文我只是通过查看它就无法告诉表达式的类型.
因此,例如,C++失败上下文测试,因为意义的confusing<sizeof(x)>::q < 3 > (2) 依赖于值的q.
到现在为止还挺好.
现在我的问题是:可以对D说同样的话吗?
例如,在D中,可以通过Value[Key]声明创建哈希表
int[string] peoplesAges; // Maps names to ages
Run Code Online (Sandbox Code Playgroud)
静态数组可以用类似的语法定义:
int[3] ages; // Array of 3 elements
Run Code Online (Sandbox Code Playgroud)
模板可以用来使它们混淆:
template Test1(T...)
{
alias int[T[0]] Test;
}
template Test2(U...)
{
alias int[U] Test2; // LGTM
}
Test1!(5) foo;
Test1!(int) bar;
Test2!(int) baz; // Guess what? It's …Run Code Online (Sandbox Code Playgroud) 我创建了一个iOS移动应用程序.我想知道是否有办法为swift编程语言生成UML类图?我已经尝试过Omni Graffle,但它一直说该项目不包含Objective-C接口.Omni Graffle只针对objective-c执行此操作.请帮忙.
提前致谢.
我很好奇哪些(如果有的话)现实世界的编程语言都有常规语法(即所有语法正确的程序集是常规的).
另请参阅此问题:哪些编程语言不受上下文限制?.