注释
社区兴趣团体现已从 Yammer 迁移到Microsoft Viva Engage。 若要加入 Viva Engage 社区并参与最新讨论,请填写 “请求访问财务和运营 Viva Engage 社区 ”表单,然后选择要加入的社区。
本文包含 X++ 的语法参考。
X++ 关键字
下表中显示的 X++ 关键字是保留的。 这些关键字不能用于任何其他目的。
| 保留字 | Description | 相关信息 |
|---|---|---|
| ! | 不。 | 关系运算符 |
| != | 不相等运算符(不等于)。 | 关系运算符 |
| # | 宏名称的前缀。 | 如何:使用 #define 和 #if 测试宏 |
| & | 二进制 AND。 | 算术运算符 |
| && | 逻辑 AND。 | 关系运算符 |
| ( | 函数调用运算符,指示函数调用的开头。 | |
| ) | 函数调用运算符,指示函数调用的末尾。 | |
| * | 乘。 星号 (*) 也用于 X++ SQL。 一个用途是表示语句上 select 表的所有字段。 另一种用法是运算符的 like 通配符,表示 0 到任何类型的许多字符。 运算符 like 还使用 ? 字符。 |
算术运算符 |
| ^ | 二进制 XOR。 | 算术运算符 |
| | | 二进制或。 | 算术运算符 |
| || | 逻辑或。 | 关系运算符 |
| ~ | 不。 | 算术运算符 |
| + | 加。 | 算术运算符 |
| ++ | 增加。 | 赋值运算符 |
| += | 累加赋值。 | 赋值运算符 |
| , | 逗号运算符。 用逗号分隔的表达式按顺序从左到右计算。 | |
| - | 减去。 | 算术运算符 |
| -- | 递减运算符。 | 赋值运算符 |
| -= | 减法赋值。 | 赋值运算符 |
| . | 例如, formRun.run 类成员访问运算符访问 run 类类型的 FormRun对象的方法。 |
|
| / | 分。 | 算术运算符 |
| \ | 在字符串中转义。 转义额外的引号,以及制表符的某些字母,如“\t”。 | |
| @ | 关键字的转义。 例如, var @str = 1@abstract; 如果没有导致其后面的任何字符串被视为标识符的 @ 字符,则无法进行编译。 它还通过否定 \ 转义字符的效果以及使字符串能够跨越源代码中的多行来影响文本字符串。 新行由十六进制0x0A的一个字符表示,这通常称为换行符。 不包括十六进制0x0D的回车符,如0x0D0A中所示。 | |
| : | 冒号 (:) 字符用于分隔语句中的 switch 大小写值。 |
|
| :: | 用于调用静态(class) 方法: ClassName::methodName()和指定枚举文本,例如 NoYes::Yes。 | |
| ; | Terminates 语句。 在循环中使用 for ,或用作初始值设定项、更新和值检查部分的分隔符。 |
|
| < | 小于。 | 关系运算符 |
| << | 左移。 | 算术运算符 |
| <= | 小于或等于。 | 算术运算符 |
| = | 赋值运算符。 “=”左侧的参数设置为右侧参数的值。 | 赋值运算符 |
| == | 如果表达式相等,则返回 true。 | 关系运算符 |
| > | 大于。 | 关系运算符 |
| >= | 大于或等于。 | 关系运算符 |
| >> | 按位右移。 此运算符将左侧的位移入右侧的量。 每个班次有效地将数字除以 2^n,其中 n 是移动的位置数。 | 算术运算符 |
| ?: | 三元运算符。 运算符还使用问号(like)字符来表示任何类型的一个字符。 该 like 运算符还使用该 字符。 |
三元运算符 (?) |
| [ | 数组声明符,打开。 必须与“]”一起使用。 | |
| ] | 数组声明符,关闭。 必须与“[”一起使用。 | |
| { | 启动复合语句,该语句可能又包含零个或多个语句。 复合语句以最接近的匹配“}”结尾。 | |
| } | 指示上述复合语句的末尾。 “{”必须出现在这些语句的第一个之前。 | |
| abstract | 类和方法修饰符。 不能使用新关键字构造抽象类 - 只有派生自它的类。 无法调用 抽象 方法,只能调用替代抽象方法的方法。 通过将表 的 Abstract 属性设置为 AOT 中的 “是 ”或使用该类,可以将表修改为 DictTable 抽象。
Abstract 属性默认为“否”,除非表由另一个表扩展,否则无法设置该属性。 抽象表中的每一行都必须在派生表中具有依赖行。 这意味着抽象表中的每一行在其 InstanceRelationType 属性字段中的值都大于零。 没有将表标记为抽象的其他效果。 非正式地,程序员经常使用 具体 术语来描述非抽象类。 |
方法修饰符表继承概述 |
| anytype | 可以包含任何类型的值的类型。 | Anytype |
| 如 | 将基类变量分配给派生类变量时需要。 例如,给定一个Derived扩展Base类的类,该语句myDerived = myBase as Derived;会通过使用 as 关键字来避免编译器错误。 将基表变量分配给派生表变量时,此关键字也适用。 如果值(myBase)不是指定类型(派生),则表达式返回 null。 |
表达式运算符:继承和继承方式 |
| asc | 语句中或order子句上的bygroupby选项。select 排序是升序的。 |
Select 语句语法 |
| at | 指定打印窗口作为语句的一 print 部分的位置。 不应使用 print 语句。 |
Print 语句 |
| avg | 从语句中group by子句指定的select行中返回字段的平均值。 |
Select 语句语法 |
| break | 立即退出迭代代码块。 | Break 语句 |
| 断点 | 表示为调试目的设置的断点。 若要在代码中设置断点,请编写: breakpoint; |
|
| 由 | 保留期限的一部分,如分组依据和排序依据。 | |
| byref | 指定传递给所调用方法的参数是通过引用(address)而不是按值传递的。 在 X++ 中调用采用参数的 .NET 方法时使用 Byref(例如,使用 C# 关键字传出或引用)。 | 如何:将 byref 关键字用于 CLR 互作。 |
| 案例 | 语句中的 switch 选定内容。 |
Switch 语句 |
| 抓住 | 用于异常处理。 | 尝试异常处理并捕获关键字 |
| changeCompany | 将数据库设置更改为另一家公司。 | 更改公司设计模式 |
| 类 | 声明类。 | X++ 中的类 |
| 客户 | 方法修饰符。 这些修饰符不再使用。 所有方法都在服务器层上执行。 | 方法修饰符 |
| 容器 | 指定 container 类型。 容器包含原子值和其他容器序列。 |
容器 |
| continue | 强制循环的下一次迭代。 | Continue 语句 |
| count | 返回语句中子句指定的 group by 行中的 select 记录数。 |
Select 语句语法 |
| crossCompany | 导致语句 select 返回用户有权读取的所有公司的数据。 |
跨公司 X++ 代码基础知识 |
| date | 指定类型的 date变量。 |
日期 |
| 默认 | 语句中的 switch 默认大小写。 如果 switch 值与语句中case提供的任何switch子句不匹配,则执行默认部件中的代码块。 |
Switch 语句 |
| delegate | 一个类成员,能够存储对其他类中方法的多个引用,并在系统提示时调用所有这些方法。 委托可以存储对各种方法的引用,包括:
|
事件术语和关键字 X++、C# 比较:事件 |
| delete_from | 允许从数据库中删除记录。 | delete_from |
| desc | 语句中或order by子句上的group byselect选项。 排序降序。 |
Select 语句语法 |
| 显示 | 方法修饰符。
显示</显示>方法用于在窗体控件中显示计算值。与常规字段不同,这些值不会存储在数据库中,而是动态计算。 |
方法修饰符 |
| div | 整数除法。 | 算术运算符 |
| 做 | 循环的 do...while 开头。 |
做。。。while 循环 |
| edit | 方法修饰符。
edit X++ 中的方法允许用户在执行自定义逻辑时修改窗体控件中的值。 与仅显示计算值的方法不同 display ,编辑方法支持查看和编辑。
|
方法修饰符 |
| else | 条件执行(if...else)。
else
if如果将 if 语句中的表达式计算为false |
if and if...else 语句 |
| eventHandler | 每次使用或运算符从委托添加或删除方法引用时都必须使用+=-=。 例如: myDelegate += eventHandler(OtherClass::myStaticMethod); | 事件术语和关键字 X++、C# 比较:事件 |
| 存在 | 与语句中的子句一join起使用select。 |
Select 语句语法 |
| 延伸 | 类或接口声明子句。 如果你的类未显式扩展另一个类,则你的类被视为扩展 Object 类(就像你已编写了“extends 对象”一样)。 |
创建子类 |
| 假 | 布尔文本。 | 布尔值 |
| 最后 | 类和方法修饰符。 指定无法重写此方法。 | 方法修饰符 |
| firstFast | 在语句中 select 用于加快第一行的提取速度。 |
Select 语句语法 |
| firstOnly | 在语句中 select 用于仅提取第一条记录。 关键字 firstOnly 不保证 X++ SQL select 语句最多检索一条记录。 如果 AOS 可以使用 EntireTable 缓存来满足语句的数据需求 select , firstOnly 则忽略关键字。 |
Select 语句语法基于集的缓存 |
| firstOnly10 | 与 firstOnly 相同,只返回 10 行而不是 1 行。 | |
| firstOnly100 | 与 firstOnly 相同,只返回 100 行而不是 1 行。 | |
| firstOnly1000 | 与 firstOnly 相同,只返回 1,000 行而不是一行。 | |
| flush | 清除整个表缓存。 如果要确保对表所做的任何更改立即反映在后续作中,这非常有用。 | 基于设置的缓存 |
| for | 用于循环迭代。 | For 循环 |
| forceLiterals | 在 select 语句中用于在优化时向Microsoft SQL Server 数据库显示子句中使用的 where 实际值。 |
Select 语句语法 |
| forceNestedLoop | 强制 SQL Server 数据库使用嵌套循环算法来处理包含 |
Select 语句语法 |
| forcePlaceholders | 在语句中 select 用于指示内核在优化时不向Microsoft SQL Server 数据库显示子句中使用的 where 实际值。 |
Select 语句语法 |
| forceSelectOrder | 强制 SQL Server 数据库按指定顺序访问联接中的表。 | Select 语句语法 |
| forUpdate | 仅选择用于更新的记录。 要对提取的记录执行的作是更新。 根据基础数据库,可能会为其他用户锁定记录。 | Select 语句语法 |
| from | 语句的一 select 部分。 该 from 子句指定列所在的表缓冲区。 |
Select 语句语法 |
| 组 | 语句中的子句的 group by 一 select 部分。 |
Select 语句语法 |
| 如果 | 条件执行。 | if and if...else 语句 |
| 实现 | 实现 .interface |
接口概述 |
| insert_recordset | 在单个服务器行程中将数据从一个或多个表复制到一个生成的目标表中。 | insert_recordset |
| int | 指定类型 integer 为 32 位的变量。 |
整数 |
| int64 | 指定类型 integer 为 64 位的变量。 |
整数 |
| interface | 接口声明。 | 接口概述 |
| is | 询问由类变量引用的对象是从给定类继承还是是给定类的对象。 例如,给定一个Derived扩展类的Base类,表达式(myDerived is Base)返回 true。 此关键字适用于类继承和表继承。 |
表达式运算符:继承和继承方式 |
| 加入 | 表联接在两个表通用的列上。 可以使用联接基于多个表生成单个结果集。 | Select 语句语法 |
| 喜欢 | 按模式测试匹配项,通配符为“*”和“?”。 | 关系运算符 |
| maxof | 从子句指定的 group by 行中返回字段的最大值。 |
Select 语句语法 |
| minof | 从子句指定的 group by 行中返回字段的最小值。 |
Select 语句语法 |
| 模组 | 返回左表达式 1 除以右表达式 2 的整数余数。 非正式地,这有时称为模数运算符。
(12 mod 7) == 5 为 true。 |
|
| 新增功能 | 算子。 创建类的实例或为数组分配内存。 | |
| next | 提取表中的下一条记录,或调用命令链序列中的下一个方法。 | |
| noFetch | 指示现在不会提取任何记录。 | Select 语句语法 |
| notExists | 与语句中的子句一join起使用select。 |
Select 语句语法 |
| 零 | 符号常量。 | |
| optimisticLock | 强制使用乐观并发控制运行语句,即使对表设置了其他值也是如此。 | Select 语句语法 |
| order | 语句中的子句的 order by 一 select 部分。 |
Select 语句语法 |
| 外 | 外部联接。 | Select 语句语法 |
| pause | 停止执行作业。 系统会要求用户说明是否应继续执行。 不应在生产代码中使用此语句。 | Select 语句 |
| pessimisticLock | 强制语句使用悲观并发控制运行,即使对表设置了其他值也是如此。 | Select 语句语法 |
| 允许在屏幕上显示输出。 不应在生产代码中使用此语句。 | Print 语句 | |
| 专用 | 方法访问修饰符。 方法只能在声明方法的类中使用。 | 方法访问控制 |
| 受保护 | 方法访问修饰符。 该方法可用于声明方法的类中的方法以及任何派生类中的方法。 | 方法访问控制 |
| 公共 | 方法访问修饰符。 可以从任何类调用该方法。 | 方法访问控制 |
| 真实 | 指定类型 real ,即不带舍入错误的十进制类型。 |
Reals |
| repeatableRead | 指定在当前事务完成后,其他任何事务都无法修改当前事务中逻辑读取的数据。 显式事务在 ttsAbort 或最外部 的 ttsCommit 处完成。 对于独立 select 语句,事务持续时间是 select 命令的持续时间。 但是,即使 X++ 代码中未显示此关键字(具体取决于数据库决定如何扫描表),数据库有时也会在单独的 select 语句中强制使用 repeatableRead 的等效项。 | 有关详细信息,请参阅基础关系数据库产品的文档。 |
| 重试 | 用于异常处理。 | 尝试异常处理并捕获关键字 |
| 返回 | 从方法返回。 | 方法声明 |
| 反向 | 记录按相反顺序返回。 | Select 语句语法 |
| select | 子 select 句指定结果集中显示哪些列或视图。 |
Select 语句 |
| 服务器 | 方法修饰符。 此修饰符将被忽略,不应使用,因为所有方法都在服务器端执行。 | 方法修饰符 |
| 设置 | 与 update_recordset 命令 一 起使用。 | update_recordset |
| 静态 | 静态方法不能引用实例变量(仅引用静态变量):可以使用类名而不是在类实例(“)MyClass.aStaticProcedure上调用。 |
方法修饰符 |
| str | 指定 string 类型。 |
字符串 |
| 总和 | 从语句中group by子句指定的select行中返回字段的总和。 |
Select 语句语法 |
| 超 | 调用由当前方法重写的方法。 | 表方法 |
| 开关 | Switch 语句。 | Switch 语句 |
| tableLock | 过时; tableLock 不再可用。 | |
| 这 | 对类的当前实例的引用。 在类的实例方法内的 X++ 代码中使用。 用于引用类 的方法 成员。 | |
| 扔 | 用于异常处理。 | 尝试异常处理并捕获关键字 |
| true | 布尔文本。 | 布尔值 |
| 尝试 | 用于异常处理。 | 尝试异常处理并捕获关键字 |
| ttsAbort | 回滚(即放弃)当前事务中的所有更改。 | 事务完整性 |
| ttsBegin | 标记事务的开头。 | 事务完整性 |
| ttsCommit | 标记事务的末尾,将更改提交到表。 | 事务完整性 |
| update_recordset | 允许在一个作中作行集。 | update_recordset |
| validTimeState | 筛选 X++ SQL select 语句从有效时间状态表检索的行。 例如: 从 xMyTable 中选择 validTimeState(myDateEffective) * ...或。。。 从 xMyTable 中选择 validTimeState(myDateFrom, myDateTo) * |
有效时间状态表对读取和写入作的影响 |
| 无效 | 标识不返回值的方法。 | 方法声明 |
| 哪里 | 语句的一 select 部分。 该 where 子句指定要满足的条件;即要包含在结果中的行。 |
Select 语句语法 |
| 而 | 迭代语句。 只要测试条件为 true,就重复执行语句。 | select 语句时的循环 |
| 窗 | 允许更改输出窗口的大小。 与生产代码中不建议使用的打印/打印<语句一起使用>。 |
Print 语句 |
表达式语法
X++ 中的表达式以数学或逻辑方式使用。 表达式基于语言的数据类型构建;也就是说,表达式始终返回某种类型的值。 此值可用于计算、赋值、条件语句等。
X++ 中的表达式的 EBNF 说明
| 术语 | Definition | |
|---|---|---|
| 表达式 | = | Simple-expression [RelationalOperator Simple-expression] |
| RelationalOperator | = | = |
| Simple-expression | = | Simple-expression [ + |
| 术语 | = | Compfactor { Mult-operator CompFactor } |
| Mult-operator | = | * |
| CompFactor | = | [ ! ] [ - |
| 因子 | = | Literal |
| Enum | = | EnumName :: Literal |
| Variable | = | Identifier [ [ 表达式 ] ] [ . 表达式 ] |
| FunctionCall | = | [ 表达式 (. |
| If-expression | = | 表达? 表达式:表达式 |
语义限制适用于上述语法。 不能使用 :: 运算符调用任何方法。 同样,不能在没有活动对象的情况下 使用此 关键字;也就是说,如果你不在实例方法中,则为此类。
例子
| 表达式示例 | Description |
|---|---|
1 |
整数文本。 |
| NoYes::No | 枚举引用。 |
A |
变量引用。 |
| 债务::Find(“1”) | 静态方法调用(返回客户变量)。 |
| (A > 3 ? true: false) | 返回 true 或 false 的 if-expression。 |
| (选择 CustTable.Account == “100”的 CustTable)。NameRef | select-expression。 返回客户表中的 nameref 字段。 这是一个字符串。 |
| A >= B | 逻辑表达式。 返回 true 或 false。 |
| A + B | 算术表达式。 对 A 和 B 求和。 |
| A + B /C | 计算 B/C,然后将其添加到 A。 |
| ~A + 这一点。Value() | 对范围中对象的方法调用值(此)的二进制值求和非 A 和结果。 |
| 债务::Find(“1”)。NameRef | 返回找到的客户记录的 NameRef 字段。 |
| 债务::Find(“1”)。余额() | 客户表中的方法调用 Balance (债务::查找返回客户)。 返回帐户号为 1 的客户余额。 |
EBNF 概述
Extended Backus Naur Form (EBNF) 是一种金属组织,在本指南中用于描述语言语法。 EBNF 定义由生产规则、非确定性和终端组成。 下表显示了关键术语。
| 关键术语 | Example | Description |
|---|---|---|
| 终端 | Work_Team | 终端是一个字符或一串永远不会更改的字符。 |
| 非终止 | Employee |
非终止是指由生产规则或文本说明定义的语言中有效句子的一部分的说明。 非终止符号始终可以扩展到一个或多个终端符号。 |
| 生产规则 | 员工 = 开发人员 | Tester |
Example
Work_Team = Manager Employee {, Employee} Employee = Developer |测试人员此示例将Work_Team定义为由一 Manager 个或多个 Employees组成。 一个 Employee 定义为一个 Developer或一个 Tester。 下表描述了本示例中使用的符号。
EBNF 中的特殊符号
| 符号 | Description |
|---|---|
| (表达式) | 括号将符号(终端和非终止符)一起保存。 它们可以放置在生产规则右侧的任意位置。 |
| Expression1 | Expression2 |
| [表达式] | 可选:[ 和 ] 之间的项是可选的。 括号中的所有或不包含任何项。 |
| {Expression} | 重复:{ 和 } 之间的项是可选的,但可以根据需要多次重复。 |
例如,如果你为自行车购买的配件由鞍、水瓶持有者、钟和角组成,并且你可以有一个钟或一个喇叭,以及零、一个或多个水瓶持有者,而正好是一个马鞍,这可能表示为:Bicycle_Accessories = 鞍 [钟 | 角] {water_bottle_holders} 此语法定义了以下可能性: saddlesaddle bellsaddle horn 鞍water_bottle_holder鞍铃water_bottle_holder鞍钟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。 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