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

时间:2017-08-16 20:03:16

标签: javascript ecmascript-6 compiler-construction lexical-analysis

ECMAScript的

The lexical grammar列出了词法分析器(词法分析器)的以下标记类:

ASPNETCoreModule

虽然我理解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 WhiteSpace等嵌套类,但我不明白顶级类是什么:LineTerminatorInputElementDiv,{{1} }和InputElementRegExp。有人可以澄清一下吗?

1 个答案:

答案 0 :(得分:11)

绝对不是很明显,我一直在努力解码这一切。重要的注意事项在https://www.ecma-international.org/ecma-262/8.0/index.html#sec-ecmascript-language-lexical-grammar。具体做法是:

  

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

前面有关键部分:

  

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

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

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

/foo/g

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

  1. DivPunctuator IdentifierName DivPunctuator IdentifierName

    "/" "foo" "/" "g"
    
  2. RegularExpressionLiteral

    "/foo/g"
    
  3. 从词法分析器的角度来看,它没有足够的信息来知道选择哪一个。这意味着词法分析器需要有一个像expectRegex之类的标记,它不仅可以根据当前的字符序列切换行为,还可以切换以前遇到的标记。 某事需要说"期待接下来的运营商"或者"期待下一个正则表达式文字"。

    以下

    也是如此
    }foo${
    
    1. RightBracePunctuator IdentifierName Punctuator

      "}" "foo$" "{"
      
    2. TemplateMiddle

      "}foo${"
      
    3. 此案例需要使用第二个切换。

      因此,我们为您提供了一个很好的表格,其中列出了您已经看过的4个选项

      | expectRegex | expectTemplate | InputElement                     |
      | ----------- | -------------- | -------------------------------- |
      | false       | false          | InputElementDiv                  |
      | false       | true           | InputElementTemplateTail         |
      | true        | false          | InputElementRegExp               |
      | true        | true           | InputElementRegExpOrTemplateTail |
      

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

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