X++ 構文
この記事には、X++ の構文リファレンスが含まれています。
X++ キーワード
次の表に示す X++ キーワードは予約されています。 これらのキーワードは他の目的に使用できません。
予約語 | Description | 関連情報 |
---|---|---|
! | ありません。 | リレーショナル演算子 |
!= | 非等値演算子 (等しくない)。 | リレーショナル演算子 |
# | マクロ名に接頭語を付けます。 | 方法: #define および #if を使用してマクロをテストする |
& | バイナリ AND。 | 算術演算子 |
&& | 論理 AND。 | リレーショナル演算子 |
( | 関数呼び出し演算子は、関数呼び出しの開始を示します。 | |
) | 関数呼び出し演算子は、関数呼び出しの終了を示します。 | |
* | 乗算します。 アスタリスク (*) は、X++ SQL でも使用されます。 1 つの使用方法は、select ステートメントにおいてテーブルのすべてのフィールドを示すことです。 もう 1 つの使用法は、like 演算子を持つワイルドカードとして、あらゆる種類の 0 から複数の文字表すことです。 like 演算子は、? 文字も使用します。 |
算術演算子 |
^ | バイナリ XOR。 | 算術演算子 |
| | バイナリ OR。 | 算術演算子 |
|| | 論理 OR。 | リレーショナル演算子 |
~ | ありません。 | 算術演算子 |
+ | プラス。 | 算術演算子 |
++ | 増分。 | 代入演算子 |
+= | 割り当ての追加。 | 代入演算子 |
、 | コンマ演算子。 コンマで区切られた式は、左から右に評価されます。 | |
- | マイナス。 | 算術演算子 |
-- | デクリメント演算子。 | 代入演算子 |
-= | 減算する割り当て。 | 代入演算子 |
。 | クラス メンバー アクセス演算子、たとえば、formRun.run は、クラス型 FormRun のオブジェクトの run メソッドにアクセスします。 |
|
/ | 分割。 | 算術演算子 |
</strong> | 文字列でエスケープします。 余分な引用符およびタブの \t などの特定の文字をエスケープします。 | |
@ | キーワードのエスケープです。 たとえば、str @abstract; は @ 記号なしではコンパイルに失敗します 。 また \ エスケープ文字の効果を否定すること、およびソース コード内の 1 つ以上の明細行にまたがる文字列を有効にすることによってリテラル文字列にも影響を及ぼします。 新しい行は 16 進数 0x0A の 1 文字で表され、これは一般に改行と呼ばれます。 0x0D0A のように 16 進数 0x0D のキャリッジ リターン文字は含まれません。 | |
: | フィールド申告またはラベル指定子。 コロン (:) 文字も switch 明細書で使用されます。 |
|
:: | 静的 (class) メソッド ClassName::methodName を呼び出すときに使用します。 | |
; | ステートメントを終了します。 for ループまたは文の区切り記号として使用されます。 |
|
< | より小さい。 | リレーショナル演算子 |
<< | 左 Shift。 | 算術演算子 |
<= | 以下。 | 算術演算子 |
= | 代入演算子。 = の左側の引数は、右側の引数の値に設定されます。 | 代入演算子 |
== | 両方の式が等しい場合は、true を返します。 | リレーショナル演算子 |
> | より大きい。 | リレーショナル演算子 |
>= | 以上。 | リレーショナル演算子 |
>> | 右 Shift | 算術演算子 |
? | 三項演算子。 疑問符 (?) 文字は、like 演算子がどのような種類の文字でも正確に表すために使用されます。 like 演算子は、 文字も使用します。 |
三項演算子 (?) |
[ | 配列宣言子、開きます。 ] とともに使用する必要があります。 | |
] | 配列宣言子、閉じます。 [ とともに使用する必要があります。 | |
{ | ステートメントの番号の先頭を示します。 これらのステートメントの最後には、} が続かなければなりません。 | |
} | ステートメントの番号の最後を示します。 { は、これらのステートメントの最初よりも前にある必要があります。 | |
抽象 | クラスとメソッドのモディファイア。 また また は、新しいキー では 作成できます。 法 は 呼び出しできます。 テーブルは、AOT で抽象プロパティをはいに設定するか、DictTable クラスを使用して、抽象として変更することもできます。 既定では Abstract プロパティの既定値は No であり、テーブルを別のテーブルで拡張しない限り設定できない。 抽象テーブルの各行は、派生テーブルに依存する行が必要です。 つまり、抽象テーブルの各行には、その "InstanceRelationType プロパティ タイプ 0より大きい値が設定されます。 マーキングを抽象としてマークすることによる他の効果はありません。 非公式に、プログラマは concrete という用語を使用して抽象ではないクラスを記述します。 |
メソッド モディファイアー テーブル継承の概要 |
anytype | このメソッドは任意のデータ型を返すことができます。 | Anytype |
利用品目 | 派生クラス変数に基本クラス変数を割り当てるときに必要です。 たとえば、Base クラスを拡張する指定された Derived クラスでは、明細書のmyDerived = myBase as Derived; は as キーワードを使用して、コンパイラ エラーを避けます。 このキーワードは、ベース テーブル変数を派生テーブル変数に割り当てるときにも適用されます。 |
式の演算子: 継承の Is および As |
asc | select ステートメント order by または group by 句のオプション。 並べ替えは昇順です。 |
ステートメント構文の選択 |
時刻 | 印刷ウィンドウの位置を指定します。 | ステートメントの印刷 |
平均 | select ステートメント内の group by 句により指定された行からフィールドの平均を返します。 |
ステートメント構文の選択 |
分割 | コード ブロックをすぐに終了します。 | Break ステートメント |
ブレークポイント | デバッグのために設定されているブレークポイントを表します。 コードにブレークポイントを設定するには、次のように記述します。breakpoint; |
|
作成者 | グループ化と並べ替えの基準となる予約語の一部。 | |
byref | 呼び出されたメソッドに渡されるパラメーターが、値ではなく参照 (アドレス) により渡されることを指定します。 Byref は、参照によってパラメータをとる .NET メソッドを呼び出すときに X++ で使用されます (C# のキーワード out or ref など)。 | 方法: CLR Interop に byref キーワードを使用します。 |
Case など | switch ステートメント内の選択。 |
Switch ステートメント |
catch | 例外処理で使用されます。 | tryおよびcatchキーワードを使用した例外処理 |
changeCompany | データベース設定を別の会社に変更します。 | 会社の設計パターンを変更する |
クラス | クラスを宣言します。 | X++ のクラス |
クライアント | メソッド モディファイアー。 | メソッド モディファイアー |
コンテナー | 型 container の変数を指定します。 |
コンテナー |
続行 | ループの次の繰り返しを強制します。 | 明細書の続行 |
カウント | select ステートメント内の group by 句により指定された行からレコードの数を返します。 |
ステートメント構文の選択 |
crossCompany | select 明細書は、ユーザーが読み取りを承認されているすべての会社のデータを戻します。 |
会社間の X++ Code の基礎 |
日付 | 型 date の変数を指定します。 |
日付 |
既定 | switch 明細書内の既定ケース |
Switch ステートメント |
デリゲート | 他のクラスのメソッドへの複数の参照を格納し、これを行うように求められる場合にメソッドを呼び出すことができるクラス メンバー。 デリゲートは、次のようなさまざまな種類のメソッドへの参照を保存できます:
|
イベント用語およびキーワード X++、C# 比較: イベント |
delete_from | 同時に複数のレコードをデータベースから削除できます。 | delete_from |
desc | select ステートメント order by または group by 句のオプション。 並べ替えは降順です。 |
ステートメント構文の選択 |
表示 | メソッド モディファイアー。 | メソッド モディファイアー |
div | 整数除算。 | 算術演算子 |
実行 | ループdo...while の開始 |
while Loops を実行 |
編集 | メソッド モディファイアー。 | メソッド モディファイアー |
その他 | 条件付き実行 (if...else )。 |
if および if ... else ステートメント |
eventHandler | += or -= 演算子を使用して、デリゲートのメソッドの参照を追加または削除するたびに使用する必要があります。 例: myDelegate += eventHandler(OtherClass::myStaticMethod); | イベント用語およびキーワード X++、C# 比較: イベント |
あり | select 文の join 句で使用されます。 |
ステートメント構文の選択 |
拡張 | クラスまたはインターフェイス申告句。 クラスが明示的に別のクラスを拡張しない場合、クラスは (「extends Object」と入力した場合と同様) Object クラスを拡張すると見なされます。 |
サブクラスを作成しています |
いいえ | ブール型リテラル。 | ブール型 |
最終 | クラスとメソッドのモディファイア。 | メソッド モディファイアー |
firstFast | select 文で使用され、最初の行のフェッチを高速化します。 |
ステートメント構文の選択 |
firstOnly | 最初のレコードだけをフェッチするために select 文で使用されます。 key firstOnly は、最大で1つのレコードがX++ SQL select される保証はありません。 AOS が EntireTable キャッシュを使用し、select ステートメントのデータ要求を満たすことができる場合は、firstOnly キーワードは無視されます。 |
ステートメント構文セットに基づくキャッシュを選択 |
firstOnly10 | firstOnly と同じ。ただし、1 行ではなく 10 行を返します。 | |
firstOnly100 | firstOnly と同じ。ただし、1 行ではなく 100 行を返します。 | |
firstOnly1000 | firstOnly と同じ。ただし、1 行ではなく 1,000 行を返します。 | |
フラッシュ | テーブル キャッシュ全体をクリアします。 これは、特に、テーブルに対する変更が後続の工程にすぐに反映される必要がある場合に役立ちます。 | セット ベースのキャッシュ |
の | ループの繰り返し用。 | ループ用 |
forceLiterals | select 文で使用され、最適化時に where 句で使用される実際の値を Microsoft SQL Server データベースに公開しないようにカーネルに指示します。 |
ステートメント構文の選択 |
forceNestedLoop | SQL Server データベースがネストループ アルゴリズムを使用して、join を含む特定の SQL ステートメントを処理するよう強制します。 |
ステートメント構文の選択 |
forcePlaceholders | select 文で使用され、最適化時に where 句で使用される実際の値を Microsoft SQL Server データベースに公開しないようにカーネルに指示します。 |
ステートメント構文の選択 |
forceSelectOrder | SQL Server データベースが指定した順序で結合内のテーブルにアクセスするよう強制します。 | ステートメント構文の選択 |
forUpdate | 更新専用のレコードを選択します。 フェッチされたレコードに対して実行される操作は更新です。 基になるデータベースによっては、レコードが他のユーザーのためにロックされることがあります。 | ステートメント構文の選択 |
開始 | select ステートメントの部分。 from 句は、列が存在するテーブルを指定します。 |
ステートメント構文の選択 |
グループ | select ステートメントの group by 句の一部。 |
ステートメント構文の選択 |
次の場合 | 条件付き実行。 | if および if ... else ステートメント |
実装 | インターフェイスを実装します。 | インターフェイスの概要 |
insert_recordset | 単一のサーバー トリップで、1 つ以上のテーブルのデータを 1 つの行先テーブルにコピーします。 | insert_recordset |
int | 型 integer の変数を指定します (32 ビット)。 |
整数 |
int64 | 型 integer の変数を指定します (64 ビット)。 |
整数 |
インターフェイス | インターフェイスの宣言。 | インターフェイスの概要 |
は | クラス変数によって照会されるオブジェクトが指定されたクラスから継承するか、または指定されたクラスのものであるかを確認します。 たとえば、Base クラスを拡張する指定された Derived クラスでは、式の (myDerived is Base) は true を返します。 このキーワードは、クラスの継承とテーブルの継承に適用されます。 |
式の演算子: 継承の Is および As |
結合 | テーブルは、両方のテーブルに共通の列に結合されます。 結合を使用することにより複数のテーブルに基づく単一の結果セットを生成することができます。 | ステートメント構文の選択 |
等号 | ワイルドカード文字 * および ? を使って、パターンにより一致をテストします。 like 演算子の右側の文字列は、バックスラッシュを表すのに 4 つのバックスラッシュ文字を使用する必要があります。 例は以下に:
|
リレーショナル演算子 |
maxof | group by 句により指定された行からフィールドの最大値を返します。 |
ステートメント構文の選択 |
minof | group by 句により指定された行からフィールドの最小値を返します。 |
ステートメント構文の選択 |
mod | 左側の expression1 の整数剰余を右側の expression2 で除算したものを返します。 非公式に、これは剰余演算子と呼ばれることもあります。 ((12 mod 7) == 5) は true。 |
|
新規 | 演算子。 指定されたクラス/インタフェース参照変数と割り当て互換性のある匿名クラスのインスタンスを作成するか、配列のメモリを割り当てます。 | |
次へ | テーブルの次のレコードをフェッチします。 | |
noFetch | 現時点でフェッチされるレコードがないことを示します。 | ステートメント構文の選択 |
notExists | select 文の join 句で使用されます。 |
ステートメント構文の選択 |
NULL | 記号定数。 | |
optimisticLock | テーブルに異なる値が設定されていても、オプティミスティック同時実行制御でステートメントを実行するよう強制します。 | ステートメント構文の選択 |
注文 | select ステートメントの order by 句の一部。 |
ステートメント構文の選択 |
外部 | 外部結合。 | ステートメント構文の選択 |
一時停止 | ジョブの実行を停止させます。 実行を続行する必要があるかどうかを確認するメッセージが表示されます。 | ステートメントの選択 |
pessimisticLock | テーブルに異なる値が設定されていても、ペシミスティック同時実行制御でステートメントを実行するよう強制します。 | ステートメント構文の選択 |
印刷 | スクリーン上にディスプレイ出力を表示できます。 | ステートメントの印刷 |
プライベート | メソッドのアクセス修飾子。 | メソッド アクセス制御 |
保護 | メソッドのアクセス修飾子。 | メソッド アクセス制御 |
パブリック | メソッドのアクセス修飾子。 | メソッド アクセス制御 |
実質 | 型 real の変数を指定します。 |
Reals |
repeatableRead | 現在の取引が完了するまで、現在の取引内のロジックによって読み取られたデータを変更できる他の取引がないことを指定します。 明示的なトランザクションは ttsAbort または最も外側の ttsCommit で完了します。 スタンドアロンの select 明細書では、トランザクション期間は select コマンドの期間です。 ただし、X++ コードで表示されるこのキーワードなしでも (データベースがテーブルをどのようにスキャンするかに応じて)、データベースは時に、個々の選択ステートメントの repeatableRead と同等のものを実施します。 | 詳細については、「基になるリレーショナル データベース製品のドキュメント」を参照してください。 |
再試行 | 例外処理で使用されます。 | tryおよびcatchキーワードを使用した例外処理 |
戻る | メソッドから終了します。 | メソッドの宣言 |
リバース | レコードが逆の順序で返されます。 | ステートメント構文の選択 |
選択 | select 句は、結果セットに表示される列またはビューを指定します。 |
ステートメントの選択 |
サーバー | メソッド モディファイアー。 | メソッド モディファイアー |
設定 | update_recordset コマンドで使用されます。 | update_recordset |
静的 | 静的メソッドはインスタンス変数を参照できません (静的変数のみ)。クラスのインスタンスではなく、クラス名を使用して呼び出すことができます (「MyClass.aStaticProcedure 」)。 |
メソッド モディファイアー |
str | 型 string の変数を指定します。 |
文字列 |
合計 | select ステートメント内の group by 句により指定された行からフィールドの合計を返します。 |
ステートメント構文の選択 |
スーパー | 現在のメソッドによって上書きされたメソッドを呼び出します。 | テーブル メソッド |
切り替え | 選択ステートメントを切り替えます。 | Switch ステートメント |
tableLock | Obsolete; tableLock はクエリで使用できなくなりました。 | |
この | クラスの現在のインスタンスへの参照。 クラスのメソッド内の X++ コードで使用されます。 クラスのメソッド メンバーを参照するのに使用されますが、クラスのフィールド メンバーは参照されません。public str getFullName() { // 次のステートメントは 「this」 なしではコンパイルできません。 return this.concatenateFirstAndLastNames(); } |
element という名前のシステム変数とほぼ同様です。 フォーム コントロール メソッドの element を使用して、格納フォームを参照します。 詳細については、「フォームの変数を使用」を参照してください。 |
スロー | 例外処理で使用されます。 | tryおよびcatchキーワードを使用した例外処理 |
はい | ブール型リテラル。 | ブール型 |
実行 | 例外処理で使用されます。 | tryおよびcatchキーワードを使用した例外処理 |
ttsAbort | 現在のトランザクションのすべての変更を破棄します。 | トランザクションの整合性 |
ttsBegin | トランザクションの開始をマークします。 | トランザクションの整合性 |
ttsCommit | トランザクションの終了をマークします。 | トランザクションの整合性 |
update_recordset | 1 回の工程内で行セットの操作を許可します。 | update_recordset |
validTimeState | X++ SQL select 明細書により有効時間状態テーブルから取得される行をフィルター処理します。 例: xMyTable から validTimeState(myDateEffective)* を選択、 ...または... xMyTable から validTimeState(myDateFrom、myDateTo)* を選択 |
有効時間状態テーブルが読み取りおよび書き込み操作に及ぼす影響 |
無効 | 値を返しないメソッドを識別します。 | メソッドの宣言 |
WHERE | select ステートメントの部分。 where 句は、満たす必要がある条件を指定します。つまり、その結果に含める行です。 |
ステートメント構文の選択 |
中に | 繰り返しのステートメント。 テスト条件が該当する時は、明細書またはブロックを繰り返し実行します。 | While Loop while select ステートメント |
ウィンドウ | 出力ウィンドウのサイズを変更できます。 | ステートメントの印刷 |
式の構文
X++ の式は数学的または論理的ないずれかの方法で使用されます。 式は、言語のデータ型に基づいて作成されます。つまり、ある式はある型の値を返します。 この値は、計算、代入、条件文などで使用できます。
EBNF Description of Expressions in X++
期間 | 定義 | |
---|---|---|
式 | = | 簡易式 [RelationalOperator Simple-expression ] |
RelationalOperator | = | = |
簡易式 | = | 簡易式 [ + |
期間 | = | Compfactor { 複数演算子 CompFactor } |
複数演算子 | = | * |
CompFactor | = | [ ! ] [ - |
係数 | = | リテラル |
Enum | = | EnumName :: リテラル |
変動 | = | Identifier [ [ Expression ] ] [ . Expression ] |
FunctionCall | = | [ Expression (. |
If 式 | = | Expression ? 式 : 式 |
意味の制限が前述の構文に適用されます。 このメソッドは、このメソッドを使用して :: オペレーター。 同様に、有効なオブジェクト この keyすべてのオブジェクトを使用することはできません。つまり、メソッド内に説明を含めなかった場合は、キーを使用することはできません。
例
式の例 | Description |
---|---|
1 |
整数リテラル。 |
NoYes::No | 列挙参照。 |
A |
変数の参照。 |
Debtor::Find("1") | 静的メソッドの呼び出し (顧客変数を返す)。 |
(A > 3 ? true : false) | true または false を返す if 式です。 |
(CustTable.Account == 「100」の CustTable を選択します)。NameRef | 選択式。 顧客テーブルで nameref フィールドを返します。 これは文字列です |
A >= B | 論理式。 true または false を返します。 |
A + B | 算術式です。 合計 A と B。 |
A + B / C | B/C を計算し、これを A に追加します。 |
~A + this.Value() | A 以外のバイナリと、スコープ (this) 内のオブジェクトのメソッド呼び出し値の結果を合計します。 |
Debtor::Find("1").NameRef | 検出された顧客レコードの NameRef フィールドを返します。 |
Debtor::Find("1").Balance() | 顧客テーブルの Balance へのメソッド呼び出し (Debtor::Find は、顧客を返す)。 口座番号 1 の顧客の残高を返します。 |
EBNF 概要
Extended Backus Naur Form (EBNF) は metalanguage あり、このガイドでは言語構文を説明するために使用されています。 EBNF 定義は生産ルール、非ターミナル、およびターミナルで構成されます。 重要な用語は次のテーブルに表示されます。
重要な用語 | 例 | Description |
---|---|---|
ターミナル | Work_Team | ターミナルは、変更しない 1 文字または文字の文字列です。 |
非ターミナル | Employee |
非ターミナルは、生産ルールまたはテキストの説明のいずれかによって定義された言語の有効な文の一部の説明です。 非ターミナル記号は、1 つまたは複数のターミナル記号にいつでも展開できます。 |
生産ルール | 従業員 = 開発者 | テスト担当者 |
例
Work_Team = Manager Employee {, Employee} Employee = Developer | Tester この例は Work_Team を Manager
および一人またはそれ以上の Employees
で構成されるように定義します。 Employee
は、Developer
、または Tester
として定義されています。 この例で使用されているシンボルについては、次の表で説明します。
EBNF の特殊記号
記号 | 説明 |
---|---|
(式) | かっこには、記号 (ターミナルおよび非ターミナル) がまとめて保持されます。 生産ルールの右側の任意の場所に配置できます。 |
Expression1 | Expression2 |
[Expression] | オプション: [ と ] の間の項目はオプションです。 すべてまたはいずれかの項目に括弧が含まれます。 |
{Expression} | 繰り返し: { と } の間の項目はオプションですが、必要な回数繰り返し実行できます。 |
たとえば、自転車のために購入するアクセサリがサドル、飲料水ボトル ホルダー、ベル、およびクラクションから成る場合、ベルまたはクラクションのいずれか、および 0 個、1 個、または複数の飲料水ボトル ホルダー、さらにちょうど 1 つのサドルを持つことができ、この場合以下のように表されます: Bicycle_Accessories = saddle [bell | horn] {water_bottle_holders} この文法は次の選択を定義します。saddle
saddle bell
saddle horn
saddle water_bottle_holder saddle bell water_bottle_holder saddle bell water_bottle_holder water_bottle_holder など。
X++ 文法
この記事では、X++ 言語の正式な文法を示します。
正式な BNF 文法を解釈する方法
このセクションでは、Backus Naur Form (BNF) の X++ の文法について説明します。 次に、BNF の小さな例について説明します。
AA ::= BB CC_SYM
BB ::= JJ_SYM
::= KK_SYM
AA
は生産ルールの名前です。 AA
は BB
が必要で、続いて CC_SYM となります。 BB
も生産ルールです。 したがって、 BB
ターミナルは選択できない。 BB
は、ファイル名またはJJ_SYMする必要KK_SYM。 これらのJJ_SYMおよびKK_SYMは、他の生産ルールの名前を変更しないので、ターミナルです。 CC_SYM もターミナルです。
X++ の文法の BNF で、ターミナルのほとんどに名前の接尾語として _SYM があります。
BNF での正式な X++ 文法
このセクションには、X++文法を定義する BNF が含まれています。
CMPL_UNIT ::= RETTYPEID FUNC_HDR FUNC_HEAD BODY
::= RETTYPEID DATA_HDR CLASS_DECL
::= EXPR_HDR IF_EXPR SEMIOPT
::= RETTYPEID FUNC_HDR EVENT_DECL BODY
SEMIOPT ::= SEMICOLON_SYM
::=
CLASS_DECL ::= CLASS_HEADER LEFTBR_SYM DCL_EVENTMAP DCL_LIST RIGHTBR_SYM
CLASS_HEADER ::= ATTRIBUTE_DEF CLASS_MODIFIERS CLASSORINTERFACE STD_ID EXTENDS IMPLEMENTS
ATTRIBUTE_DEF ::= LEFT_BRKT_SYM ATTRIBUTE_INIT ATTRIBUTE_LIST RETTYPEID RGHT_BRKT_SYM
::=
ATTRIBUTE_INIT ::=
.
ATTRIBUTE_LIST ::= ATTRIBUTE
::= ATTRIBUTE_LIST LIST_SEP_SYM ATTRIBUTE
ATTRIBUTE ::= STD_ID
::= ATTRIBUTE_WITH_ARGS_BEGINS ATTRIBUTE_WITH_ARGS_ENDS
ATTRIBUTE_WITH_ARGS_BEGINS ::= STD_ID LEFT_PAR_SYM
ATTRIBUTE_WITH_ARGS_ENDS ::= ATTRIBUTE_ARGS RGHT_PAR_SYM
ATTRIBUTE_ARGS ::= ATTRIBUTE_CONSTANT
::= ATTRIBUTE_ARGS LIST_SEP_SYM ATTRIBUTE_CONSTANT
ATTRIBUTE_CONSTANT ::= INT_SYM
::= DBL_SYM
::= STR_SYM
::= DATE_SYM
::= DATETIME_SYM
::= STD_ID DBLCOLON_SYM STD_ID
::= TRUE_SYM
::= FALSE_SYM
::= INT64_SYM
::= ATTRIBUTE_INTRINSIC
ATTRIBUTE_INTRINSIC ::= INTRI_ID LEFT_PAR_SYM IARGS RGHT_PAR_SYM
CLASSORINTERFACE ::= CLASS_SYM
::= INTERFACE_SYM
CLASS_MODIFIERS ::= CLASS_MODS
::=
CLASS_MODS ::= CLASS_MODIFIER
::= CLASS_MODS RETTYPEID CLASS_MODIFIER
CLASS_MODIFIER ::= PUBLIC_SYM
::= FINAL_SYM
::= STATIC_SYM
::= ABSTRACT_SYM
::= PRIVATE_SYM
EXTENDS ::= EXTENDS_SYM STD_ID
::=
IMPLEMENTS ::= IMPLEMENTS_SYM IMPLEMENTLIST
::=
IMPLEMENTLIST ::= STD_ID
::= IMPLEMENTLIST LIST_SEP_SYM STD_ID
DCL_EVENTMAP ::=
EVENT_DECL ::= ATTRIBUTE_DEF EVENT_HEADER PARM_DCL_LIST
EVENT_HEADER ::= EVENT_MODIFIER VOID_TYPE_SYM STD_ID
EVENT_MODIFIER ::= EVENT_SYM
FUNC_HEAD ::= ATTRIBUTE_DEF FUNCNAME PARM_DCL_LIST
FUNCNAME ::= FUNCTYPE STD_ID
FUNCTYPE ::= FUNC_MODIFIERS DECL_TYPE
FUNC_MODIFIERS ::= FUNC_MODS
::=
FUNC_MODS ::= RETTYPEID FUNC_MODIFIER
::= FUNC_MODS RETTYPEID FUNC_MODIFIER
FUNC_MODIFIER ::= PUBLIC_SYM
::= PRIVATE_SYM
::= PROTECTED_SYM
::= FINAL_SYM
::= STATIC_SYM
::= ABSTRACT_SYM
::= DISPLAY_SYM
::= EDIT_SYM
::= SERVER_SYM
::= CLIENT_SYM
BODY ::= LEFTBR_SYM DCL_FUNC_LIST SEMIOPT SECAUTHZCHECK STMTLIST SECAUTHZEND RIGHTBR_SYM
SECAUTHZCHECK ::=
SECAUTHZEND ::=
RETTYPEID ::=
FUNCTION_DEF ::= FUNC_HEADER PARM_DCL_LIST LOCAL_BODY
FUNC_HEADER ::= DECL_TYPE STD_ID
PARM_DCL_LIST ::= RETTYPEID PARM_START PARM_LIST_OPT RGHT_PAR_SYM RETTYPEID
PARM_START ::= LEFT_PAR_SYM
PARM_LIST_OPT ::= PARM_LIST
::=
PARM_LIST ::= DCL_INIT
::= PARM_LIST LIST_SEP_SYM DCL_INIT
LOCAL_BODY ::= LEFTBR_SYM DCL_LIST SEMIOPT STMTLIST RETTYPEID RIGHTBR_SYM
DCL_LIST ::= DCL_LIST2
::=
DCL_LIST2 ::= DCL_STMT
::= DCL_LIST2 DCL_STMT
DCL_FUNC_LIST ::= DCL_FUNC_LIST2
::=
DCL_FUNC_LIST2 ::= DCL_STMT
::= FUNCTION_DEF
::= DCL_FUNC_LIST2 DCL_STMT
::= DCL_FUNC_LIST2 FUNCTION_DEF
DCL_STMT ::= DCL_INIT_LIST RETTYPEID SEMICOLON_SYM
DCL_INIT_LIST ::= DCL_INIT
::= DCL_CLIST ASG_CLAUSE
DCL_CLIST ::= DCL_INIT_LIST LIST_SEP_SYM STD_ID ARR_DCL_IDX
DCL_INIT ::= DECL ASG_CLAUSE
DECL ::= DECL_TYPE STD_ID ARR_DCL_IDX
DECL_TYPE ::= STR_TYPE_SYM STR_LEN
::= INT_TYPE_SYM
::= DBL_TYPE_SYM
::= DATE_TYPE_SYM
::= DATETIME_TYPE_SYM
::= TYPE_ID
::= QUEUE_TYPE_SYM
::= VOID_TYPE_SYM
::= ANY_TYPE_SYM
::= GUID_TYPE_SYM
::= INT64_TYPE_SYM
::= CLR_TYPE
CLR_TYPE ::= CLR_NAMESPACE TYPE_ID CLR_ARRAY_TYPE_EXT
::= CLR_NAMESPACE CLR_TYPE
CLR_NAMESPACE ::= TYPE_ID PERIOD_SYM
CLR_ARRAY_TYPE_EXT ::= CLR_ARRAY_SPEC
::=
CLR_ARRAY_SPEC ::= CLR_ARRAY_PART
::= CLR_ARRAY_SPEC CLR_ARRAY_PART
CLR_ARRAY_PART ::= CLR_ARRAY_LEFT_PART CLR_RECTANGULAR_LIST RGHT_BRKT_SYM
CLR_ARRAY_LEFT_PART ::= LEFT_BRKT_SYM
CLR_RECTANGULAR_LIST ::= CLR_COMMA_LIST
::=
CLR_COMMA_LIST ::= LIST_SEP_SYM
::= CLR_COMMA_LIST LIST_SEP_SYM
STR_LEN ::= INT_SYM
::=
ARR_DCL_IDX ::= LEFT_BRKT_SYM RANGE ARRAY_MEM RGHT_BRKT_SYM
::=
RANGE ::= IF_EXPR
::=
ARRAY_MEM ::= LIST_SEP_SYM IF_EXPR
::=
ASG_CLAUSE ::= INIT_START IF_EXPR
::=
INIT_START ::= ASG_SYM
ASG_STMT ::= LVAL_FLD ASSIGN IF_EXPR
::= LVAL_LIST ASG_SYM IF_EXPR
::= LVAL_FLD ASG_INC_DEC
::= ASG_INC_DEC LVAL_FLD
::= LVAL_FLD ASG_EVENT_HANDLER
ASSIGN ::= ASG_SYM
::= ASGINC_SYM
::= ASGDEC_SYM
ASG_INCDEC ::= ASGINC_SYM
::= ASGDEC_SYM
ASG_EVENT_HANDLER ::= ASG_INCDEC EVENTHANDLER_SYM LEFT_PAR_SYM QUALIFIER STD_ID RGHT_PAR_SYM
::= ASG_INCDEC EVENTHANDLER_SYM LEFT_PAR_SYM STD_ID DBLCOLON_SYM STD_ID RGHT_PAR_SYM
::= ASG_INCDEC EVENTHANDLER_SYM LEFT_PAR_SYM QUALIFIER EVAL_CLR_TYPE DBLCOLON_SYM STD_ID RGHT_PAR_SYM
ASG_INC_DEC ::= INC_SYM
::= DEC_SYM
LVAL_FLD ::= FIELD
LVAL_START ::= LEFT_BRKT_SYM
LVAL_LIST ::= LVAL_START LVALUES RGHT_BRKT_SYM
LVALUE ::= FIELD
LVALUES ::= LVALUE
::= LVALUES NEXTLVAL LVALUE
NEXTLVAL ::= LIST_SEP_SYM
IF_EXPR ::= COND_TRUE IF_EXPR
::= BOOL_EXPR
COND_TRUE ::= COND_TEST IF_EXPR COLON_SYM
COND_TEST ::= BOOL_EXPR QUEST_SYM
BOOL_EXPR ::= BOOL_EXPR LOGOP EXPR
::= EXPR
LOGOP ::= AND_SYM
::= OR_SYM
EXPR ::= SMPL_EXPR RELOP SMPL_EXPR
::= SMPL_EXPR AS_SYM STD_ID
::= SMPL_EXPR IS_SYM STD_ID
::= SMPL_EXPR AS_SYM EVAL_CLR_TYPE
::= SMPL_EXPR IS_SYM EVAL_CLR_TYPE
::= SMPL_EXPR
RELOP ::= LT_SYM
::= LE_SYM
::= EQ_SYM
::= NE_SYM
::= GT_SYM
::= GE_SYM
::= LIKE_SYM
SMPL_EXPR ::= SMPL_EXPR ADDOP TERM
::= TERM
ADDOP ::= PLUS_SYM
::= MINUS_SYM
::= PHYSOR_SYM
TERM ::= TERM MULOP CMPL_FACT
::= CMPL_FACT
MULOP ::= MULT_SYM
::= DIV_SYM
::= MOD_SYM
::= INTDIV_SYM
::= SHIFTL_SYM
::= SHIFTR_SYM
::= PHYSAND_SYM
::= PHYSXOR_SYM
CMPL_FACT ::= NOT_SYM SGND_FACT
::= SGND_FACT
SGND_FACT ::= SIGNOP FACTOR
::= FACTOR
SIGNOP ::= UMINUS_SYM
::= PHYSNOT_SYM
FACTOR ::= LEFT_PAR_SYM IF_EXPR RGHT_PAR_SYM
::= CONSTANT
::= FIELD
::= DIRSEARCH
::= FUNCTION
::= INTRINSICS
::= EVAL
::= CONLITTERAL
::= NEW_CLR_ARRAY
NEW_CLR_ARRAY ::= NEW_SYM EVAL_CLR_TYPE NEW_CLR_ARRAY_PART LEFT_PAR_SYM RGHT_PAR_SYM
NEW_CLR_ARRAY_PART ::= CLR_SIZED_ARRAY CLR_NOSIZED_ARRAY_SPEC
CLR_SIZED_ARRAY ::= LEFT_BRKT_SYM CLR_SMPL_EXPR_COMMA_LIST RGHT_BRKT_SYM
CLR_SMPL_EXPR_COMMA_LIST ::= SMPL_EXPR
::= CLR_SMPL_EXPR_COMMA_LIST LIST_SEP_SYM SMPL_EXPR
CLR_NOSIZED_ARRAY_SPEC ::= CLR_NOSIZED_ARRAY_LIST
::=
CLR_NOSIZED_ARRAY_LIST ::= CLR_NOSIZED_ARRAY
::= CLR_NOSIZED_ARRAY_LIST CLR_NOSIZED_ARRAY
CLR_NOSIZED_ARRAY ::= LEFT_BRKT_SYM CLR_EMPTY_COMMA_LIST RGHT_BRKT_SYM
CLR_EMPTY_COMMA_LIST ::= CLR_EMPTY_RECT_COMMA_LIST
::=
CLR_EMPTY_RECT_COMMA_LIST ::= LIST_SEP_SYM
::= CLR_EMPTY_RECT_COMMA_LIST LIST_SEP_SYM
CONLITTERAL ::= LEFT_BRKT_SYM IF_EXPR EXPR_LIST RGHT_BRKT_SYM
CONSTANT ::= INT_SYM
::= DBL_SYM
::= STR_SYM
::= DATE_SYM
::= DATETIME_SYM
::= STD_ID DBLCOLON_SYM STD_ID
::= TRUE_SYM
::= FALSE_SYM
::= NULL_SYM
::= INT64_SYM
::= QUALIFIER EVAL_CLR_TYPE DBLCOLON_SYM STD_ID
::= QUALIFIER STD_ID DBLCOLON_SYM STD_ID
DIRSEARCH ::= DIRS_HEADER PERIOD_SYM STD_ID ARR_IDX
::= DIRS_HEADER PERIOD_SYM FLD_NUM ARR_IDX
DIRS_HEADER ::= LEFT_PAR_SYM SET_DIRS FIND_JOIN RGHT_PAR_SYM
SET_DIRS ::=
FIELD ::= QUALIFIER STD_ID ARR_IDX
::= QUALIFIER FLD_NUM ARR_IDX
::= STD_ID ARR_IDX
QUALIFIER ::= EVAL PERIOD_SYM
::= STD_ID PERIOD_SYM
FLD_NUM ::= LEFT_PAR_SYM IF_EXPR RGHT_PAR_SYM
ARR_IDX ::= LEFT_BRKT_SYM SMPL_EXPR RGHT_BRKT_SYM
::=
EXPR_LIST ::= EXPR_LIST2
::=
EXPR_LIST2 ::= LIST_SEP_SYM IF_EXPR
::= EXPR_LIST2 LIST_SEP_SYM IF_EXPR
FUNCTION ::= FUNC_ID LEFT_PAR_SYM EVAL_FUNCTION_NAME PAR_LIST RGHT_PAR_SYM
EVAL_FUNCTION_NAME ::=
EVAL_NAME ::= EVAL_ID LEFT_PAR_SYM
::= STD_ID LEFT_PAR_SYM
::= STD_ID DBLCOLON_SYM STD_ID LEFT_PAR_SYM
::= SUPER_SYM LEFT_PAR_SYM
::= NEW_SYM STD_ID LEFT_PAR_SYM
::= NEW_SYM EVAL_CLR_TYPE LEFT_PAR_SYM
::= QUALIFIER EVAL_CLR_TYPE DBLCOLON_SYM STD_ID LEFT_PAR_SYM
::= QUALIFIER STD_ID LEFT_PAR_SYM
::= QUALIFIER STD_ID DBLCOLON_SYM STD_ID LEFT_PAR_SYM
EVAL_CLR_TYPE ::= NAMESPACE STD_ID
::= NAMESPACE EVAL_CLR_TYPE
NAMESPACE ::= STD_ID PERIOD_SYM
EVAL ::= EVAL_NAME PAR_LIST RGHT_PAR_SYM
PAR_LIST ::= PRM_LIST
::=
PRM_LIST ::= PAR_ELEM
::= PRM_LIST LIST_SEP_SYM PAR_ELEM
PAR_ELEM ::= IF_EXPR
::= BYREF_SYM FIELD
INTRINSICS ::= INTRI_ID LEFT_PAR_SYM IARGS RGHT_PAR_SYM
IARGS ::= STD_ID
::= STR_SYM
::= STD_ID LIST_SEP_SYM STD_ID
::=
STMTLIST ::= STATEMENTS
::=
STATEMENTS ::= STATEMENT
::= STATEMENTS STATEMENT
STATEMENT ::= COMPOUND_STMT
::= WHILE_STMT
::= FOR_STMT
::= DO_STMT
::= SEARCH_STMT
::= FIND_STMT
::= PRINT_STMT
::= WINDOW_STMT
::= IF_STMT
::= SWITCH_STMT
::= EXPR_STMT
::= PAUSE_STMT
::= BP_CLAUSE
::= BREAK_STMT
::= CONTINUE_STMT
::= RETURN_CLAUSE
::= MOVE_REC_STMT
::= THROW_STMT
::= TRY_STMT
::= RETRY_STMT
::= TTS_STMT
::= FLUSH_STMT
::= TBLLOCK_STMT
::= CHANGE_STMT
::= UPDATE_STMT
::= INSERT_STMT
::= UNCHECKED_STMT
COMPOUND_STMT ::= LEFTBR_SYM STMTLIST RIGHTBR_SYM
THROW_STMT ::= THROW_SYM IF_EXPR SEMICOLON_SYM
TRY_STMT ::= TRY_BLOCK CATCH_LIST
TRY_BLOCK ::= TRY_START STATEMENT
TRY_START ::= TRY_SYM
CATCH_LIST ::= CATCH_STMT
::= CATCH_LIST CATCH_STMT
CATCH_STMT ::= CATCH_EXPR PRE_CATCH STATEMENT POST_CATCH
CATCH_EXPR ::= CATCH_SYM LEFT_PAR_SYM IF_EXPR RGHT_PAR_SYM
::= CATCH_SYM LEFT_PAR_SYM IF_EXPR LIST_SEP_SYM TABLEINSTANCE RGHT_PAR_SYM
::= CATCH_SYM
PRE_CATCH ::=
POST_CATCH ::=
TABLEINSTANCE ::= INSTANCENAME
INSTANCENAME ::= QUALIFIER STD_ID ARR_IDX
::= STD_ID ARR_IDX
RETRY_STMT ::= RETRY_SYM SEMICOLON_SYM
WHILE_STMT ::= WHILE_TEST STATEMENT
WHILE_TEST ::= WHILE LEFT_PAR_SYM IF_EXPR RGHT_PAR_SYM
WHILE ::= WHILE_SYM
DO_STMT ::= DO_BODY DO_TEST SEMICOLON_SYM
DO_BODY ::= DO_HEADER STATEMENT
DO_HEADER ::= DO_SYM
DO_TEST ::= WHILE_SYM LEFT_PAR_SYM IF_EXPR RGHT_PAR_SYM
FOR_STMT ::= FOR_HEADER STATEMENT
FOR_HEADER ::= FOR_TEST SEMICOLON_SYM FOR_ASG RGHT_PAR_SYM
FOR_TEST ::= FOR_INIT SEMICOLON_SYM IF_EXPR
FOR_INIT ::= FOR_SYM LEFT_PAR_SYM FOR_ASG
FOR_ASG ::= LVAL_FLD ASSIGN IF_EXPR
::= LVAL_FLD ASG_INC_DEC
::= ASG_INC_DEC LVAL_FLD
JOIN_LIST ::= JOIN_SPECS
::=
JOIN_SPECS ::= JOIN_SPEC
::= JOIN_SPECS JOIN_SPEC
JOIN_SPEC ::= JOIN_ORDER WHERE IF_EXPR
::= JOIN_ORDER
JOIN_ORDER ::= JOIN_USING
::= JOIN_USING ORDER_GROUP
JOIN_USING ::= JOIN_CLAUSE USING_INDEX STD_ID
::= JOIN_CLAUSE USING_INDEX HINT_SYM STD_ID
::= JOIN_CLAUSE
JOIN_CLAUSE ::= OUTER JOIN_SYM SELECTOPT TABLE
OUTER ::= OUTER_SYM
::= EXISTS_SYM
::= NOTEXISTS_SYM
::=
SEARCH_STMT ::= SEARCH_JOIN STATEMENT
SEARCH_JOIN ::= SEARCH_WHERE JOIN_LIST
SEARCH_WHERE ::= SEARCH_ORDER WHERE IF_EXPR
::= SEARCH_ORDER
WHERE ::= WHERE_SYM
SUM_ELEM ::= SUM_FUNC LEFT_PAR_SYM STD_ID RGHT_PAR_SYM
SUM_FUNC ::= SUM_SYM
::= AVG_SYM
::= CNT_SYM
::= MINOF_SYM
::= MAXOF_SYM
SEARCH_ORDER ::= SEARCH_USING
::= SEARCH_USING ORDER_GROUP
ORDER_GROUP ::= ORDERBY_CLAUSE OPT_GROUPBY
::= GROUPBY_CLAUSE OPT_ORDERBY
OPT_GROUPBY ::= GROUPBY_CLAUSE
::=
OPT_ORDERBY ::= ORDERBY_CLAUSE
::=
ORDERBY_CLAUSE ::= ORDER_SYM OPT_BY ORDER_ELEM
::= ORDERBY_CLAUSE LIST_SEP_SYM ORDER_ELEM
GROUPBY_CLAUSE ::= GROUP_SYM OPT_BY ORDER_ELEM
::= GROUPBY_CLAUSE LIST_SEP_SYM ORDER_ELEM
ORDER_ELEM ::= STD_ID INDEX DIRECTION
::= ORDER_QUALIFIER STD_ID INDEX DIRECTION
ORDER_QUALIFIER ::= STD_ID PERIOD_SYM
INDEX ::= LEFT_BRKT_SYM INT_SYM RGHT_BRKT_SYM
::=
DIRECTION ::= ASCEND_SYM
::= DESCEND_SYM
::=
OPT_BY ::= BY_SYM
::=
SEARCH_USING ::= SEARCH_CLAUSE USING_INDEX STD_ID
::= SEARCH_CLAUSE USING_INDEX HINT_SYM STD_ID
::= SEARCH_CLAUSE
USING_INDEX ::= INDEX_SYM
SEARCH_CLAUSE ::= WHILE_SYM SELECT_SYM SELECTOPT CROSSCOMPANY_CLAUSE VALIDTIMESTATE_CLAUSE TABLE
CROSSCOMPANY_CLAUSE ::= CROSSCOMPANY_SYM
::= CROSSCOMPANY_SYM COLON_SYM STD_ID
::=
VALIDTIMESTATE_CLAUSE ::= VALIDTIMESTATE_SYM LEFT_PAR_SYM STD_ID LIST_SEP_SYM STD_ID RGHT_PAR_SYM
::= VALIDTIMESTATE_SYM LEFT_PAR_SYM STD_ID RGHT_PAR_SYM
::=
SELECTOPT ::=
::= SELECTOPT REVERSE_SYM
::= SELECTOPT FIRSTFAST_SYM
::= SELECTOPT FIRSTONLY_SYM
::= SELECTOPT FIRSTONLY_SYM1
::= SELECTOPT FIRSTONLY_SYM10
::= SELECTOPT FIRSTONLY_SYM100
::= SELECTOPT FIRSTONLY_SYM1000
::= SELECTOPT FORUPDATE_SYM
::= SELECTOPT NOFETCH_SYM
::= SELECTOPT FORCE_SELECT_ORDER_SYM
::= SELECTOPT FORCE_NESTED_LOOP_SYM
::= SELECTOPT FORCE_LITERALS_SYM
::= SELECTOPT FORCE_PLACEHOLDERS_SYM
::= SELECTOPT REPEATABLEREAD_SYM
::= SELECTOPT OPTIMISTICLOCK_SYM
::= SELECTOPT PESSIMISTICLOCK_SYM
::= SELECTOPT GENERATEONLY_SYM
FIND_STMT ::= FIND_JOIN SEMICOLON_SYM
FIND_JOIN ::= FIND_WHERE JOIN_LIST
FIND_WHERE ::= FIND_ORDER WHERE IF_EXPR
::= FIND_ORDER
FIND_ORDER ::= FIND_USING
::= FIND_USING ORDER_GROUP
FIND_USING ::= FIND_TABLE USING_INDEX STD_ID
::= FIND_TABLE USING_INDEX HINT_SYM STD_ID
::= FIND_TABLE
FIND_TABLE ::= SELECT_SYM SELECTOPT CROSSCOMPANY_CLAUSE VALIDTIMESTATE_CLAUSE TABLE
::= DELETE_SYM SELECTOPT CROSSCOMPANY_CLAUSE VALIDTIMESTATE_CLAUSE TABLE
TABLE ::= FLD_LIST OPT_FROM
FLD_LIST ::= MULT_SYM
::= FIELD_LIST
FIELD_LIST ::= FIELD_SPEC
::= FIELD_LIST LIST_SEP_SYM FIELD_SPEC
FIELD_SPEC ::= STD_ID INDEX
::= SUM_ELEM
OPT_FROM ::= FROM_SYM STD_ID
::=
SETFIELDSMODE ::=
UPDATE_STMT ::= UPDATETABLE SET_SYM SETFIELDSMODE FIELDASSIGNMENTS OPT_WHERE JOIN_LIST SEMICOLON_SYM
UPDATETABLE ::= UPDATE_SYM SELECTOPT CROSSCOMPANY_CLAUSE STD_ID
OPT_WHERE ::= WHERE IF_EXPR
::=
FIELDASSIGNMENTS ::= FIELDASSIGNMENTS LIST_SEP_SYM FIELDASSIGNMENT
::= FIELDASSIGNMENT
FIELDASSIGNMENT ::= STD_ID INDEX ASG_SYM IF_EXPR
INSERT_PART ::= INSERT_SYM CROSSCOMPANY_CLAUSE INSERT_NAME LEFT_PAR_SYM INSERTFIELDLIST RGHT_PAR_SYM
INSERT_NAME ::= STD_ID
INSERT_STMT ::= INSERT_PART FIND_JOIN SEMICOLON_SYM
INSERTFIELDLIST ::= INSERTFIELD
::= INSERTFIELDLIST LIST_SEP_SYM INSERTFIELD
INSERTFIELD ::= STD_ID INDEX
PRINT_STMT ::= PRINT_CLAUSE AT_CLAUSE SEMICOLON_SYM
PRINT_CLAUSE ::= PRINT IF_EXPR EXPR_LIST
PRINT ::= PRINT_SYM
AT_CLAUSE ::= AT_SYM IF_EXPR LIST_SEP_SYM IF_EXPR
::=
WINDOW_STMT ::= WINDOW_SYM IF_EXPR LIST_SEP_SYM IF_EXPR AT_CLAUSE SEMICOLON_SYM
IF_STMT ::= ELSE_STMT
::= IF_CONDS
IF_CONDS ::= IF_COND STATEMENT
IF_COND ::= IF_SYM LEFT_PAR_SYM IF_EXPR RGHT_PAR_SYM
ELSE_STMT ::= ELSE STATEMENT
ELSE ::= IF_CONDS ELSE_SYM
SWITCH_STMT ::= CASE_LIST RIGHTBR_SYM
CASE_LIST ::= SWITCH_SYM LEFT_PAR_SYM IF_EXPR RGHT_PAR_SYM LEFTBR_SYM
::= CASE_TESTS STMTLIST
CASE_TESTS ::= CASE_HEADER COLON_SYM
::= CASE_LIST DEFAULT_SYM COLON_SYM
CASE_HEADER ::= CASE IF_EXPR
::= CASEALT IF_EXPR
CASE ::= CASE_LIST CASE_SYM
CASEALT ::= CASE_HEADER LIST_SEP_SYM
EXPR_STMT ::= ASG_STMT SEMICOLON_SYM
::= FUNCTION SEMICOLON_SYM
::= INTRINSICS SEMICOLON_SYM
::= EVAL SEMICOLON_SYM
PAUSE_STMT ::= PAUSE_SYM SEMICOLON_SYM
BP_CLAUSE ::= BP_SYM SEMICOLON_SYM
BREAK_STMT ::= BREAK_SYM SEMICOLON_SYM
CONTINUE_STMT ::= CONTINUE_SYM SEMICOLON_SYM
RETURN_CLAUSE ::= RETURN_SYM SEMICOLON_SYM
::= RETURN_SYM IF_EXPR SEMICOLON_SYM
TTS_STMT ::= TTSABORT_SYM SEMICOLON_SYM
::= TTSBEGIN_SYM SEMICOLON_SYM
::= TTSEND_SYM SEMICOLON_SYM
FLUSH_STMT ::= FLUSH ID_LIST SEMICOLON_SYM
FLUSH ::= FLUSH_SYM
TBLLOCK_STMT ::= TABLELOCK ID_LIST SEMICOLON_SYM
TABLELOCK ::= TABLELOCK_SYM
ID_LIST ::= STD_ID
::= ID_LIST LIST_SEP_SYM STD_ID
MOVE_REC_STMT ::= NEXT_SYM TABLE SEMICOLON_SYM
CHANGE_STMT ::= CHANGE_HEADER STATEMENT
CHANGE_HEADER ::= CHANGE LEFT_PAR_SYM IF_EXPR RGHT_PAR_SYM
CHANGE ::= CHANGECOMP_SYM
::= CHANGESITE_SYM
UNCHECKED_STMT ::= UNCHECKED_HEADER STATEMENT
UNCHECKED_HEADER ::= UNCHECKED_SYM LEFT_PAR_SYM IF_EXPR RGHT_PAR_SYM
X++ 言語の構文は Microsoft Dynamics AX 2012 では厳密です
Microsoft Dynamics AX 2012 以降では、X++ の構文ルールが以前のバージョンの製品より厳しくなっています。 この記事では、構文の変更について説明します。
X++ 構文変更のテーブル
次のテーブルに、Microsoft Dynamics AX 2012 で始まる構文の変更の一覧を示します。
エリア | 構文ルール | Microsoft Dynamics AX 2012 以前 | Microsoft Dynamics AX 2012 で始まる | ||
---|---|---|---|---|---|
エスケープ | バックスラッシュ文字 </span> は、認識されないエスケープとしてコンパイラで拒否されます | コンパイラは、「31\12\2002」 を受け付けていましたが、実行時にリテラル文字列は異なる値として解釈されました。 | 現在、次の X++ ステートメントはコンパイラによって拒否されます: str myDateString = "31\12\2002";。正しい構文は、"31\12\2002" です。 | ||
例外 | 再試行は、catch ブロックの外部で使用できなくなった | catch ブロックの外に retry キーワードを書き込むことができました。 これにより、実行時に再試行に達したときにプログラムが終了しました。 | 現在は、再試行が catch ブロック内部でのみ発生するようになりました。 詳細については、「tryおよびcatchキーワードを使用した例外処理」を参照してください。 | ||
例外 | int 値だけをスローおよび取得できるようになります |
throw "hello world"; などの文字列および日付のようなスカラー式をスローでき、コンパイル エラーが発生しませんでした。 実行時には、特定の値 (「Catch worked」など) を使用して生み出された catch ブロックに、 catch {print("Catch worked")、}。 |
現在、throw キーワードで配置できる唯一の式は、int です。 多くの場合、スローするための最もよい方法は、Global::error("Explanation"); です。 多くの場合、見つけるための最もよい方法は、Exception 列挙の要素です。 詳細については、「tryおよびcatchキーワードを使用した例外処理」を参照してください。 |
||
継承 | ダウン キャストは明示的にできるようになりました。
|
単純な代入演算子である等号記号 (= ) で派生オブジェクトに基本オブジェクトを代入することができました。 コンパイラはこれらの割り当てを受け入れましたが、実行時に不適切なダウンキャスト割り当てを誤って使用するとエラーが発生しました。 |
現在は、ダウンキャストは明示的にできるようになりました。 これは、演算子として新しく実行されます。 as キーワードによる明示的なダウンキャストは、ThingClass が Object で拡張する次のコード例で示されています。ThingClass myThing = new ThingClass(); Object myObject = myThing; myThing = myObject as ThingClass; // Explicit downcast, good. 詳細については、式の演算子: 継承の Is および As を参照してください。 |
||
継承 | 基本メソッドの上書きに基本メソッドより低いアクセス許可を設定できない | 基本メソッドを protected で修飾して、メソッドのオーバーライドを private とすることができました。 | 基本メソッドを保護 保護 次に、上書きメソッドを保護する 保護 パブリック パブリック のいずれかである必要があります。また、上書きメソッドを プライベート。 この方法の詳細については、「メソッド アクセス コントロール」を参照してください。 | ||
継承 | 基本メソッドのオーバーライドは、基本メソッドとまったく同じ戻り値の型とパラメータ署名にする必要があります。 | 基本クラスに、すべてのテーブルの基準となっている Common テーブルのパラメーターを入力するメソッドがあったと仮定します。 派生クラスでは、代わりに MyTable を入力するメソッドをオーバーライド可能でした。 |
現在、基本メソッドとそのオーバーライド メソッドのパラメーター署名は、正確に一致する必要があります。 また、戻り値の型が正確に一致する必要があります。 詳細については、「メソッドの上書き」を参照してください。 | ||
インターフェイス | インターフェイス メソッドの実装はパラメーター署名と完全に一致する必要があります。 | インターフェイスに、int のパラメーターを入力するメソッドがあると仮定します。 インターフェイスを実装するクラスでは、メソッドを str のパラメーターで記述可能でした。 |
現在、メソッドのパラメーター署名は、インターフェイスとクラスのメソッドの実装の間で正確に一致する必要があります。 また、戻り値の型が正確に一致する必要があります。 詳細については、「インターフェイスの概要」を参照してください。 | ||
インターフェイス | インターフェイスを実装する派生クラスではない基本クラスは、その実装の派生クラスに依存できない | 基本クラスでインターフェイスを実装するとき、インターフェイスのメソッドが派生クラスによって実装された場合、基本クラスでそのメソッドを実装しないことが可能でした。 唯一の制限は、 new constructorメソッドの変更がクラスに対して呼び出されなくてすでした。 |
現在は、コンパイラによって、インターフェイスを実装するすべてのクラスは、インターフェイスのすべてのメソッドの完全な実装を持つまたは継承することが必須とされています。 詳細については、X++、C# の比較: オブジェクト指向プログラミングを参照してください。 | ||
モディファイア | レジ はインターフェイスに適用しない | 静的インターフェイス{} IMyInterface を書き込むことができましたが、このコンテキストでは意味がないため、static モディファイアーに影響はありませんでした。 | Dynamics AX 2009 以降、X++ コンパイラがインターフェイス宣言上で静的モディファイアーの許可をやめることがあります。 詳細については、「インターフェイスの概要」を参照してください。 | ||
モディファイア | 静的修飾子を new コンストラクターに適用する必要があります |
静的モディファイアーを new コンストラクター メソッドの宣言に適用することができました。 これにより、new MyClass(); が NULL 操作として動作するようになりました。 代わりに、ステートメント MyClass::new(; は静的メソッド new 呼び出しますが、オブジェクトを作成する必要があります。 |
現在は、静的モディファイアーが new メソッドに適用されるときにコンパイラはエラーを発行します。 詳細については、「コンストラクター」を参照してください。 |
||
モディファイア | 各メソッドで明示的なアクセス修飾子を使用 | 過去には、AOT >クラス>MyClass>新しいメソッドのメニュー項目で、アクセス修飾子のないメソッドを作成していました。 これは、メソッドが暗黙的にパブリック であることを意味しましたが、一部の X++ 開発者は既定を完全に認識していない可能性があります。 開発者がメソッドが呼び出される可能性のあるあらゆる場所を調べる必要があり、メソッドのコードを修正しなければならなかったときに、これにより余分な作業が後で発生しました。 | 現在は、新しいメソッドのメニュー項目において新しいメソッドの自動宣言に private キーワードが明示的に含まれています。 開発者は、必要に応じて別のモディファイアーを入力することができます。 詳細については、「メソッド モディファイア」を参照してください。 | ||
パラメーター | new コンストラクターの呼び出しで指定されるパラメーターは、new コンストラクター メソッドのパラメーターと一致する必要があります |
new メソッドがパラメーターを入力しないために宣言された場合でも、new コンストラクター メソッドの呼び出しで複数のパラメーターを渡すことができました。 |
現在は、new メソッドへの呼び出しは、宣言された new メソッドのパラメーター署名と正確に一致する必要があります。 詳細については、「サブクラスの作成」を参照してください。 |
||
パラメーター | 既定値を持つパラメータは、既定値を持たないすべてのパラメータの後に表示される必要があります。 | 2 つのパラメーターで取得するメソッドを宣言して、最初のパラメーターのみに既定値を提供させるようにできました。 この目的はありませんでした。 呼び出しで2番目のパラメータの値を指定する必要があるが、最初のパラメータを省略できないので、最初のパラメータの既定値を受け入れる方法はなかった。 | ここで、メソッドの申告で、既定値を提供するパラメータは、そうしないすべてのパラメータの後に来る必要があります。 詳細については、次のトピックを参照してください:
|
||
パラメーター | メソッドのオーバーライドには、オーバーライドされたメソッドとして同じ既定のパラメータが必要です。 | メソッドを public void myMethod(int i=22){} として、オーバーライドを public void myMethod(){} として宣言することができました。 ただし、オーバーライド メソッドが derivedObject(333); として呼び出された場合はエラーが発生しました。 |
ここで、上書きメソッドは、上書きされたメソッドで宣言されたのと同じ順序で同じパラメータ タイプを一覧表示する必要があります。 詳細については、「メソッドの上書き」を参照してください。 | ||
プリプロセッサ | A TODO コメントの最初の行には、非サイトスペースを指定する必要があります。 | 複数行 /* ... */ タスク コメントで、最初のコメント行の後の他のテキストの後に TODO キーワードが出現した場合でも、TODO を検出するために使用する X++ プリプロセッサ。 | これで、X++ プリプロセッサは、コメントの最初の行 TODO keyors TODO 承認のみ、およびコメントの最初の非空白として検出されます。 詳細については、「X++ 開発者タスクに対する TODO コメント」を参照してください。 |