JavaScript词法!

InputElement 输入元素

输入元素是JS词法扫描程序拿到的最基本元素了,也就是JS程序源代码中表达特定意义的"单词"。

输入元素共分为四种:

InputElement ::
    WhiteSpace
    Comment
    Token
    LineTerminator

值得注意的是,JS规范里面其实定义了两种InputElement ,如下所示

InputElementDiv ::
    WhiteSpace
    Comment
    Token
    LineTerminator
    DivPunctuator
InputElementRegExp ::
    WhiteSpace
    Comment
    Token
    LineTerminator
    RegularExpressionLiteral

这么做是因为JS的除法运算符和正则表达式直接量都使用了/字符,在词法分析阶段,是无法区分二者的。所以JavaScript的词法分析有两种状态,一种状态是扫描InputElementDiv,另一种状态是扫描InputElementRegExp,又所以,JS的词法分析器应该有两种状态,由语法分析器来设置,JavaScript的词法分析和语法分析必须交错进行。

下面的一个例子说明了除法和正则表达式写法的冲突问题:

if(a+b)/a/g;
(a+b)/a/g;

可以看到完全相同的/a/g(而且前面一段字符也相同),可能被理解为除法或者正则表达式。因为必须区分所处的语法环境,所以单单靠词法分析无论如何也无法决定该用除法还是正则表达式来理解。

因为基本上没有任何编辑环境会对文本做语法分析,这个问题也造成了很多语法着色系统无法很好地处理JS正则表达式。

以非语言实现者的角度,完全应该按照最上面一段产生式去理解JS的词法。


在学习web前端的过程中,难免会遇到很多的问题,这些问题可能会困扰你许久,为此我有个web开发学习交流群(545667817 ),里面都是  CSDN  的小伙伴,并整理了一份最全面前端学习资料,从最基础的HTML+CSS+JS 到移动端HTML5的项目实战的学习资料都有整理,
想学习的都可以申请加入,大家互相学习,互相交流,共同进步,每日分享不同的学习资料!


WhiteSpace空白符

这个词相信不用细说,所有JS程序员都比较熟悉。JavaScript接受5种ASCII字符为空白符,BOM以及Unicode分类中所有属于whitespace分类的字符也可以作为空白符使用:

WhiteSpace ::
    <TAB>
    <VT>
    <FF>
    <SP>
    <NBSP>
    <BOM>
    <USP>

其中,<TAB>是U+0009,是缩进TAB符,也就是字符串中写的'\t'。

<VT>是U+000B,也就是垂直方向的TAB符'\v',这个字符在键盘上很难打出来,所以很少用到。

<FF>是U+000C,Form Feed,分页符,字符串直接量中写作'\f',现代已经很少有打印源程序的事情发生了,所以这个字符在JS源代码中很少用到。

<SP>是U+0020,就是最普通的空格了。

<NBSP>是U+00A0,非断行空格,它是SP的一个变体,在文字排版中,可以避免因为空格在此处发生断行,其它方面和普通空格完全一样。多数的JS编辑环境都会把它当做普通空格(因为一般源代码编辑环境根本就不会自动折行……)

<BOM>是U+FEFF,这是ES5新加入的空白符,是Unicode中的零宽非断行空格,在以UTF格式编码的文件中,常常在文件首插入一个额外的U+FEFF,解析UTF文件的程序可以根据U+FEFF的表示方法猜测文件采用哪种UTF编码方式。这个字符也叫做"bit order mark"。

<USP>表示Unicode中所有的"separator, space(Zs)"分类中的字符,包括:

字符 名称 你浏览器中的显示
U+0020 SPACE
 
U+00A0 NO-BREAK SPACE
 
U+1680 OGHAM SPACE MARK
U+180E MONGOLIAN VOWEL SEPARATOR
U+2000 EN QUAD
U+2001 EM QUAD
U+2002 EN SPACE
U+2003 EM SPACE
U+2004 THREE-PER-EM SPACE
U+2005 FOUR-PER-EM SPACE
U+2006 SIX-PER-EM SPACE
U+2007 FIGURE SPACE
U+2008 PUNCTUATION SPACE
U+2009 THIN SPACE
U+200A HAIR SPACE
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值