JavaScript/字句構造
字句構造
プログラミング言語における字句構造(Lexical Structure)は、プログラムのテキストを構成する基本的な要素やトークンの規則的な配置を指します。字句構造はプログラムの解析の初歩であり、プログラムを理解しやすく、機械が処理しやすい形に変換します。以下は、字句構造の主な要素です:
- トークン
- Tokens
- プログラムの基本的な構成要素で、コンパイラやインタプリタがプログラムを解析する際に扱う最小の単位です。トークンには識別子、キーワード、演算子、リテラルなどが含まれます。
- 識別子
- Identifiers
- 変数や関数、クラスなどの名前を指します。識別子は一般に文字またはアンダースコアで始まり、その後に文字、数字、アンダースコアが続きます。
- キーワード
- Keywords
- プログラムの構造や動作を指定するための予約語です。キーワードは通常、特別な意味を持ち、変数や関数名として使用することはできません。
- リテラル
- Literals
- データの値そのものを表現するための記法です。数値リテラル、文字列リテラル、真偽値リテラル、nullリテラルなどが含まれます。
- 演算子
- Operators
- 値を組み合わせて新しい値を生成するための記号やキーワードです。算術演算子、比較演算子、論理演算子などがあります。
- デリミタ
- Delimiters
- プログラム内の構造を区切るための特殊な記号や文字です。例えば、括弧
()
、中括弧{}
、角括弧[]
などがデリミタです。 - コメント
- Comments
- プログラム内で説明やメモを残すためのテキストで、実行時には無視されます。コメントはソースコードの読みやすさを向上させる役割があります。
字句構造は通常、プログラムを構文解析する際に使用され、正確で一貫性のある形式でコードを書くための基礎を提供します。また、コンパイラやインタプリタは字句構造を理解してコードを適切に処理します。字句構造は言語ごとに異なりますが、多くのプログラミング言語で共通の要素が見られます。
JavaScriptの字句構造
JavaScriptの字句構造には、以下に挙げる主な要素が含まれます:
- トークン
- Tokens
- JavaScriptのプログラムはトークンに分割されます。トークンにはいくつかの種類があり、これがJavaScriptの字句構造を構成します。
- 識別子
- Identifiers
- 変数や関数、クラスなどの名前を指す識別子は、文字またはアンダースコアで始まり、その後に文字、数字、アンダースコアが続きます。
const variableName = "example";
- キーワード
- Keywords
- JavaScriptには特定の意味を持つ予約語(キーワード)があります。例えば、
if
、else
、function
などがあります。 if (condition) { // code } else { // code }
- リテラル
- Literals
- データの値そのものを表現するための記法です。JavaScriptの主なリテラルには数値リテラル、文字列リテラル、真偽値リテラル、nullリテラルなどがあります。
const numberLiteral = 42; const stringLiteral = "Hello, World!"; const booleanLiteral = true; const nullLiteral = null;
- 演算子
- Operators
- 演算子は値を組み合わせて新しい値を生成するための記号やキーワードです。算術演算子、比較演算子、論理演算子などがあります。
const result = 10 + 5; // 算術演算子 const isEqual = (result === 15); // 比較演算子
- デリミタ
- Delimiters
- プログラム内の構造を区切るための特殊な記号や文字です。括弧
()
、中括弧{}
、角括弧[]
などがデリミタです。 function exampleFunction() { const ary = [ 2, 3, 5, 7 ]; }
- コメント
- Comments
- プログラム内で説明やメモを残すためのテキストで、実行時には無視されます。コメントはソースコードの読みやすさを向上させる役割があります。
これらの要素が組み合わさり、JavaScriptのプログラムを構成します。字句構造は通常、JavaScriptエンジンがプログラムを解析する際に使用され、正確で一貫性のある形式でコードを書くための基盤となります。
字句構文(Lexical grammar)
JavaScriptのソーステキストは文字の連続であり、解釈器が理解するためには、文字列をより構造的な表現に解析する必要があります。解析の最初のステップは字句解析と呼ばれ、テキストは左から右にスキャンされ、個々の入力要素のシーケンスに変換されます。一部の入力要素は解釈器にとって重要でなく、このステップの後に削除されます。これには空白やコメントが含まれます。それ以外の要素(識別子、キーワード、リテラル、区切り子など)は構文解析のために使用されます。行の終端子と複数行コメントも構文的には無視されますが、自動セミコロン挿入のプロセスに影響を与え、一部の無効なトークンシーケンスが有効になります。
フォーマット制御文字(Format-control characters)
フォーマット制御文字には視覚的な表現がなく、テキストの解釈を制御するために使用されます。
Format-control characters(フォーマット制御文字) Code point Name Abbreviation Description U+200C Zero width non-joiner <ZWNJ> 特定の言語でリガチャ(Ligature: 合字)に結合されないように文字の間に配置。 U+200D Zero width joiner <ZWJ> 特定の言語で通常は結合されない文字の間に配置し、文字を結合形式でレンダリング。 U+FEFF Byte order mark <BOM> スクリプトの先頭に使用され、Unicodeとテキストのバイト順序を示す。
JavaScriptのソーステキストでは、<ZWNJ>と<ZWJ>は識別子の一部として扱われ、<BOM>(テキストの先頭ではない場合はゼロ幅ノーブレークスペース<ZWNBSP>とも呼ばれます)は空白として扱われます。
空白文字(White space)
空白文字はソーステキストの可読性を向上させ、トークンを区切ります。これらの文字は通常、コードの機能には必要ありません。データ転送量を削減するために空白を削除するためには、しばしばミニファイケーションツールが使用されます。
White space(空白文字) Code point Name Abbreviation Description Escape sequence U+0009 Character tabulation <TAB> 水平タブ \t U+000B Line tabulation <VT> 垂直タブ \v U+000C Form feed <FF> ページ区切り制御文字 \f -
U+0020 Space <SP> スペース \s U+00A0 No-break space <NBSP> 改行しないスペース \u00A0
行終端子(Line terminators)
行終端子は、ソースコードを行ごとに区切るための特殊な文字です。これらは、ソーステキストの中で行を区切る役割を果たします。行終端子は、実行時に無視されますが、JavaScriptの文法では非常に重要な役割を果たします。
Line terminators(行終端子) Code point Name Abbreviation Description U+000A Line feed <LF> 新しい行を開始するための文字 U+000D Carriage return <CR> 行の先頭に戻るための文字 U+2028 Line separator <LS> Unicodeの行区切り文字 U+2029 Paragraph separator <PS> 段落区切り文字
JavaScriptでは、行終端子はトークンの区切りを助けるために使用され、文の終わりを明示的に示すための役割を果たします。また、セミコロン(;
)が省略される場合、行終端子によって自動的にセミコロンが挿入されることがあります(自動セミコロン挿入)。
識別子(Identifiers)
識別子は、変数名、関数名、クラス名、変数などを指定するために使用されます。識別子は、文字またはアンダースコア(_
)で始まり、その後に文字、数字、アンダースコアを続けることができます。識別子にはJavaScriptのキーワードや予約語を使用することはできません。
識別子には以下の特徴があります:
- 最初の文字はアルファベットまたはアンダースコアでなければならない。
- その後の文字はアルファベット、数字、アンダースコアであることができます。
- JavaScriptの予約語やキーワード(
if
,else
,function
など)は識別子として使用できません。
- 例:
const userName = "Alice"; // 正しい識別子 const _counter = 10; // 正しい識別子 const 123value = 5; // 誤った識別子(数字で始まる)
キーワード(Keywords)
JavaScriptには、特定の意味を持つ予約語(キーワード)がいくつかあります。これらのキーワードは、JavaScriptの構文において特別な意味を持っており、識別子として使用することはできません。主なキーワードには、制御構造や関数定義などのための単語が含まれます。
以下は、JavaScriptの主なキーワードの一部です:
- 制御構造:
if
,else
,for
,while
,break
,continue
など - 定義:
function
,class
,const
,let
,var
など - 予約語:
return
,try
,catch
,finally
,throw
,new
,this
など
- 例:
function myFunction() { // 'function' はキーワード const number = 10; // 'const' はキーワード return number; // 'return' はキーワード }
リテラル(Literals)
リテラルは、データの実際の値をプログラム内で直接表現するために使用される定数値です。JavaScriptにはいくつかの種類のリテラルがあり、主に以下の種類があります:
- 数値リテラル(整数および浮動小数点数)
- 文字列リテラル(ダブルクォートまたはシングルクォートで囲まれた文字列)
- 真偽値リテラル(
true
およびfalse
) null
リテラル(空の値を表す)
- 例:
const age = 30; // 数値リテラル const name = "Alice"; // 文字列リテラル const isActive = true; // 真偽値リテラル const emptyValue = null; // nullリテラル
演算子(Operators)
演算子は、値を処理して新しい値を生成するための記号またはキーワードです。JavaScriptではさまざまな演算子が提供されており、算術演算、比較演算、論理演算、代入など、さまざまな処理を行うために使用されます。
主な演算子には以下の種類があります:
- 算術演算子:
+
,-
,*
,/
,%
(加算、減算、乗算、除算、剰余) - 比較演算子:
==
,===
,!=
,!==
,<
,>
,<=
,>=
(等価、厳密等価、不等価、比較) - 論理演算子:
&&
,||
,!
(論理積、論理和、論理否定) - 代入演算子:
=
,+=
,-=
,*=
,/=
(代入、加算代入、減算代入、乗算代入、除算代入)
- 例:
const result = 5 + 3; // 算術演算子 const isEqual = (5 === 5); // 比較演算子 const isTrue = (true && false); // 論理演算子
区切り記号(Delimiters)
区切り記号は、プログラムの構造を区切るために使用される特殊な文字です。これらの記号は、式やブロックを区切るために使用されます。主な区切り記号には、括弧、波括弧、角括弧などがあります。
主な区切り記号には以下のものがあります:
- 小括弧(
()
):関数呼び出し、条件式、式を囲むために使用されます。 - 波括弧(
{}
):コードブロック(関数、条件分岐、ループなど)を囲むために使用されます。 - 角括弧(
[]
):配列のリテラルやインデックス指定に使用されます。
- 例:
function greet(name) { // 小括弧 const message = `Hello, ${name}!`; // 波括弧 console.log(message); }
コメント(Comments)
コメントは、プログラムに対して人間が理解しやすくするために、コードの中に挿入するテキストです。JavaScriptには2種類のコメントがあります:
- 行コメント(
//
):1行のコメントとして使用されます。 - 複数行コメント(
/* */
):複数行にわたるコメントとして使用されます。
コメントはプログラムの実行時に無視され、コードの可読性を向上させるために使用されます。
- 例:
- <syntaxhighlight lang=js copy>
// これは1行コメントです const number = 5; /* これは複数行コメントです
ここでもコメントを書けます */
- <syntaxhighlight lang= copy>
これらがJavaScriptの字句構造に関連する主要な要素です。字句構造を理解することで、プログラムの構成要素を適切に扱うことができます。