点符号点是运算符还是其他?你怎么知道的?

时间:2019-06-25 12:48:15

标签: javascript token semantics lexical-analysis formal-languages

我正在尝试对点表示法(object.property)中使用的“点”标记进行分类。

作为一个自学成才的业余开发人员,主要使用JavaScript,我对编程和JavaScript有了简化的(当然是不完美的)理解。

在阅读代码时,我倾向于将令牌分为五类:

  1. 标识符(+保留关键字)
  2. 操作员
  3. 定界符/标点符号
  4. 乱扔垃圾
  5. 评论

但是,当要根据我的简化模型对点表示法中使用的点进行分类时,我有一个疑问,但是也许尝试以这种方式进行分类没有任何意义。

我更像一个二进制运算符来查看它,它使用两个标识符并返回一个引用(可以是定界符吗?)。但是我没有设法找到一个明确的证据。 (或者至少可以清楚地确定它并且我能够理解)。

我查看了各种文档,包括ECMA规范。

这是我有两个问题:

  • 您认为我可以在哪里找到所需的信息,或者可以使用哪些关键字?
  • 您如何看待作为令牌的点分类?二元运算符?你怎么知道的?

2 个答案:

答案 0 :(得分:2)

如果您专注于纯点符号,而如果您以JS为例,则更多,它是定界符。

当然,它不适用于添加功能的框架或形状。例如,一个自动执行对私有属性或类似属性的获取/设置调用的框架。

为什么?因为点表示法是替代半形符号或上下颠倒的一种方法。胸像是定界符。 thing['otherthing']thing.otherthing

答案 1 :(得分:1)

从语法上讲,它是一个后缀运算符。也许最好将其称为后缀运算符家族,每个可跟随其后的合法标识符一个。

它类似于下标符号v[a],即使它有两个值作为操作数,也可以更好地在语法上将其视为(定界)后缀运算符。同样,我们可以将所谓的三元运算符cond ? alt1 : alt0称为定界二元运算符。语法上,“运算符”为? alt1:

这种语法视图最初可能看起来有点奇怪,来自对运算符语法的描述,该语法基本上具有以下形式:使用⟨⟩进行分组,使用*进行可选重复(即,0个或多个实例(如正则表达式中一样)。

⟨ PREFIX*  OPERAND POSTFIX* ⟩ ⟨ INFIX ⟨ PREFIX*  OPERAND POSTFIX* ⟩ ⟩*

该公式通过将( EXPRESSION )包含在OPERAND中(递归)来处理括号,因为括号用于分组,而在( EXPRESSION_LIST )中包含POSTFIX则用于函数调用中的括号。

以这种方式查看表达式有助于解析。它还有助于阐明优先级和关联性的含义,特别是对于定界运算符。

运算符优先级的一般规则是,我们首先为所有后缀运算符赋予相同的最高优先级。从理论上讲这不是必需的,但几乎总会导致预期的意义。没有人会把2+sin(0.5)解释为对“函数” 2+sin的调用。与您的问题更相关,2+s.size直观地意味着.size首先应用于s,然后将2添加到结果中。