D的语法真的是上下文无关的吗?

2024-03-04

几个月前我在 D 新闻组上发布了这个问题,但由于某种原因,答案从未真正说服我,所以我想我应该在这里问。


D 的语法显然是上下文无关的 http://www.digitalmars.com/d/2.0/template-comparison.html.

然而,C++ 的语法则不然(即使没有宏)。 http://yosefk.com/c++fqa/web-vs-c++.html#misfeature-3 (请仔细阅读本文!)

现在授予,我什么都不知道(官方)关于编译器、词法分析器和解析器。我所知道的一切都是从网上学到的。
以下是(我相信)我对上下文的理解,用不太技术性的术语:

语言的语法是上下文无关的当且仅当您始终可以理解给定代码片段的含义(尽管不一定是确切的行为),而无需“查看”其他任何地方。

或者,甚至在less rigor:

如果我需要的话,语法不能是上下文无关的,我无法仅通过查看表达式来判断表达式的类型。

例如,C++ 未能通过上下文无关测试,因为meaning of confusing<sizeof(x)>::q < 3 > (2) 取决于value of q.

到目前为止,一切都很好。

现在我的问题是:D 也可以这样说吗?

在 D 中,哈希表可以通过Value[Key]声明,例如

int[string] peoplesAges;   // Maps names to ages

静态数组可以用类似的语法定义:

int[3] ages;   // Array of 3 elements

并且可以使用模板来使它们变得混乱:

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 invalid code.

这意味着我无法说出的意思T[0] or U只要看看它(即它可以是一个数字,它可以是一种数据类型,或者它可以是一个天知道是什么的元组)。我什至无法判断该表达式在语法上是否有效(因为int[U]当然不是——你不能有一个以元组作为键或值的哈希表)。

我尝试制作的任何解析树Test would fail有意义(因为它需要知道节点是否包含数据类型、文字或标识符),除非它delays结果直到值T是已知的(使其依赖于上下文)。

鉴于此,D 实际上是上下文无关的,还是我误解了这个概念?

为什么/为什么不呢?


Update:

我只是想评论一下:看到答案真的很有趣,因为:

  • 一些答案声称 C++ 和 Dcan't与上下文无关
  • 一些答案声称 C++ 和 D 是both上下文无关
  • 一些答案支持这样的说法:C++ 是上下文相关的,而 D 不是
  • 还没有人声称 C++ 是上下文无关的,而 D 是上下文相关的:-)

我不知道我是在学习还是变得更加困惑,但无论如何,我很高兴我问了这个……感谢大家花时间回答!


上下文无关首先是生成语法的一个属性。这意味着非终结符可以生成的内容不取决于非终结符出现的上下文(在非上下文无关生成语法中,“由给定非终结符生成的字符串”的概念通常很难理解)界定)。这不会阻止两个非终结符生成相同的符号字符串(因此相同的符号字符串出现在两个不同的上下文中具有不同的含义)并且与类型检查无关。

通常将上下文无关定义从语法扩展到语言,通过声明如果至少有一个上下文无关语法描述一种语言,则该语言是上下文无关的。

实际上,没有一种编程语言是上下文无关的,因为诸如“变量必须在使用之前必须声明”之类的内容无法通过上下文无关语法进行检查(它们可以通过某些其他类型的语法进行检查)。这还不错,在实践中,要检查的规则分为两部分:那些你想用语法检查的规则和那些你在语义传递中检查的规则(这种划分还允许更好的错误报告和恢复,所以有时你希望在语法中接受更多内容,以便为用户提供更好的诊断)。

人们说 C++ 不是上下文无关的意思是,不可能以一种方便的方式进行这种除法(使用方便的包括“几乎遵循官方语言描述”和“我的解析器生成器工具支持这种划分”作为标准;允许语法有歧义并通过语义检查解决歧义是对 C++ 进行切割的相对简单的方法,并且完全遵循 C++ 标准,但是当您依赖不允许的工具时,这会很不方便歧义语法,当你有这样的工具时,很方便)。

