“的正式术语是什么?”#{};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.yripper.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