이 글은 X++의 문법 참조를 제공합니다.
X++ keywords
다음 표는 예약된 X++ 키워드를 나열합니다. 이 키워드는 다른 용도로는 사용할 수 없습니다.
| Reserved word | Description | Related information |
|---|---|---|
| ! | Not. | Relational Operators |
| != | 같지 않음 연산자(같지 않음)입니다. | Relational Operators |
| # | 매크로 이름의 접두사입니다. | 방법: #define 및 #if 사용하여 매크로 테스트 |
| & | Binary AND. | Arithmetic Operators |
| && | Logical AND. | Relational Operators |
| ( | 함수 호출의 시작을 나타내는 함수 호출 연산자입니다. | |
| ) | 함수 호출의 끝을 나타내는 함수 호출 연산자입니다. | |
| * | Multiply. 별표(*)는 X++ SQL에서도 사용됩니다. 한 가지 용도는 문에 있는 테이블의 모든 필드를 나타내는 것입니다 select . 또 다른 사용은 연산자를 like 사용하여 모든 종류의 0~많은 문자를 나타내는 와일드카드로 사용됩니다. 연산자 like? 도 문자를 사용합니다. |
Arithmetic Operators |
| ^ | Binary XOR. | Arithmetic Operators |
| | | Binary OR. | Arithmetic Operators |
| || | Logical OR. | Relational Operators |
| ~ | Not. | Arithmetic Operators |
| + | Plus. | Arithmetic Operators |
| ++ | Increment. | Assignment Operators |
| += | Additive assignment. | Assignment Operators |
| , | Comma operator. 쉼표로 구분된 식은 순차적으로 왼쪽에서 오른쪽으로 계산됩니다. | |
| - | Minus. | Arithmetic Operators |
| -- | Decrement operator. | Assignment Operators |
| -= | Subtractive assignment. | Assignment Operators |
| . | 예를 들어 formRun.run 클래스 멤버 액세스 연산자는 run 클래스 형식의 개체 메서드에 액세스합니다 FormRun. |
|
| / | Divide. | Arithmetic Operators |
| \ | 문자열에서 이스케이프합니다. 추가 따옴표나 tab과 '\t' 같은 특정 문자를 피할 수 있습니다. |
|
| @ | 키워드의 이스케이프입니다. 예를 들어 다음 var @str = 1@abstract; 문자열을 @ 식별자로 간주하는 문자 없이 컴파일하지 못합니다. 또한 \ 이스케이프 문자의 효과를 부정하고 소스 코드에서 둘 이상의 줄에 걸쳐 문자열을 사용하도록 설정하여 리터럴 문자열에 영향을 줍니다. 새 줄은 일반적으로 줄 피드라고 하는 16진수 0x0A 한 문자로 표시됩니다. 0x0D0A 16진수 0x0D 캐리지 리턴 문자는 포함되지 않습니다. |
|
| : | 콜론(:) 문자는 문장에서 switch 대문자 값을 구분하는 데 사용됩니다. |
|
| :: | 정적(클래스) 메서드를 호출하는 데 사용되었습니다: ClassName::methodName() and to designate enumeration literals, like NoYes::Yes. |
|
| ; | Terminates statements. 루프 또는 for 이니셜라이저, 업데이트 및 값 검사 부분의 구분 기호로 사용됩니다. |
|
| < | Less than. | Relational Operators |
| << | Left shift. | Arithmetic Operators |
| <= | 작거나 같음 | Arithmetic Operators |
| = | Assignment operator. "="의 왼쪽에 있는 인수는 오른쪽에 있는 인수의 값으로 설정됩니다. | Assignment Operators |
| == | 식이 같으면 true를 반환합니다. | Relational Operators |
| > | Greater than. | Relational Operators |
| >= | 크거나 같음 | Relational Operators |
| >> | 비트 오른쪽 시프트입니다. 이 연산자는 왼쪽의 비트를 오른쪽의 양만큼 이동합니다. 각 교대조는 숫자를 2^n으로 효과적으로 나눕니다. 여기서 n은 이동된 위치의 수입니다. | Arithmetic Operators |
| ?: | Ternary operator. 물음표(?) 문자는 연산자가 어떤 종류의 문자든 정확히 한 자를 나타내는 데 사용됩니다 like . 연산자 like* 도 문자를 사용합니다. |
Ternary 연산자(?) |
| [ | 배열 선언자를 엽니다. "]"와 함께 사용해야 합니다. | |
| ] | 배열 선언자, 닫습니다. "["와 함께 사용해야 합니다. | |
| { | 0개 이상의 문을 포함할 수 있는 복합 문을 시작합니다. 복합 문은 가장 가까운 일치 "}"로 끝납니다. | |
| } | 위에서 설명한 복합 문의 끝을 나타냅니다. 이러한 문 중 첫 번째 문 앞에 "{"가 나타나야 합니다. | |
| abstract | 클래스 및 메서드 한정자입니다.
추상 클래스는 새 키워드를 사용하여 생성할 수 없습니다. 이 키워드에서 파생된 클래스만 생성할 수 있습니다.
추상 메서드는 호출할 수 없으며 재정의하는 메서드만 호출할 수 있습니다. 테이블은 AOT에서 추상 속성을 예로 설정하거나 클래스 DictTable 를 사용하여 추상으로 수정할 수 있습니다. 추상 속성은 기본적으로 No이며, 테이블에 다른 테이블이 추가되지 않는 한 설정할 수 없습니다. 추상 테이블의 각 행에는 파생 테이블에 종속 행이 있어야 합니다. 즉, 추상 테이블의 각 행은 InstanceRelationType 속성 필드에서 0보다 큰 값을 가집니다. 테이블을 추상으로 표시하는 다른 효과는 없습니다. 비공식적으로, 프로그래머들은 비추상적인 클래스를 설명할 때 콘크리트라는 용어를 자주 사용합니다. |
메서드 한정자 테이블 상속 개요 |
| anytype | 모든 형식의 값을 포함할 수 있는 형식입니다. | Anytype |
| as | 파생 클래스 변수에 기본 클래스 변수를 할당할 때 필요합니다. 예를 들어 클래스를 Derived확장하는 클래스가 Base 지정된 경우 문 myDerived = myBase as Derived; 은 as 키워드를 사용하여 컴파일러 오류를 방지합니다. 이 키워드는 파생 테이블 변수에 기본 테이블 변수를 할당할 때도 적용됩니다. 값(myBase)이 지정된 형식(파생)이 아닌 경우 식은 null을 반환합니다. |
식 연산자: Is 및 As for 상속 |
| asc | 문의 or order절에 대한 옵션bygroup입니다by.select 정렬이 오름차순입니다. |
Select 문 구문 |
| at | 인쇄 창의 위치를 문의 일부로 print 지정합니다. 인쇄 문을 사용하면 안 됩니다. |
Print Statements |
| avg | 문의 절에 지정된 행의 필드 평균을 group byselect 반환합니다. |
Select 문 구문 |
| break | 반복 코드 블록에서 즉시 종료합니다. | Break Statements |
| breakpoint | 디버깅을 위해 설정된 중단점을 나타냅니다. 코드에서 중단점을 설정하려면 다음을 작성합니다. breakpoint; |
|
| by | 그룹화 및 주문 기준과 같은 예약된 용어의 일부입니다. | |
| byref | 호출된 메서드에 전달되는 매개변수가 값이 아닌 참조(주소)로 전달되도록 지정합니다. Byref 는 참조로 매개 변수를 사용하는 .NET 메서드를 호출할 때 X++에서 사용됩니다(예: C# 키워드 out 또는 ref 사용). | 방법: CLR Interop에 byref 키워드를 사용합니다. |
| case | 문 내의 선택 영역입니다 switch . |
Switch Statements |
| catch | 예외 처리에 사용됩니다. | try 및 catch 키워드를 사용하여 예외 처리 |
| changeCompany | 데이터베이스 설정을 다른 회사로 변경합니다. | 회사 디자인 패턴 변경 |
| class | 클래스를 선언합니다. | X++의 클래스 |
| container | 형식을 container 지정합니다. 컨테이너에는 원자성 값 및 기타 컨테이너 시퀀스가 포함됩니다. |
Containers |
| continue | 루프의 다음 반복을 강제로 실행합니다. | Continue Statements |
| count | 문의 절 group by 에 지정된 select 행의 레코드 수를 반환합니다. |
Select 문 구문 |
| crossCompany |
select 사용자가 읽을 수 있는 권한이 있는 모든 회사에 대한 데이터를 반환하도록 명령문이 발생합니다. |
회사 간 X++ 코드 기본 사항 |
| date | 형식 date의 변수를 지정합니다. |
Dates |
| default | 문 내 switch 의 기본 사례입니다. 기본 부분의 코드 블록은 스위치 값이 문장에 제시된 switch 절들과 case 일치하지 않으면 실행됩니다. |
Switch Statements |
| delegate | 다른 클래스의 메서드에 대한 여러 참조를 저장하고, 요청 시 모든 메서드를 호출할 수 있는 클래스 멤버입니다. 대리자는 다음과 같은 다양한 메서드에 대한 참조를 저장할 수 있습니다: X++ 클래스의 정적 메서드; X++ 클래스의 인스턴스 메서드; .NET 프레임워크 클래스의 메서드. | 이벤트 용어 및 키워드 X++, C# 비교: 이벤트 |
| delete_from | 데이터베이스에서 기록을 삭제합니다. | delete_from |
| desc | 문의 or order by 절에 대한 옵션 group by 입니다select. 정렬이 내림차순입니다. |
Select 문 구문 |
| display | Method modifier. 메서드는 display 폼 컨트롤에서 계산된 값을 보여줍니다. 일반 필드와 달리 이 값들은 데이터베이스에 저장되지 않고 동적으로 계산됩니다. |
Method Modifiers |
| div | Integer division. | Arithmetic Operators |
| do | 루프의 시작입니다 do...while . |
Do...while Loops |
| edit | Method modifier.
edit X++의 메서드를 사용하면 사용자가 사용자 지정 논리를 실행하는 동안 양식 컨트롤의 값을 수정할 수 있습니다. 계산된 값만 보여주는 메서드와 달리 display , edit 메서드는 보기와 편집 모두를 가능하게 합니다. |
Method Modifiers |
| else | 조건부 실행(if...else).
else 만약 if 문장의 표현식이 로 평가될 false때 문장의 if 부분이 실행됩니다. |
if 및 if ... else 문 |
| eventHandler | 또는 연산자를 사용하여 += 대리자에서 메서드 참조를 추가하거나 -= 삭제할 때마다 사용해야 합니다. 예를 들어: myDelegate += eventHandler(OtherClass::myStaticMethod); |
이벤트 용어 및 키워드 X++, C# 비교: 이벤트 |
| exists | 문의 절과 join 함께 select 사용됩니다. |
Select 문 구문 |
| extends | 클래스 또는 인터페이스 선언 절입니다. 클래스가 다른 클래스를 명시적으로 확장하지 않는 경우 클래스는 "extends Object"를 작성한 것처럼 클래스를 확장하는 Object 것으로 간주됩니다. |
하위 클래스 만들기 |
| false | Boolean literal. | Booleans |
| final | 클래스 및 메서드 한정자입니다. 이 메서드를 재정의할 수 없게 지정합니다. | Method Modifiers |
| firstFast | 문에서 select 첫 번째 행에 대한 인출 속도를 높이기 위해 사용됩니다. |
Select 문 구문 |
| firstOnly | 문에서 select 첫 번째 레코드만 가져오는 데 사용됩니다. 키워드는 firstOnly X++ SQL select 문에 의해 최대 하나의 레코드가 검색되도록 보장하지 않습니다. AOS에서 캐시를 EntireTable 사용하여 문의 select 데이터 요구를 firstOnly 충족할 수 있는 경우 키워드는 무시됩니다. |
문 구문 집합 기반 캐싱 선택 |
| firstOnly10 | firstOnly와 동일하며, 1개 대신 10개의 행을 반환합니다. | |
| firstOnly100 | firstOnly와 동일하며, 1개 대신 100개의 행을 반환합니다. | |
| firstOnly1000 | firstOnly와 동일하며, 1개 대신 1,000개의 행을 반환합니다. | |
| flush | 전체 테이블 캐시를 지웁니다. 이 동작은 테이블에 변경된 모든 것이 이후 작업에 즉시 반영되도록 보장하고 싶을 때 유용할 수 있습니다. | Set-based Caching |
| for | 루프 반복의 경우 | For Loops |
| forceLiterals | 문에서 select 최적화 시 절에 where 사용된 실제 값을 Microsoft SQL Server 데이터베이스에 표시하는 데 사용됩니다. |
Select 문 구문 |
| forceNestedLoop | SQL Server 데이터베이스가 중첩 루프 알고리즘을 사용하여 을 포함하는 join특정 SQL 문을 처리하도록 합니다. |
Select 문 구문 |
| forcePlaceholders | 최적화 시 절에 select 사용된 실제 값을 Microsoft SQL Server 데이터베이스에 where 표시하지 않도록 커널에 지시하기 위해 문에 사용됩니다. |
Select 문 구문 |
| forceSelectOrder | SQL Server 데이터베이스가 지정된 순서로 조인된 테이블에 액세스하도록 합니다. | Select 문 구문 |
| forUpdate | 업데이트 전용 레코드를 선택합니다. 가져온 레코드에 대해 수행하는 연산은 업데이트입니다. 기본 데이터베이스에 따라 다른 사용자에게는 기록이 잠겨 있을 수 있습니다. | Select 문 구문 |
| from |
select 문의 일부입니다. 이 절은 from 열이 존재하는 테이블 버퍼를 지정합니다. |
Select 문 구문 |
| group | 문에 있는 group byselect 절의 일부입니다. |
Select 문 구문 |
| if | Conditional execution. | if 및 if ... else 문 |
| implements | 의 구현입니다 interface. |
Interfaces Overview |
| insert_recordset | 하나 이상의 테이블의 데이터를 단일 서버 이동에서 하나의 결과 대상 테이블에 복사합니다. | insert_recordset |
| int | 형식 integer 의 변수(32비트)를 지정합니다. |
Integers |
| int64 | 형식 integer 의 변수(64비트)를 지정합니다. |
Integers |
| interface | Interface declaration. | Interfaces Overview |
| is | 클래스 변수에서 참조하는 개체가 지정된 클래스에서 상속되는지 또는 지정된 클래스인지를 묻습니다. 예를 들어 클래스를 Derived확장하는 클래스를 Base 지정하면 식 (myDerived is Base) 이 true를 반환합니다. 이 키워드는 클래스 상속 및 테이블 상속에 적용됩니다. |
식 연산자: Is 및 As for 상속 |
| join | 테이블은 두 테이블에 공통된 열에 조인됩니다. 조인을 사용하여 여러 테이블을 기반으로 단일 결과 집합을 생성할 수 있습니다. | Select 문 구문 |
| like | 와일드카드 기호 '*' 및 '?'을 사용하여 패턴별 일치를 테스트합니다. | Relational Operators |
| maxof | 절에 지정된 행에서 필드의 최대값을 group by 반환합니다. |
Select 문 구문 |
| minof | 절에 지정된 행에서 필드의 최소값을 group by 반환합니다. |
Select 문 구문 |
| mod | 왼쪽 expression1의 정수 나머지를 오른쪽 식2로 나눈 값을 반환합니다. 비공식적으로 이를 모듈로 연산자라고도 합니다.
(12 mod 7) == 5 는 true입니다. |
|
| new | Operator. 클래스의 인스턴스를 만들거나 배열에 대한 메모리를 할당합니다. | |
| next | 테이블에서 다음 레코드를 가져오거나 명령 체인 시퀀스에서 다음 메서드를 호출합니다. | |
| noFetch | 지금 가져올 레코드가 없음을 나타냅니다. | Select 문 구문 |
| notExists | 문의 절과 join 함께 select 사용됩니다. |
Select 문 구문 |
| null | Symbolic constant. | |
| optimisticLock | 테이블에 다른 값이 설정되어 있더라도 낙관적 동시성 제어를 사용하여 문을 실행하도록 합니다. | Select 문 구문 |
| order | 문에 있는 order byselect 절의 일부입니다. |
Select 문 구문 |
| outer | outer join. | Select 문 구문 |
| pause | 작업의 실행을 중지합니다. 사용자에게 실행을 계속할지 여부를 지정하라는 메시지가 표시됩니다. 프로덕션 코드에서는 이 문을 사용하면 안 됩니다. | Select Statements |
| pessimisticLock | 테이블에 다른 값이 설정되어 있더라도 비관적 동시성 제어를 사용하여 문을 실행하도록 합니다. | Select 문 구문 |
| 화면에 출력을 표시할 수 있습니다. 프로덕션 코드에서는 이 문을 사용하면 안 됩니다. | Print Statements | |
| private | 메서드 액세스 한정자입니다. 메서드는 메서드를 선언하는 클래스 내에서만 사용할 수 있습니다. | 메서드 액세스 제어 |
| protected | 메서드 액세스 한정자입니다. 메서드를 선언하는 클래스의 메서드 및 파생 클래스에서 메서드를 사용할 수 있습니다. | 메서드 액세스 제어 |
| public | 메서드 액세스 한정자입니다. 메서드는 모든 클래스에서 호출할 수 있습니다. | 메서드 액세스 제어 |
| real |
real 반올림 오류 없이 10진수 형식인 형식을 지정합니다. |
Reals |
| repeatableRead | 현재 트랜잭션이 완료될 때까지 다른 트랜잭션이 읽는 데이터를 변경할 수 없음을 명시합니다. 명시적 트랜잭션은 ttsAbort 또는 가장 바깥쪽 ttsCommit에서 완료됩니다. 독립 실행형 select 문의 경우 트랜잭션 기간은 select 명령의 기간입니다. 그러나 데이터베이스가 X++ 코드에 이 키워드가 나타나지 않더라도(데이터베이스가 테이블을 검사하기로 결정한 방식에 따라) 개별 select 문에서 repeatableRead와 동일한 값을 적용하는 경우가 있습니다. | 자세한 내용은 기본 관계형 데이터베이스 제품에 대한 설명서를 참조하세요. |
| retry | 예외 처리에 사용됩니다. | try 및 catch 키워드를 사용하여 예외 처리 |
| return | 메서드에서 반환합니다. | 메서드 선언 |
| reverse | 레코드는 역순으로 반환됩니다. | Select 문 구문 |
| select | 이 절은 select 결과 집합에 표시되는 열 또는 뷰를 지정합니다. |
Select Statements |
| setting | 명령과 함께 update_recordset 사용됩니다. |
update_recordset |
| static | 정적 메서드는 인스턴스 변수를 참조할 수 없고(정적 변수만 참조할 수 있습니다). 클래스 이름("")을 호출하여 클래스 이름을MyClass.aStaticProcedure 호출할 수 있습니다. |
Method Modifiers |
| str | 형식을 string 지정합니다. |
Strings |
| sum | 문의 절에 지정된 group by 행에서 필드의 합계를 select 반환합니다. |
Select 문 구문 |
| super | 현재 메서드가 덮어쓰는 메서드를 호출합니다. | Table Methods |
| switch | Switch statement. | Switch Statements |
| tableLock | 되지 않는; tableLock 을 더 이상 사용할 수 없습니다. | |
| this | 클래스의 현재 인스턴스에 대한 참조입니다. 클래스의 인스턴스 메서드 내에서 X++ 코드에 사용됩니다. 클래스의 메서드 멤버를 참조하는 데 사용됩니다. | |
| throw | 예외 처리에 사용됩니다. | try 및 catch 키워드를 사용하여 예외 처리 |
| true | Boolean literal. | Booleans |
| try | 예외 처리에 사용됩니다. | try 및 catch 키워드를 사용하여 예외 처리 |
| ttsAbort | 현재 거래의 모든 변경 사항을 롤백(폐기)합니다. | Transaction Integrity |
| ttsBegin | 트랜잭션의 시작을 표시합니다. | Transaction Integrity |
| ttsCommit | 트랜잭션의 종료를 표시하며, 변경 사항을 테이블에 커밋합니다. | Transaction Integrity |
| update_recordset | 한 작업 내에서 행 집합을 조작할 수 있습니다. | update_recordset |
| validTimeState | X++ SQL select 문이 유효한 시간 상태 테이블에서 가져오는 행들을 필터링합니다. 예를 들어: select validTimeState(myDateEffective) * from xMyTable; ... 또는 ... select validTimeState(myDateFrom, myDateTo) * from xMyTable; |
읽기 및 쓰기 작업에 유효한 시간 상태 테이블의 효과 |
| void | 값을 반환하지 않는 메서드를 식별합니다. | 메서드 선언 |
| where |
select 문의 일부입니다. 이 절은 where 충족할 조건, 즉 결과에 포함할 행을 지정합니다. |
Select 문 구문 |
| while | Iteration statement. 테스트 조건이 true인 경우 문을 반복적으로 실행합니다. | 문을 선택하는 동안 반복하는 동안 |
| window | 출력 창의 크기를 변경할 수 있습니다. 프로덕션 코드에서 권장되지 않는 문과 함께 print 사용됩니다. |
Print Statements |
Expressions syntax
수학적 또는 논리적 연산을 위해 X++의 표현식을 사용하세요. 언어의 데이터 타입에 표현식을 만듭니다. 표현식은 항상 어떤 유형의 값을 반환합니다. 이 값을 계산, 할당, 조건문에 활용하세요.
X++에서 표현식의 EBNF 설명
| Term | Definition | |
|---|---|---|
| Expression | = | Simple-expression [RelationalOperator Simple-expression] |
| RelationalOperator | = | = |
| Simple-expression | = | 단순 표현식 [ + |
| Term | = | Compfactor { Mult-operator CompFactor } |
| Mult-operator | = | * |
| CompFactor | = | [ ! ] [ - |
| Factor | = | Literal |
| Enum | = | EnumName :: 리터럴 |
| Variable | = | 식별자 [ [ 표현 ] ] [ . Expression ] |
| FunctionCall | = | [ 식(. |
| If-expression | = | Expression ? 식: 식 |
앞선 문법에는 의미적 제한이 적용됩니다. 연산자를 :: 사용해서 어떤 메서드도 호출할 수 없습니다. 마찬가지로, 이 키워드를 사용할 때 활성 객체가 있어야 합니다. 그 객체는 인스턴스 메서드 내에 있어야 하고, 이런 식으로 계속됩니다.
Examples
| 식의 예 | Description |
|---|---|
1 |
정수 리터럴입니다. |
| NoYes::No | An enum-reference. |
A |
A variable-reference. |
| Debtor::Find("1") | 정적 메서드 호출(고객 변수 반환)입니다. |
| (A > 3 ? 참 : 거짓) | true 또는 false를 반환하는 if 식입니다. |
| (CustTable.Account == "100"인 CustTable을 선택합니다.) NameRef | A select-expression. 고객 테이블의 nameref 필드를 반환합니다. 문자열입니다. |
| A >= B | 논리 식입니다. true 또는 false를 반환합니다. |
| A + B | 산술 식입니다. 합계 A 및 B입니다. |
| A + B / C | B/C를 계산한 다음 A에 추가합니다. |
| ~A + 이것. Value() | A가 아닌 이진과 범위의 개체에 대한 메서드 호출 값의 결과를 합산합니다(이 값). |
| Debtor::Find("1").NameRef | 찾은 고객 레코드의 NameRef 필드를 반환합니다. |
| Debtor::Find("1").Balance() | 고객 테이블에서 메서드 호출 Balance (Debtor::Find는 고객을 반환합니다). 계정 번호가 1인 고객의 잔액을 반환합니다. |
EBNF overview
확장 백커스 나우르 형태(EBNF)는 메타언어입니다. 이 가이드는 언어 문법을 설명하는 데 사용합니다. EBNF 정의는 프로덕션 규칙, 비터미널 및 터미널로 구성됩니다. 다음 표는 주요 용어들을 보여줍니다.
| Key terms | Example | Description |
|---|---|---|
| Terminals | Work_Team | 터미널은 변경되지 않는 한 문자 또는 문자 문자열입니다. |
| Nonterminals | Employee |
비터미널은 프로덕션 규칙 또는 텍스트 설명에 의해 정의된 언어로 유효한 문장의 일부에 대한 설명입니다. 비터미널 기호는 항상 하나 이상의 터미널 기호로 확장할 수 있습니다. |
| Production rules | 직원 = 개발자 | Tester |
Example
Work_Team = 관리자 직원 {, Employee} 직원 = 개발자 | 테스터 이 예제에서는 Work_Team 하나 이상의 Manager구성 Employees 으로 정의합니다. An
EBNF의 특수 기호
| Symbol | Description |
|---|---|
| (Expression) | 괄호는 기호(터미널 및 비터미널)를 함께 포함합니다. 프로덕션 규칙의 오른쪽에 있는 모든 위치에 배치할 수 있습니다. |
| Expression1 | Expression2 |
| [Expression] | 선택 사항: [와] 사이의 항목은 선택 사항입니다. 대괄호 안에 있는 항목의 전부 또는 없음이 포함됩니다. |
| {Expression} | 반복: {와 } 사이의 항목은 선택 사항이지만 필요에 따라 여러 번 반복할 수 있습니다. |
예를 들어 자전거용으로 구매하는 액세서리가 안장, 물병 홀더, 종, 뿔로 구성되고 종이나 뿔, 0개, 1개 이상의 물병 홀더, 그리고 정확히 하나의 안장을 가질 수 있는 경우 다음과 같이 표현될 수 있습니다. Bicycle_Accessories = 안장 [종 | 혼] {water_bottle_holders} 이 문법은 다음과 같은 가능성을 정의합니다. saddlesaddle bellsaddle horn 안장 water_bottle_holder 안장 종 water_bottle_holder 안장 종 water_bottle_holder water_bottle_holder 등등.
X++ Grammar
이 문서에서는 X++ 언어의 공식 문법을 보여줍니다.
공식 BNF 문법을 해석하는 방법
이 섹션에서는 BNF(Backus Naur Form)의 X++ 문법에 대해 설명합니다. BNF의 작은 예는 여기에 설명되어 있습니다.
AA ::= BB CC_SYM
BB ::= JJ_SYM
::= KK_SYM
AA 는 프로덕션 규칙의 이름입니다. 다음에 AA 는 BBCC_SYM 필요합니다. A 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
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