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
等嵌套类,但我不明白顶级类是什么:LineTerminator
,InputElementDiv
,{{1} }和InputElementRegExp
。有人可以澄清一下吗?
答案 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
如果没有给出上下文,有两种方法可以解释这个:
DivPunctuator IdentifierName DivPunctuator IdentifierName
"/" "foo" "/" "g"
"/foo/g"
从词法分析器的角度来看,它没有足够的信息来知道选择哪一个。这意味着词法分析器需要有一个像expectRegex
之类的标记,它不仅可以根据当前的字符序列切换行为,还可以切换以前遇到的标记。 某事需要说"期待接下来的运营商"或者"期待下一个正则表达式文字"。
以下
也是如此}foo${
RightBracePunctuator IdentifierName Punctuator
"}" "foo$" "{"
"}foo${"
此案例需要使用第二个切换。
因此,我们为您提供了一个很好的表格,其中列出了您已经看过的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
:此目标在所有其他环境中使用。