我对 D 的了解还不够,无法知道上下文无关语法中是否存在带有语义检查的语言规则的方便剪切,但您所展示的内容远不能证明不存在这种情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

D的语法真的是上下文无关的吗? 的相关文章

  • Task.Factory.StartNew 或 Parallel.ForEach 对于许多长时间运行的任务? [复制]

    这个问题在这里已经有答案了 可能的重复 Parallel ForEach 与 Task Factory StartNew https stackoverflow com questions 5009181 parallel foreach
  • 获取 TextBox 中的文本行数

    我试图通过标签显示文本框中的文本行数 但是 问题是如果最后一行为空 标签必须显示没有空行的行号 例如 如果它们有 5 行 最后一行为空 则标签应将行数显示为 4 Thanks private void txt CurrentVinFilte
  • 如何向WebRequest添加参数?

    我需要从 Web 服务调用一个方法 所以我编写了以下代码 private string urlPath http xxx xxx xxx manager string request urlPath index php org get or
  • 套接字编程-listen() 和accept() 有什么区别?

    我一直在读本教程 http www cs rpi edu moorthy Courses os98 Pgms socket html了解套接字编程 看来listen and accept 系统调用都做同样的事情 即阻塞并等待客户端连接到使用
  • 显示 div 内的用户名列表

    我是 jQuery 新手 在我的项目中 我创建了一个类User其中代码如下所示 static ConcurrentDictionary
  • 在异步请求中使用超时回调

    我之前问过这个问题 但我将用提出的解决方案来完成这个问题 并提出另一个问题 我正在使用这个类来进行异步网络请求 http msdn microsoft com en us library system net webrequest aspx
  • 何时使用 C++ 私有继承而不是组合?

    你能给我一个具体的例子吗 什么时候使用私有继承优于组合 就我个人而言 我将使用组合而不是私有继承 但在某些情况下 使用私有继承可能是特定问题的最佳解决方案 正在阅读C faq http www parashift com c faq lit
  • 如何检查号码是否只有唯一的数字?

    例如 2345 是唯一的数字 因为没有数字显示两次 但 3324 不是唯一的数字 因为 3 出现了两次 我尝试使用 但我 代码 显示但我没有得到数字我得到了数字 编辑 你不能使用字符串 number 10 number 100 number
  • 如何将 Visual-Studio 2010 切换到 c++11

    我是 c 编程新手 我想尝试 c 11 新功能 那么我要问的是如何切换 Visual studio 2010 才能编译 c 11 源代码 你可以参考这个表 VC10 中的 C 0x 核心语言功能 表格 http blogs msdn com
  • c 使用 lseek 以相反顺序复制文件

    我已经知道如何从一开始就将一个文件复制到另一个文件 但是我如何修改程序以按相反的顺序复制它 源文件应具有读取访问权限 目标文件应具有读写执行权限 我必须使用文件控制库 例如 FILE A File B should be ABCDEF FE
  • C# 实体框架我们应该使用 POCO.Id 还是仅使用 POCO 设置关系?

    我在服务方法中遇到一种情况 将 POCO 分配为另一个 POCO 的子对象无法按预期工作 我正在使用实体框架 4 public void ChangeOrderCurrency Currency currency order Currenc
  • 从 Golang 调用 C 函数

    我想在 Golang 中编写控制器逻辑并处理 json 和数据库 同时在 C 中使用我的数学处理模型 在我看来 调用 C 函数的开销必须尽可能低 就像设置寄存器 rcx rdx rsi rdi 一样 执行一些操作fastcall 并获取 r
  • += 运算符在 C++ 中是如何实现的?

    这是我一直在思考的一个问题 但从未找到任何资源来说明这个问题的答案 事实上它不仅是为了 也适用于它的兄弟姐妹 即 等等 当然不是 考虑这个例子 int a 5 a 4 this will make a 9 现在考虑等效表达式 a a 4 T
  • 重定向 std::cout

    我需要一个类 在其对象的生命周期内将一个 ostream 重定向到另一个 ostream 经过一番修补后 我想出了这个 include
  • 文件加密与解密问题

    我一直在尝试在 VC Express 2010 中加密和解密文件 我见过的所有教程和文档都需要两个FileStreams 来加密文件 一个用于读取未加密的版本 另一个用于加密 当我实际编写代码时 它不断抛出错误 告诉我它无法打开该文件 因为
  • 这些工作队列标志意味着什么?

    在研究工作队列时 我遇到了内核中定义的工作队列标志和常量 我有以下我无法理解的疑问 这里的排水和救援到底是什么意思 WQ DRAINING 1 lt lt 6 internal workqueue is draining WQ RESCUE
  • XCode std::thread C++

    对于学校的一个小项目 我需要创建一个简单的客户端 服务器结构 它将在路由器上运行 使用 openWRT 并且我试图在这个应用程序中使用线程做一些事情 我的 C 技能非常有限 所以我在internet https stackoverflow
  • Web API 2.0 使用 pascalcase 模型接收驼峰式命名的 JSON 数据

    我正在尝试对我的 Web API 进行 PUT 调用 我在 WebApiConfig cs 中设置了以下内容 以处理以驼峰形式将数据发送回我的 Web 项目 config Formatters JsonFormatter Serialize
  • C# 和断点 - 这里有魔术师吗?

    我有这个 public static void ByLinkText string text for var i 0 i lt 50 i try Setup Driver FindElement By LinkText text Click
  • 查找和替换正则表达式问题

    感谢这里对我其他问题的所有大力帮助 我开始掌握正则表达式 但我仍然对这个一无所知 我的代码是 StreamReader reader new StreamReader fDialog FileName ToString string con

