共用方式為


X++ 語法

備註

社區興趣小組現在已從 Yammer 轉移到 Microsoft Viva Engage。 若要加入 Viva Engage 社群並參與最新的討論,請填寫 [ 要求存取財務和營運 Viva Engage 社群 表單 」 ,並選擇您要加入的社群。

本文包含 X++ 的語法參考。

X++ 關鍵字

下表中顯示的 X++ 關鍵字是保留的。 這些關鍵字不能用於任何其他目的。

保留字 Description 相關信息
! 不。 關聯式運算子
!= 不等式運算子(不等於)。 關聯式運算子
# 巨集名稱的前置詞。 如何:使用 #define 和 #if 來測試巨集
& 二進制 AND。 算術運算子
&& 邏輯 AND。 關聯式運算子
( 函式呼叫運算子,指出函式呼叫的開頭。
) 函數呼叫運算子,表示函數呼叫的結束。
* 乘。 星號 (*) 也用於 X++ SQL。 其中一個用途是表示陳述式上 select 表格中的所有欄位。 另一個用途是作為運算子的 like 通配符,表示 0 到任何類型的許多字元。 運算子 like 也會使用 字元。 算術運算子
^ 二進制異或。 算術運算子
| 二進位 OR。 算術運算子
|| 邏輯 OR。 關聯式運算子
~ 不。 算術運算子
+ 加。 算術運算子
++ 增量。 指派運算子
+= 加法分配。 指派運算子
, 逗號運算子。 以逗號分隔的運算式會依序從左到右評估。
- 減。 算術運算子
-- 遞減運算子。 指派運算子
-= 減法賦值。 指派運算子
. 例如,類別成員存取運算子存取 formRun.runrun 類別類型 FormRun物件的方法。
/ 除。 算術運算子
\ 以字串形式逃脫。 轉義額外的引號,以及某些字母,例如 '\t' 表示 tab。
@ 關鍵字的逸出。 例如, var @str = 1@abstract; 無法編譯,而 @ 字元會導致其後面的任何字串被視為識別碼。 它也會影響文字字串,方法是否定 \ 逸出字元的效果,以及讓字串在原始程式碼中跨越多行。 新行由一個十六進位0x0A字元表示,通常稱為換行。 不包括十六進位0x0D的回車字元,如0x0D0A所示。
: 冒號 () 字元可用來分隔陳述式中的 switch 大小文字值。
:: 用於呼叫靜態(類別)方法: ClassName::methodName()並指定列舉文字,例如 NoYes::Yes
; 終止陳述式。 用於迴圈中 for ,或作為初始化式、更新和值檢查部分的分隔符。
< 以內。 關聯式運算子
<< 左移。 算術運算子
<= 小於或等於。 算術運算子
= 指派運算子。 “=” 左側的引數會設定為右側引數的值。 指派運算子
== 如果運算式相等,則傳回 true。 關聯式運算子
> 大於。 關聯式運算子
>= 大於或等於。 關聯式運算子
>> 位元右移。 此運算子將左側的位移位以右側的量。 每次移位有效地將數字除以 2^n,其中 n 是移位的位數。 算術運算子
?: 三元運算子。 問號 () 字元也被 like 運算子用來表示任何類型的一個字元。 運算子 like 也會使用字 元。 三元運算子 (?
[ 陣列宣告器,開啟。 必須與 “]” 一起使用。
] 陣列宣告符,關閉。 必須與 “[” 一起使用。
{ 啟動複合陳述式,該陳述式可能包含零個或多個陳述式。 複合陳述式以最接近的相符 “}” 結尾。
} 指出上述複合陳述式的結尾。 「{」必須出現在第一個陳述式之前。
abstract 類別和方法修飾詞。 抽象類別無法使用 new 關鍵字建構 - 只有從它衍生的類別才能。 無法呼叫 抽象 方法,只有覆寫它的方法才能呼叫。 您可以在 AOT 中將資料表的 Abstract 屬性設定為 Yes ,或使用 類別 DictTable ,將資料表修改為抽象資料表。 Abstract 屬性預設為 No,除非資料表由另一個資料表擴充,否則無法設定它。 抽象資料表中的每一列都必須在衍生資料表中具有相依資料列。 這表示抽象資料表中的每一列在其 InstanceRelationType 屬性欄位中都有大於零的值。 將表格標示為抽象並無其他影響。 非正式地,程式設計師經常使用 「具體 」一詞來描述非抽象類別。 方法修飾詞資料表繼承概觀
任何類型 可以包含任何類型的值的類型。 任何類型
當您將基底類別變數指派給衍生類別變數時需要。 例如,給定擴充Derived類別的Base類別,陳述式myDerived = myBase as Derived;會使用 as 關鍵字來避免編譯器錯誤。 當您將基底表格變數指派給衍生表格變數時,此關鍵字也會套用。 如果值 (myBase) 不是指定的類型 (衍生) ,運算式會傳回 null。 運算式運算子:Is和As,用於繼承
ASC的 陳述式中 order orbygroup子句上的byselect選項。 排序是遞增的。 選取陳述式語法
at 指定列印視窗的位置作為陳述式的一部分 print 。 不應使用 print 陳述式。 列印陳述式
avg 傳回陳述式中group byselect句所指定列的欄位平均值。 選取陳述式語法
break 立即退出迭代代碼塊。 中斷陳述式
中斷點 代表為偵錯目的而設定的岔斷點。 若要在程式碼中設定中斷點,請撰寫: breakpoint;
保留字詞的一部分,例如分組依據和排序依據。
byref 指定傳遞至呼叫方法的參數是透過參照 (位址) 傳遞,而不是依值傳遞。 在 X++ 中呼叫以參考方式採用參數的 .NET 方法時,會使用 Byref (,例如 C# 關鍵字 outref) 。 如何:使用 byref 關鍵字進行 CLR 互通性。
case 陳述式中的 switch 選取。 Switch 陳述式
用於異常處理。 使用 try 和 catch 關鍵字進行異常處理
變更公司 將資料庫設定變更為另一家公司。 改變公司設計模式
類別 宣告類別。 X++ 中的類別
顧客 方法修飾符。 這些修飾符不再使用。 所有方法都會在伺服器層上執行。 方法修飾詞
容器 指定 container 類型。 容器包含一系列原子值和其他容器。 容器
continue 強制迴圈的下一次疊代。 繼續陳述
計數 傳回陳述式中group byselect句所指定列的記錄數。 選取陳述式語法
跨公司 使 select 陳述式傳回使用者有權讀取的所有公司的資料。 跨公司 X++ 程式碼基本概念
date 指定類型 date為 的變數。 日期
默認 陳述式內 switch 的預設大小文字。 如果 switch 值與陳述式中case提供的任何switch子句不符,則會執行預設部分中的程式碼區塊。 Switch 陳述式
delegate 能夠儲存其他類別中方法的多個參考的類別成員,並在提示時呼叫所有這些方法。 委派可以儲存各種方法的參考,包括下列各項:
  • X++ 類別上的靜態方法
  • X++ 類別上的實例方法
  • .NET Framework 類別上的方法
事件術語和關鍵字 X++、C# 比較:事件
delete_from 可讓您從資料庫中刪除記錄。 delete_from
描述 陳述式中 order by or group by 子句上的select選項。 排序是遞減的。 選取陳述式語法
方法修飾符。 顯示</顯示>方法可用來在表單控制項中顯示計算值。與一般欄位不同,這些值不會儲存在資料庫中,而是動態計算。 方法修飾詞
div 整數除法。 算術運算子
循環的 do...while 開始。 做。。。while 循環
edit 方法修飾符。 X++ 中的方法 edit 允許使用者在執行自訂邏輯時修改表單控制項中的值。 與僅顯示計算值的方法不同 display ,編輯方法可以同時檢視和編輯。 方法修飾詞
條件式執行 (if...else)。 else if如果 if 陳述式中的運算式評估為false 如果和如果......else 陳述式
事件處理常式 每次使用 or += 運算子從-=委派新增或刪除方法參考時,都必須使用。 例如: myDelegate += eventHandler(OtherClass::myStaticMethod); 事件術語和關鍵字 X++、C# 比較:事件
存在 與陳述式中的join子句一起使用select 選取陳述式語法
延伸 類別或介面宣告子句。 如果您的類別未明確擴充另一個類別,則您的類別會被視為擴充該 Object 類別(就像您編寫了「extends Object」)一樣。 建立子類別
布林值字面值。 布林值
類別和方法修飾詞。 指定無法覆寫此方法。 方法修飾詞
第一快 用於陳述式中 select ,以加速第一列的擷取速度。 選取陳述式語法
firstOnly 用於陳述式中 select ,以僅擷取第一筆記錄。 firstOnly關鍵字不保證 X++ SQL select 陳述式最多擷取一筆記錄。 如果AOS可以使用 EntireTable 快取來滿足語句的資料 select 需求, firstOnly 則忽略關鍵字。 選取陳述式語法集型快取
第一只10 firstOnly 相同,except 會傳回 10 列,而不是 1 列。
第一只有100 firstOnly 相同,except 會傳回 100 列,而不是 1 列。
第一只1000 firstOnly 相同,except 會傳回 1,000 列,而不是 1 列。
flush 清除整個表格快取。 當您想要確保對表格所做的任何變更都會立即反映在後續作業中時,這會很有用。 以集為基礎的快取
for For 迴圈迭代。 For 迴圈
forceLiterals 用於陳述式, select 以在最佳化時向 Microsoft SQL Server 資料庫顯示子句中使用的 where 實際值。 選取陳述式語法
forceNestedLoop 強制 SQL Server 資料庫使用巢狀迴圈演算法來處理包含 join. 選取陳述式語法
force預留位置 用於陳述式, select 以指示核心在最佳化時不要將子句中使用的 where 實際值顯示給 Microsoft SQL Server 資料庫。 選取陳述式語法
強制選擇順序 強制 SQL Server 資料庫以指定的順序存取聯結中的資料表。 選取陳述式語法
更新 選取專門用於更新的記錄。 要對提取的記錄執行的作業是更新。 視基礎資料庫而定,記錄可能會鎖定給其他使用者。 選取陳述式語法
from 聲明的一部分 select 。 子句會 from 指定資料行所在的表格緩衝區。 選取陳述式語法
group 聲明中group by條款select的一部分。 選取陳述式語法
如果 條件式執行。 如果和如果......else 陳述式
interface實施 . 介面概觀
insert_recordset 在單一伺服器行程中,將資料從一或多個資料表複製到一個產生的目的地資料表。 insert_recordset
int 指定類型 integer (32 位元) 的變數。 整數
整數64 指定類型 integer (64 位元) 的變數。 整數
interface 介面宣告。 介面概觀
is 詢問類別變數所參考的物件是否繼承自指定類別,或屬於指定類別。 例如,給定一個Derived擴展類別Base的類別,表達式(myDerived is Base)傳回 true。 這個關鍵字適用於類別繼承和表繼承。 運算式運算子:Is和As,用於繼承
加入 表格在兩個表格共用的資料行上聯結。 您可以使用聯結,根據多個資料表產生單一結果集。 選取陳述式語法
喜歡 依模式測試相符項,使用萬用字元符號 '*' 和 '?'。 關聯式運算子
max的 傳回子句所 group by 指定列中欄位的最大值。 選取陳述式語法
米諾夫 傳回子句所 group by 指定資料列中欄位的最小值。 選取陳述式語法
修改 傳回左 expression1 除以右 expression2 的整數餘數。 非正式地,這有時稱為模運算子。 (12 mod 7) == 5 是真的。
接線員。 建立類別的實例或為陣列配置記憶體。
next 擷取資料表中的下一筆記錄,或呼叫命令鏈序列中的下一個方法。
無取 表示現在要提取任何記錄。 選取陳述式語法
notExists 與陳述式中的join子句一起使用select 選取陳述式語法
象徵性常數。
樂觀鎖 強制陳述式以樂觀並行控制執行,即使在資料表上設定了不同的值也一樣。 選取陳述式語法
聲明中order by條款select的一部分。 選取陳述式語法
外部的 外部聯結 選取陳述式語法
pause 停止執行工作。 系統會要求使用者陳述是否應該繼續執行。 您不應該在生產程式碼中使用此陳述式。 選擇報表
悲觀鎖 強制陳述式以悲觀並行控制執行,即使資料表上設定了不同的值也一樣。 選取陳述式語法
print 允許您在螢幕上顯示輸出。 您不應該在生產程式碼中使用此陳述式。 列印陳述式
私人 方法存取修飾符。 該方法只能在宣告該方法的類別內使用。 方法存取控制
保護 方法存取修飾符。 此方法可以從宣告方法的類別中的方法使用,以及任何衍生類別中。 方法存取控制
public 方法存取修飾符。 可以從任何類別呼叫該方法。 方法存取控制
真實 real指定類型,即沒有捨入錯誤的十進位類型。 真實數
可重複讀取 指定在目前交易完成之前,其他交易都不能修改目前交易內邏輯已讀取的資料。 明確交易會在 ttsAbort 或最外層的 ttsCommit 完成。 對於獨立 select 陳述式,交易持續時間是 select 命令的持續時間。 不過,資料庫有時會在個別 select 陳述式中強制執行 repeatableRead 的對等專案,即使此關鍵字未出現在您的 X++ 程式碼中 (取決於資料庫決定掃描資料表的方式)。 如需詳細資訊,請參閱基礎關聯式資料庫產品的說明文件。
重試 用於異常處理。 使用 try 和 catch 關鍵字進行異常處理
從方法傳回。 方法聲明
反向 記錄會以相反的順序傳回。 選取陳述式語法
select select 句指定結果集中顯示哪些直欄或視圖。 選擇報表
伺服器 方法修飾符。 此修飾符會被忽略,並且不應該使用,因為所有方法都是在伺服器端執行的。 方法修飾詞
設定 update_recordset 指令一起使用。 update_recordset
靜態 靜態方法可能不引用實例變數(僅引用靜態變數);可以使用類別名稱來叫用,而不是在類別的實例上呼叫 (“MyClass.aStaticProcedure”)。 方法修飾詞
str 指定 string 類型。 字串
總和 傳回陳述式中group byselect句所指定列的欄位總和。 選取陳述式語法
超級 呼叫目前方法覆寫的方法。 表格方法
開關 Switch 陳述式。 Switch 陳述式
tableLock 過時; tableLock 不再可用。
對類別目前實例的參考。 用於類的實例方法內的 X++ 代碼。 用於 引用類別 的方法成員。
用於異常處理。 使用 try 和 catch 關鍵字進行異常處理
布林值字面值。 布林值
用於異常處理。 使用 try 和 catch 關鍵字進行異常處理
tts中止 回滾(即丟棄)當前交易中的所有更改。 交易完整性
tts開始 標記交易的開始。 交易完整性
tts提交 標示交易的結束,將變更認可至資料表。 交易完整性
update_recordset 允許在一個作業內操作列集。 update_recordset
validTime狀態 過濾由 X++ SQL select 陳述式從有效時間狀態表擷取的資料列。 例如: select validTimeState(myDateEffective) * from xMyTable; ...或。。。 select validTimeState(myDateFrom, myDateTo) * from xMyTable; 有效時間狀態表對讀取和寫入作業的影響
識別不傳回值的方法。 方法聲明
where 聲明的一部分 select 。 子 where 句會指定要滿足的條件,也就是您要包含在結果中的列。 選取陳述式語法
時間 Iteration 陳述式。 只要測試條件為真,就會重複執行陳述式。 While 迴圈 while select 陳述式
允許您更改輸出窗口的大小。 與生產程式碼中不建議的列印/列印<陳述式搭配使用>。 列印陳述式

運算式語法

X++ 中的表達式以數學或邏輯方式使用。 表達式是建立在語言的資料類型之上的;也就是說,運算式一律會傳回某種類型的值。 此值可用於計算、賦值、條件陳述式等。

X++ 中運算式的 EBNF 描述

術語   Definition
Expression = 簡單運算式 [RelationalOperator Simple-expression ]
關係運算子 = =
簡單表達式 = 簡單表達式 [ +
術語 = Compfactor { Mult-operator CompFactor }
多操作員 = *
比較因素 = [ ! ] [ -
因數 = Literal
Enum = EnumName :: 文字
Variable = 標識符 [ [ 表達式 ] ] [ . 表達方式 ]
函數呼叫 = [ 表達式 (.
如果運算式 = 詞? 表達 : 表達

語意限制適用於上述語法。 您無法使用 :: 運算子呼叫任何方法。 同樣地,您無法在沒有作用中物件的情況下使用 this 關鍵字;也就是說,如果您不在實例方法中,依此類推。

範例

表達式範例 Description
1 整數文字。
否是::否 列舉引用。
A 變數參考。
債務人::find(“1”) 靜態方法呼叫 (傳回客戶變數)。
(A > 3 ?真:假) 傳回 truefalse 的 if 運算式。
(選取 CustTable,其中 CustTable.Account == “100”)。名稱參考 選取運算式。 傳回客戶資料表中的 nameref 欄位。 這是一根字串。
A >= B 邏輯表達式。 傳回 truefalse
甲+乙 算術表達式。 總和 A 和 B。
A + B / C 計算 B/C,然後將其加到 A。
~A + 這個。值() 將二進位檔相加,而不是 A 和範圍 (this) 中物件上方法呼叫 Value 的結果。
debtor::find(“1”) 的 Debtor::Find(“1”) 。名稱參考 傳回找到的客戶記錄的 NameRef 欄位。
debtor::find(“1”) 的 Debtor::Find(“1”) 。餘額() 客戶資料表中 的方法 Balance 呼叫 (Debtor::Find 會傳回客戶)。 傳回帳號為 1 的客戶餘額。

EBNF 概覽

Extended Backus Naur Form (EBNF) 是一種元語言,在本指南中用於描述語言語法。 EBNF 定義由生產規則、非終端機及終端機組成。 關鍵術語如下表所示。

重要詞彙 Example Description
終端 Work_Team 終端機是一個字元或字串,永遠不會變更。
非終端 Employee 非終端是對由生產規則或文字描述定義的語言中有效句子部分的描述。 非終端符號一律可以擴充至一或多個終端符號。
製作規則 員工 = 開發人員 Tester

Example

Work_Team = 經理 員工 {, 員工} 員工 = 開發人員 |測試人員此範例將Work_Team定義為由 和 Manager 一或多個 Employees組成。 A Employee 被定義為 DeveloperTester。 下表說明範例中使用的符號。

EBNF 中的特殊符號

Symbol Description
表達) 括號將符號(端子和非端子)固定在一起。 它們可以放置在生產規則右側的任何位置。
運算式1 表達式2
[表達] 選用:[ 和 ] 之間的項目是選用的。 括號中的所有項目或不包括在內。
{表達式} 重複:{ 和 } 之間的項目是可選的,但可以視需要重複多次。

例如,如果您為自行車購買的配件由鞍座、水瓶架、鈴鐺和喇叭組成,並且您可以有一個鈴鐺或喇叭,以及零個、一個或多個水瓶架,以及一個鞍座,這可以表示為: Bicycle_Accessories = 鞍座 [bell | horn] {water_bottle_holders} 此語法定義了以下可能性: saddlesaddle bellsaddle horn 馬鞍water_bottle_holder馬鞍鈴 water_bottle_holder馬鞍鈴water_bottle_holder water_bottle_holder等等。

X++ 語法

本文展示了 X++ 語言的形式語法。

如何解釋形式 BNF 語法

本節介紹 Backus Naur 形式 (BNF) 中的 X++ 語法。 這裡描述了 BNF 的一個小例子。

AA ::= BB  CC_SYM
BB ::= JJ_SYM
   ::= KK_SYM

AA 是生產規則的名稱。 A AA 需要 , BB後面接著 CC_SYM。 A BB 也是一個生產規則。 因此, BB 不是終端。 BB 必須是JJ_SYM或KK_SYM。 JJ_SYM和KK_SYM都是終端機,因為它們不是任何其他生產規則的名稱。 CC_SYM也是一個終端。

在 BNF for X++ 語法中,大多數終端機都以 _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++ 語言參考