记号

 脚本在解释的过程中会被分解成被称为“记号(token)”的单位。
 记号之间的边界随记号种类的不同而不同。

独立语素

 “独立语素”是指不被 ""'' 包围(引用),而在脚本中直接书写的字符的序列。
 译者注:原文为「裸の単語」 暂且翻译成“独立语素”吧,我受不了了。。。ORZ
 “独立语素”具有下面的规则。
 


例:
    ampan  // OK
    123a // 因为以数字开头 NG
    _asdf // 允许以下划线开头,所以 OK
    continue // 这个是关键字 OK
    全角文字 // 把全角文字当作“独立语素” OK


 “独立语素”又被分为关键字和标识符两类。

关键字

 下面这些就是关键字,而不是标识符。“独立语素”中除关键字以外的都是标识符。

break continue const catch class case
debugger default delete do extends export
enum else function finally false for
global getter goto incontextof Infinity
invalidate instanceof isvalid import int in
if NaN null new octet protected property
private public return real synchronized switch
static setter string super typeof throw
this true try void var while with


 这些关键字具有构成脚本的文法的重要用途,因而具有特殊意义。这里面的一部分被用作运算符。
 但是。现在的版本中并没有使用上面全部的关键字。

标识符

 “标识符”是“独立语素”中除关键字以外的所有记号。这些记号被用作可以由代码编写者自由命名的变量、函数和类名等。
 标识符的字符组成中即使包含关键字,只要不是关键字本身,就会被识别为标识符而不是关键字。

符号

 符号类也会被当做记号来分解。符号类是指下面这些。

>>>= >>> >>= >> >= > <<= <=
<-> << < === == => = !== != !
&&= && &= & ||=
|| |= | ... . ++ += + -= -- - *=
* /= / \= \ %= % ^= ^ [ ] ( ) ~
? : , ; { } # $


 这些会按最长一致的原则切割出来成为记号。例如, ++ 不会作为 ++ ,而是作为 ++ 这样一个整体的符号被分解出来。在想要单独的书写 ++ 的场合, ++ 之间需要加入一个空格等字符。

 符号类具有构成各种文法的要素的的重要意义。符号中的一部分被用作运算符。

数值常量

 数值常量是以数字或者 . (小数点)开始的记号。TJS2 中按照以下形式来识别。
 直接书写的数值会成为10进制的数值常量。

例:
    0
    3.1
    342.3
    1


 还有,对于10进制数,可以使用 e 或者 E 来指定以10为底的 指数を。eE 的意义是相同的。

例:
    1e-3   // 110-3
    3.4e10   // 3.41010
    9.3E-2  // 9.310-2


 在开头加上 0x 或者 0X 来指定 16进制数0x0X 的意义是相同的。

例:
    0x1234
    0Xff
    0x3f33


 在开头加上 0b 或者 0B 来指定 2进制数

例:
    0b0100
    0B0010100010100001


 开头带有 0 的数值会被按照 8进制数 来处理。

例:
    01234
    033


 对于16进制、8进制和2进制,也能使用小数点,以及使用 p 来指定指数。p 指定以 2 为底的指数。

例:
    0b1.1    // 表示 1 + 1/2 即 1.5 
    0x2.f    // 表示 2 + 15/16 即 2.9375 
    0x1p8    // 表示 1 × 28 即 256.0 



 数值常量在解析的时候,会依照数值常量的字符构成规则尽可能长的当做一个数值常来那个来解析。

字符串常量

 字符串常量(字符串literal)是指由 "" (双引号) 或者 ''(单引号)包围的字符序列。使用单引号和者双引号都可以。
 但是,"" (双引号) 中的 '(单引号) ,以及 ''(单引号)中的 " (双引号) 和\ 不需要转义。

例:
    "this is a string."
    'this is also a string.'
    "Can't use without a quotation."


 在字符串中 \ (反斜杠) 具有特殊的意义。跟在 \ 的字符的意义会改变。跟在 \ 后面的这种特殊的指定方式被称为 转义(escape)


\\    : \ 本身
\'    : ' (单引号)
\"    : " (双引号)
\a    : BEL (铃声)
\b    : BS (退格)
\f    : FF (换页)
\n    : LF (换行)
\r    : CR (回车)

\t    : HT (水平制表符)
\v    : VT (垂直制表符)
\xH   : H=16 进制数 ( H 表示字符编码 )
\XH   : 同上


 在 \xH 的形式中,H 指定为 16 进制数的话,那个 16 进制数会被当做字符编码,\xH 会被替换为该编码对应的字符。


例:
    'Can\'t help'  ( 这里使用了 \' 来书写单引号 )
    "\x1234"     ( 宽字符的字符编码为 0x1234 的字符 )


\xH 的形式中,只要 \x 的后面跟的是 16 进制数中的字符 ( 0~9 、A~F、a~f ) 就会别识别为 H 的部分。但是,在宽字符的大小为 16bit 的环境中最多识别 4 个,宽字符的大小为 32bit 的环境中最多识别 8 个字符 ( Windows中是 16bit、Linux 和 Solaris 中是 32bit )。
"\x22An Apple" 写的话,会识别出开头的 \x22A 。为了避免这种情况,请像 "\x22" "An Apple" 这样分成多个字符串连续书写。TJS 中,像这种字符串常量连续出现的情况会被识别为一个字符串。

 更多关于字符串的内容请参考 可以对字符串进行的操作

带 @ 的字符串常量

 字符串常量的前面带 @ ,则那个字符串常量中从 & 到 ; ,以及从 ${ 到 } 之间的内容会被看作表达式,表达式的的结果会被展开到表达式原有的位置 (写在 & 和 ; 之间或者 ${ 和 } 之间的表达式会被替换成表达式的结果)。
 不想让 & 和 $ 被展开的话,可以在 & 和 $ 前面写 \ ,这样 & 和 $ 就不会被展开了。


例:
    @"1+2=&1+2;"  ( 会变成 "1+2=3" 的字符串 )
    @"变量 f 的内容是 &f; "  ( 变量 f 的内容在 &f; 的位置展开 )
    @"函数 func 调用的结果是 &func(); "  ( 有效的tjs表达式都可以写在 & 和 ; 之间 )
    @"函数 func 调用的结果是 ${func()} "  ( 同上 )
    @"true \&\& false 是 &true && false;"  ( & 的前面写上 \ 的话, & 就不会被展开 )


 这里书写的表达式可以操纵在该字符串所在位置可见的变量 (含全局变量) 。

字节串常量

 字节串常量由 <%%> 包围,中间可以书写字节数据。
 字节数据以复数的用空格分隔的两位16进制数的形式指定。

例:
    <% 00 01 02 03 %>
    <% ff ff ff 00 04 0f ff 30 %>


 更多有关字节串的内容请参考 可以对字节串进行的操作

匹配模式

 匹配模式由 // 包围、中间可以填写匹配模式字符串。
 匹配模式后面可以接标志字符,g 是全局搜索标志 ( 所有能见到的东西都进行匹配;没有这个标志的话,则只匹配第一个 )、i 是忽略大小写区别标志、l 是尝试进行本地化的匹配的标志。
 这样书写的匹配模式会被当成 RegExp 类的对象来处理。

例:
    /[0-9]-[0-9]-[0-9]/
    /^;\s*(.*?)\s*=(.*)$/
    /start(.*?)end/gi


 更多有关匹配模式的内容请参考 RegExp 类