“的正式术语是什么?”#{};Ruby语法中的令牌? 背景
我最近发布了一篇文章,其中我将“的正式术语是什么?”#{};Ruby语法中的令牌? 背景,ruby,syntax,computer-science,Ruby,Syntax,Computer Science,我最近发布了一篇文章,其中我将#{}称为文字、运算符和(在一篇草稿中)文字构造函数。这个定义的扭曲性并没有真正影响答案的质量,因为问题更多的是关于它做什么以及如何找到它的语言引用,但是,我很不高兴,因为我无法准确地指出Ruby语法元素的规范定义 在上一节中提到了这个语法元素,但没有真正定义语法本身的术语。几乎所有对该语言元素的引用都表示它用于字符串插值,但没有定义它是什么 维基百科定义 这里有一些维基百科的定义,暗示这个构造(严格地说)既不是文字也不是运算符 问题 有人知道这个语言元素的正确
#{}
称为文字、运算符和(在一篇草稿中)文字构造函数。这个定义的扭曲性并没有真正影响答案的质量,因为问题更多的是关于它做什么以及如何找到它的语言引用,但是,我很不高兴,因为我无法准确地指出Ruby语法元素的规范定义
在上一节中提到了这个语法元素,但没有真正定义语法本身的术语。几乎所有对该语言元素的引用都表示它用于字符串插值,但没有定义它是什么
维基百科定义
这里有一些维基百科的定义,暗示这个构造(严格地说)既不是文字也不是运算符
问题
有人知道这个语言元素的正确术语是什么吗?如果是这样的话,你能给我指出一个正式的定义吗?我肯定既不称它为文字(这更适合于字符串文字或数字文字本身,但不是其中的一部分),也不称它为运算符;这些仅适用于二进制或一元(中缀)运算符
我要么直接引用它,而不使用名词(即用于字符串插值),要么将这些字符称为字符串插值序列或转义符。Ruby的解析器调用{}“embexpr”操作符。当然,这是一种隐含的表达方式。这篇文章暗示,它被称为“习语”: 维基百科的文章似乎并不矛盾: TL;博士 最初,我假设: 基于源代码中的提示,嵌入式表达式似乎是该标记最可能的定义 事实证明这是真的,Ruby2.x文档已经正式验证了这一点。基于自最初编写此答案以来对的更新,解析器令牌似乎被正式定义为
string\u embexpr
,符号本身被称为“嵌入式表达式”。有关详细的佐证,请参阅此答案底部的Ruby 2.x更新部分
答案的其余部分仍然是相关的,特别是对于Ruby 1.9.3这样的旧Ruby,并且用于开发原始答案的方法仍然很有趣。因此,我正在更新答案,但出于历史目的,保留了原始帖子的大部分内容,尽管目前的答案可能更短
基于Ruby 1.9.3源代码的Pre-2.x答案
相关答案
提请注意Ruby源代码,它在整个代码库中大量引用了embexpr@Phlip认为该变量是“嵌入式表达式”的缩写。这似乎是一个合理的解释,但无论是ruby-1.9.3-p194源代码还是Google(截至本文撰写之时)都没有在任何上下文中明确引用与embexpr相关的术语嵌入式表达式,无论是否与ruby相关
补充研究
对Ruby 1.9.3-p194源代码的扫描,包括:
ack-grep -cil --type-add=YACC=.y embexpr .rvm/src/ruby-1.9.3-p194 |
sort -rnk2 -t: |
sed 's!^.*/!!'
显示9个文件和33行,其中包含术语embexpr:
特别令人感兴趣的是在parse.y和ripper.ybison文件的第4176行中包含string_embexpr。同样地,TestRipper::ParserEvents#test#string _embexpr包含对test#{}解析器事件.rb的第899行和第902行上的解析的两个引用
在test\u scanner\u events.rb中使用的扫描器也值得注意。此文件在#test_embexpr_beg和#test_embexpr_end中定义了扫描各种字符串表达式中的标记#{expr}的测试。这些测试同时引用了embexpr和expr,提高了“嵌入式表达式”确实是事物的合理名称的可能性
Ruby 2.x的更新
由于这篇文章最初是编写的,标准库的Ripper类的文档已经更新,以正式识别令牌。提供了“Hello,#{world}!”
作为示例,并部分说明:
在我们的:string\u literal
中,您会注意到两个@tstring\u content
,这是Hello、
和的literal部分代码>。在两个@tstring\u content
语句之间是一个:string\u embexpr
,其中embexpr是一个嵌入式表达式
我称之为字符串插值运算符。虽然我在ruby-1.9.3-p194源代码中找到了33行包含embexpr的代码,但我并不认为有正式的定义,最著名的是TestRipper::ParserEvents#test(测试)string(测试)embexpr。然而,我找不到任何对embexpr的引用被称为嵌入表达式(尽管这似乎很可能),也找不到任何称其为运算符的引用。您能稍微扩展一下您的答案,或者添加一两条引文吗?这是令牌解析器返回的原语之一。我以前使用过这个解析器,但是这33行代码必须为您完成。我想以前没有人考虑过这个问题!无论是谁,我在对现在删除的答案的评论中与他聊天,我很抱歉你觉得你必须根据我们的交流删除你的答案。这不是一个习语,它是一个习语。这就像解释“Ruby使用运算符+来添加数字”意味着“+”被称为“运算符”
test_scanner_events.rb:12
test_parser_events.rb:7
eventids2.c:5
eventids1.c:3
eventids2table.c:2
parse.y:1
parse.c:1
ripper.y:1
ripper.c:1