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,InputElementRegExpOrTemplateTail和InputElementTemplateTail.有人可以澄清一下吗?
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)
如果没有给出上下文,有两种方法可以解释这个:
DivPunctuator IdentifierName DivPunctuator IdentifierName
"/" "foo" "/" "g"
Run Code Online (Sandbox Code Playgroud)"/foo/g"
Run Code Online (Sandbox Code Playgroud)从词法分析器的角度来看,它没有足够的信息来知道选择哪一个.这意味着词法分析器需要有一个类似expectRegex或类似的标志,不仅基于当前字符序列而且还基于先前遇到的标记来切换行为.有些事情需要说"期待接下来的运营商"或"期待下一个正则表达式文字".
以下情况也是如此
}foo${
Run Code Online (Sandbox Code Playgroud)
RightBracePunctuator IdentifierName 标点符号
"}" "foo$" "{"
Run Code Online (Sandbox Code Playgroud)"}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:此目标用于所有其他上下文.| 归档时间: |
|
| 查看次数: |
254 次 |
| 最近记录: |