[前へ] [目次へ] [次へ]
トークン(識別子など)の規則
FGESのトークン規則は基本的にC++からそのまま継承されており、
エディタではC++用の解析規則をかなりの部分で流用することができます。
現在のFGES実装の日本語文字コードはShiftJISです。
ソースコードはShiftJISで保存してください。
●識別子として使用できる文字
アルファベット、数字、_(アンダーバー)、全角文字です。
大文字と小文字は区別され、先頭を数字にすることはできません。
また、予約語、ネイティブクラスと同じ名前は使用できません。
識別子の長さに上限はありませんが、31文字以内を推奨します。
例:
FGES
fges
fges_100
●コメント
C++と同じく、/* から */ までの範囲、または // から行末までの範囲です。
例:
/*コメント*/
//コメント
●定数
FGESの定数は実際には記述された値を持つ一時オブジェクトを生成します。
定数から生成される一時オブジェクトはコンパイル時は readonly (読み取り専用)属性がついていますが、
実行時には editable (編集可能)属性になっています。
これは定数に対する誤用判定はコンパイル時チェックで十分であり、
属性変更命令を実行してまで実行時に保護する必要性が認められなかったためです。
10進整数
- (マイナス)か数字で始まり、数字と _ (アンダーバー)で構成されます。
コンパイラは _ (アンダーバー)を無視します。
例:(どちらも100という値を持つ Integer 型の一時オブジェクトになります)
100
1_00
16進整数
0x で始まり、数字と abcdefABCDEF 、 _ (アンダーバー)で構成されます。
コンパイラは _ (アンダーバー)を無視します。
例:(どちらも256(16進数での100)という値を持つ Integer 型の一時オブジェクトになります)
0x100
0x1_00
小数
- (マイナス)か数字で始まり、数字と _ (アンダーバー)、ひとつの . (ピリオド)で構成されます。
コンパイラは _ (アンダーバー)を無視します。
. (ピリオド)の直後は数字でなければいけません。
例:(どちらも100.55という値を持つ Float 型の一時オブジェクトになります)
100.55
1_00.5_5
文字列
"" (ダブルクオート)で囲まれた範囲を文字列として扱います。
C/C++と同様にエスケープシーケンスとして
\\(\記号)、\t(タブ)、\r(CR)、\n(改行)、\'(シングルクオート)、\"(ダブルクオート)
を解釈します。
スクリプト言語で見られるような変数展開の機構はありません。
C/C++と違い、複数行に渡る文字列定数を使うことができます。
複数行に渡る文字列定数では改行はそのまま扱われ、行頭のタブ文字は除外されます。
例:( String 型の一時オブジェクトになります)
"FGES Text" -> FGES Text
"\"FGES Text\"" -> "FGES Text"
エスケープ無効文字列
'' (シングルクオート)で囲まれた範囲を文字列として扱います。
この中では一切のエスケープシーケンスを使えず、
シングルクオートを含む文字列をこの方法で生成することはできません。
C/C++と違い、複数行に渡る文字列定数を使うことができます。
複数行に渡る文字列定数では改行はそのまま扱われ、行頭のタブ文字は除外されます。
例:( String 型の一時オブジェクトになります)
'FGES Text' -> FGES Text
'"FGES Text"' -> "FGES Text"
ヒアドキュメント
##識別子' から '識別子## で囲まれた範囲を文字列として扱います。
この中の文字列は一切の変換を行うことなく、改行やタブ文字を含めそのまま文字列になります。
「識別子」の部分は任意のFGES識別名1つ、または空にすることができ、
同じ「識別子」のヒアドキュメント終了文字列までを範囲とします。
例:( String 型の一時オブジェクトになります)
##'FGES' 'Text'## -> FGES' 'Text
##abc'##'"FGES Text"'##'abc## -> ##'"FGES Text"'##
FGESではクラスやインターフェイスもオブジェクトとして扱いますが、
コンパイラが型を解釈する時、「型名」としての解釈と「オブジェクト」として解釈する場合があります。
各箇所の解説で「型名」として解釈する場合は明記しており、記述がない場合は「オブジェクト」解釈です。
「型名」として解釈する場合
定義位置を基準として、ローカルスコープ、ネストしたクラスブロック、グローバル名前空間へ遡りながら検索します。
検索対象内の複数の名前空間で同じ名前が存在する場合、定義位置から近い位置に定義された項目が採用されます。
分割定義を行う場合も定義位置が基準になるため、宣言位置から辿れる場合でも完全名が必要です。
型名に Any または any を指定すると AnyClass として解釈されます。
Any 、 any は型名として解釈した場合のみ有効で、オブジェクトとしてはアクセスできません。
また、以下の名前(左側)は利便性のために各クラス(右側)の別名として定義されています。
int -> Integer
float -> Float
string -> String
bool -> Bool
サブタイプ型引数を利用できるクラスでは <> を使用して型引数を指定できます。
例: Array クラスの型引数として Integer クラスを指定する
Array<Integer>
また、配列、連想配列、ポインタを指定するのに糖衣構文が使用できます。
int[] -> Array<int>
int{} -> Map<int>
int* -> Pointer<int>
int readonly* -> ConstPointer<int>
int const* -> ConstPointer<int>
これは型名として変換されるので、変数定義の際C/C++と違い全ての項目に適用されます。
●C/C++の場合
int* a,b;// aはint* bはint
●FGESの場合
var int* a,b;// aもbもint* (Pointer<int>)
この指定は多重して指定でき、その場合糖衣構文の左側から順番に括られます。
int[]{}* -> Array<Map<Pointer<int>>>
また、型名の最後に ? を記述することができます。
今のところ、この記述をコンパイラは基本的に読み飛ばしますが、
仕様では NULL を想定することを宣言したものとして扱います。
引数や戻り値で NULL を受ける必要がある/受け取りたい場合や、 NULL を強調したい場合に便利です。
なお ? の指定はメソッドの仮引数リストでデフォルト引数が指定されている場合に限り特別な解釈を行います。
(この挙動については メソッド#仮引数リスト の項目を参照してください)
「オブジェクト」として解釈する場合
指定箇所の式の結果を INativeTypeObject として読み取ります。
このインターフェイスを使用できるのは
FGESClass FGESNativeClass FGESInterface のインスタンスのみであり、
他のクラスは実装することができません。(宣言はできますが正常に動作しません)
●予約語
FGESでの予約語は以下の通りです。
|
---|
abstract | alias | Any | any | arglist |
bool | break | case | class | classvar |
closure | const | continue | default | depend |
do | DynamicCast | editable | elif | else |
enforce | extends | false | final | float |
for | forced_override | haltmode | if | implements |
inject | install | int | interface | internal |
method | native | NULL | null | optional |
override | pause | portable | public | readable |
readonly | redefine | required | retref | retry |
return | retval | SelfType | SubType | static |
string | super | switch | this | throw |
true | using | values | var | void |
while | wraps |
[前へ] [目次へ] [次へ]
最終更新 2021/07/05