随机推荐

  • 输入一个条目会导致所有条目被写入 (Tkinter)

    我正在使用 Tkinter 创建一个带有 GUI 的数独求解器桌面应用程序 我遇到的问题是在输入板时 这是我正在使用的代码 N 9 input 0 for i in range N for j in range N for i in ran
  • 自动链接 html 字符串中的 URL 和图像

    嗨 我有一个像这样的字符串 p class video http vimeo 2342343 p p class image http nerto it logo png p p class text try to write p p cl
  • 如何清除WKWebView的WKBackForwardList?

    看来backForwardListWKWebView 的属性是只读的 但我见过人们使用一些非常神奇的东西来解决这个问题 我需要找出某种方法来清除 WKWebView 的历史记录 我有什么想法可以这样做吗 到目前为止 我已经尝试了一些失败的技
  • read.table 或 read.csv 上的列名称向左移动

    最初我有这个 TSV 文件 示例 name type qty cxfm 1C 0 d2 H50 2 g3g 1G 2 hb E37 1 nlx E45 4 所以我使用 read csv 从 tsv 文件读取数据 但我总是得到以下输出 nam
  • 使用 Websphere MQ 6 授权

    我在运行 Windows Server 2003 的虚拟机上安装了 IBM 的 WebSphere MQ 版本 6 的服务器端 该虚拟机位于 Vista 桌面上 桌面已安装客户端 我有一个小测试程序 来自他们的代码示例 它将一条消息放入队列
  • Javascript 和 AJAX,仅在使用alert()时有效

    我的 JavaScript 遇到问题 它的行为似乎很奇怪 这就是正在发生的事情 我有一个表单 在用户提交后 它调用一个函数 onsubmit 事件 来验证提交的数据 如果有问题或者用户名 电子邮件已经在数据库中 这部分使用 ajax 它将返
  • 获取JUnit 4中@Before中当前正在执行的@Test方法

    我想获取当前正在执行的测试方法 Before这样我就可以将注释应用于当前正在执行的方法 public class TestCaseExample Before public void setUp get current method her
  • 从 bash 调用 php 函数 - 带参数

    我有一个简单的func php文件与concat功能 我想用两个参数从 linux bash shell 调用这个函数 1st Hello 2nd World 并将输出 Hello World 打印到 linux bash shell 请告
  • Laravel 5 - 如何创建 Artisan 命令来执行 bash 脚本

    我想获得一个 artisan 命令来在执行时运行 bash 脚本 所以我使用以下命令创建了一个 artisan 命令 php artisan make command backupList command backup list 这是 ba
  • 保存时 VSCode Prettier 格式搞乱了格式

    在保存功能上使用 VSCode Prettier 格式已经有一段时间了 最近 Javascript 不断犯错误和格式错误 例如 const foo 123 save const foo 1 23 我暂时禁用了它 但是有什么办法可以防止这种情
  • 与泛型的模式匹配

    给定以下类模式匹配 clazz match case MyClass gt someMethod MyClass 是否可以根据模式匹配结果以通用方式引用 MyClass 例如 如果我有 MyClass 的多个子类 我可以编写一个简单的模式匹
  • 使用凭据将 I/O 文件写入共享网络驱动器

    我想将 txt 文件放到共享网络驱动器上 该路径是网络驱动器上的映射 需要凭据 登录名和密码 我可以使用 FileOutputStream 传递这些参数吗 FileOutputStream fos DataOutputStream dos
  • R 2.14.0 包检查中的描述导入顺序:和 NAMESPACE import()

    当我检查包时 我试图找出函数名称之间似乎存在冲突的地方 我最终可能会直接询问这个问题 但首先 我想知道三件事 R exts 中似乎没有提到这三件事 描述 导入和命名空间导入 中列出的包应该是相同的 对吧 在任一列表中 导入顺序重要吗 如果是
  • 将 Html 表转换为数据表的最佳方法是什么

    我有一个 html 表 我想将其转换为数据表 这样做的最佳方法是什么 谢谢 不要自己解析 HTML 有解析库可以为您做到这一点 再加上HTML 敏捷包 http html agility pack net z codeplex和 LINQ
  • Fusion Table 和 Google 服务帐户

    我正在尝试使用 Google 服务帐户从我的 AppENGine Java 应用程序访问 Fusion 表 此代码片段用于获取 OAuth 访问令牌 ArrayList
  • 通过交替行组进行 SQL 分区

    我有一个类似这样的数据表 Key LotId TransactionType Quantity Destination 1 A Transform NULL Foo 2 A Transform NULL Bar 3 A Consume 10
  • 从 PHP 执行 Perl 脚本时出现问题

    试图弄清楚这一点 我正在尝试使用 shell exec 在 php 中执行 perl 脚本 如下所示 它不会使用 gt filename txt 将输出写入文件 如果我执行而不将其定向到文件名 它将起作用 因为我可以使用 echo 确认这一
  • Spring MVC:在 中使用通配符

    我正在为 Spring MVC 应用程序实现一个缓存清除系统 为了让这个系统正常工作 我必须从给定的 URL 中删除 缓存清除代码 假设我生成的缓存清除代码是 123 并且我有一个 css 网址 public 123 css style c
  • 如何从 C# 调用 C++ dll 导出函数

    这是我第一次尝试将 C 与非托管 C 混合在一起 所以这可能是一个非常简单的问题 但我不明白 我需要将 C dll 中的一些函数调用到 C 代码中 以下是 dll 项目的代码 h 文件 pragma once include
  • D的语法真的是上下文无关的吗?

    几个月前我在 D 新闻组上发布了这个问题 但由于某种原因 答案从未真正说服我 所以我想我应该在这里问 D 的语法显然是上下文无关的 http www digitalmars com d 2 0 template comparison htm