`InputElementDiv`在ECMAScript词法语法中代表什么?

Max*_*kyi 7 javascript compiler-construction lexical-analysis ecmascript-6

ECMAScript 的词法语法列出了词法分析器(词法分析器)的以下标记类:

InputElementDiv::
    WhiteSpace
    LineTerminator
    Comment
    CommonToken
    DivPunctuator
    RightBracePunctuator
InputElementRegExp::
    WhiteSpace
    LineTerminator
    Comment
    CommonToken
    RightBracePunctuator
    RegularExpressionLiteral
InputElementRegExpOrTemplateTail::
    WhiteSpace
    LineTerminator
    Comment
    CommonToken
    RegularExpressionLiteral
    TemplateSubstitutionTail
InputElementTemplateTail::
    WhiteSpace
    LineTerminator
    Comment
    CommonToken
    DivPunctuator
    TemplateSubstitutionTail
Run Code Online (Sandbox Code Playgroud)

虽然我理解嵌套类,比如WhiteSpace,LineTerminator我不明白的顶级类是什么:InputElementDiv,InputElementRegExp,InputElementRegExpOrTemplateTailInputElementTemplateTail.有人可以澄清一下吗?

log*_*yth 13

绝对不是很明显,我一直在努力解码所有这一切.重要说明见https://www.ecma-international.org/ecma-262/8.0/index.html#sec-ecmascript-language-lexical-grammar.特别:

在几种情况下,词汇输入元素的识别对消耗输入元素的句法语法上下文敏感.这需要词汇语法的多个目标符号.InputElementRegExpOrTemplateTail目标用于语法语法上下文,其中允许使用RegularExpressionLiteral,TemplateMiddle或TemplateTail.InputElementRegExp目标符号用于允许使用RegularExpressionLiteral的所有语法语法上下文中,但不允许使用TemplateMiddle和TemplateTail.InputElementTemplateTail目标用于允许TemplateMiddle或TemplateTail但不允许使用RegularExpressionLiteral的所有语法语法上下文中.在所有其他上下文中,InputElementDiv用作词汇目标符号.

前面的关键部分:

在某些情况下,词汇输入元素的识别对句法语法上下文很敏感

请记住,这是词法语法定义,因此它所要做的就是生成一组标记.

所以让我们更多地打破它.考虑一下这样的片段:

/foo/g
Run Code Online (Sandbox Code Playgroud)

如果没有给出上下文,有两种方法可以解释这个:

  1. DivPunctuator IdentifierName DivPunctuator IdentifierName

    "/" "foo" "/" "g"
    
    Run Code Online (Sandbox Code Playgroud)
  2. RegularExpressionLiteral

    "/foo/g"
    
    Run Code Online (Sandbox Code Playgroud)

从词法分析器的角度来看,它没有足够的信息来知道选择哪一个.这意味着词法分析器需要有一个类似expectRegex或类似的标志,不仅基于当前字符序列而且还基于先前遇到的标记来切换行为.有些事情需要说"期待接下来的运营商"或"期待下一个正则表达式文字".

以下情况也是如此

}foo${
Run Code Online (Sandbox Code Playgroud)
  1. RightBracePunctuator IdentifierName 标点符号

    "}" "foo$" "{"
    
    Run Code Online (Sandbox Code Playgroud)
  2. TemplateMiddle

    "}foo${"
    
    Run Code Online (Sandbox Code Playgroud)

在这种情况下需要使用第二个切换.

所以这给我们留下了一张你见过的4个选项的好桌子

| expectRegex | expectTemplate | InputElement                     |
| ----------- | -------------- | -------------------------------- |
| false       | false          | InputElementDiv                  |
| false       | true           | InputElementTemplateTail         |
| true        | false          | InputElementRegExp               |
| true        | true           | InputElementRegExpOrTemplateTail |
Run Code Online (Sandbox Code Playgroud)

然后规范涵盖了这些标志切换时:

  • InputElementRegExpOrTemplateTail:此目标用于允许使用RegularExpressionLiteral,TemplateMiddle或TemplateTail的语法语法上下文中.
  • InputElementRegExp:此目标符号用于允许使用RegularExpressionLite但但不允许使用TemplateMiddle和TemplateTail的所有语法语法上下文中.
  • InputElementTemplateTail:此目标用于允许TemplateMiddle或TemplateTail但不允许使用RegularExpressionLiteral的所有语法语法上下文中.
  • InputElementDiv:此目标用于所有其他上下文.