# トークン

スクリプトは、解釈中、すべてトークンと呼ばれる単位に分解されて処理されます。
トークンと次のトークンの境界は、トークンの種類によって異なります。

# 裸の単語

「裸の単語」とは、`""` や `''` クオート(引用)されていない、スクリプト中に直接書かれる特定の文字の並びのことです。
「裸の単語」は以下の規則を持っています。

- アルファベットの小文字・大文字、'`_`'(アンダーバー)、数字、いわゆる全角文字で構成される。ただし数字は先頭にくることができない。
- これらの連続が終わるまでが、一つの「裸の単語」として扱われる

`例:
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を底とする 指数指定をすることもできます。`e` でも `E` でも意味は同じです。
`例:
1e-3 // 1×10-3
3.4e10 // 3.4×1010
9.3E-2 // 9.3×10-2
`
先頭に `0x` または `0X` をつけると 16進数での指定となります。`0x` でも `0X` でも意味は同じです。
`例:
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 を表す
`
数値即値は、それが数値即値の構成文字である限り一つの数値即値としてあつかわれます。

# 文字列即値

文字列即値(文字列リテラル)は、`""` (ダブルクオーテーション) または `''`(シングルクオーテーション)で囲まれるものです。ダブルクオーテーションをつかってもシングルクオーテーションを使ってもかまいません。
ただし、`""` (ダブルクオーテーション) 中では '(シングルクオーテーション) を、`''`(シングルクオーテーション)中では `"` (ダブルクオーテーション) を、`\` でエスケープする必要が無くなります。
`例:
"this is a string."
'this is also a string.'
"Can't use without a quotation."
`
文字列中で `\` (円記号) は特別な意味を持ちます。 \ の後に続く文字で意味が変わります。\ に続けて特殊な指定をすることをエスケープするといいます。
`\\ : \ マーク自体
\' : ' (シングルクオーテーション)
\" : " (ダブルクオーテーション)
\a : BEL (可聴ベル)
\b : BS (後退)
\f : FF (フォームフィード)
\n : LF (改行)
\r : CR (復帰)
\t : HT (水平タブ)
\v : VT (垂直タブ)
\xH : H=16 進数 ( H が文字コードを表します )
\XH : 上に同じ
`
`\xH` の形式で、H の部分には 16 進数を指定します。すると、その 16 進数は文字コードとして扱われ、その一文字に置き換わります。
`例:
'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(); です" ( 式として有効なものならば & と ; の間に記述可 )
@"関数 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 クラス も参照してください。