표현식
날개셋 한글 입력기와 동일하게, 타닥은 C와 비슷한 문법을 사용하는 표현식을 통해 동작을 지정하고 오토마타 상태를 계산합니다. 예를 들어, 표준 두벌식 배열에서는 A 키에 다음의 표현식이 사용됩니다.
T < 2 ? H2|M_ : H2|_M한글 이어치기 오토마타의 초기 상태에는 다음의 표현식이 사용됩니다.
A ? 1 : B ? 2 : C ? 3 : 0자료형 및 리터럴
모든 값은 부호 있는 64비트 정수로 처리됩니다. 정수 리터럴을 입력하는 방법은 다음과 같습니다.
- 10진수: 아라비아 숫자
0~9를 사용하여 입력합니다. - 16진수: 맨 앞에
0x를 붙이고, 아라비아 숫자0~9와 로마자A~F(소문자도 가능)를 사용하여 입력합니다. - 문자: 작은따옴표
'를 제외한 문자 1개를 작은따옴표로 감싸 입력하면 그 문자의 유니코드 값이 사용됩니다. 별도의 탈출 문자는 없으며, 작은따옴표 자체의 코드를 나타내려면''를 입력합니다.
예를 들어, 44032, 0xAC00, '가'는 동일한 값을 각각 10진수, 16진수, 문자 리터럴로 나타낸 것입니다.
변수
변수에서 값을 읽어 오거나 값을 저장할 수 있습니다. 변수의 선언이나 초기화 없이, 로마자 대소문자 한 글자로 된 변수 총 52개(A~Z, a~z)를 사용할 수 있습니다. 변수의 초기값은 0입니다.
대문자 변수는 상태 변수로써 사용되며, 표현식이 평가되는 시점에 필요한 값이 지정됩니다. 따라서 (특정 상황을 제외하고) 대문자 변수는 값을 저장하는 용도로 사용해서는 안 됩니다. 소문자 변수는 입력기가 값을 직접 지정하지 않으므로, 값을 저장해야 하는 경우에는 소문자 변수를 이용하면 됩니다.
상수
동작 코드도 모두 부호 있는 64진수로 처리됩니다. 다만 표현식 작성 시 가독성을 높이기 위해 여러 상수를 사용합니다. 상수는 로마자 또는 언더스코어 _의 2~5자 조합으로 구성됩니다.
예를 들어, 두벌식 종성 ㄱ을 입력하기 위한 동작 코드는 16진수 리터럴로 나타내면 0x0002000100000000이지만, 상수를 사용하여 H2|_G로 나타낼 수 있습니다. 마찬가지로, 세벌식 초성 ㅆ과 중성 ㅙ를 동시에 입력하는 동작 코드는 16진수 리터럴로 0x0001000000170076이지만 상수를 사용하면 간단히 H3|SS|WAE로 표현됩니다.
사용할 수 있는 상수의 목록은 상수 일람에서 확인할 수 있습니다. 예시에서 볼 수 있듯 여러 상수를 조합할 때는 비트 OR 연산자 |를 사용합니다. 맥락 상 조합이 필요한 상수들끼리는 겹치지 않는 비트를 사용하기 때문입니다.
연산자
C와 거의 동일한 연산자를 사용합니다. 우선순위가 존재하며, 소괄호 ( )로 먼저 평가할 부분을 묶을 수 있습니다.
아래에 사용할 수 있는 연산자를 우선순위가 높은 순서대로 나열하였습니다. x와 y, z는 이해를 돕기 위해 피연산자를 나타낸 것으로, 연산자의 일부가 아닙니다. 조건 연산자와 대입 연산자, 복합 대입 연산자를 제외하고는, 우선 순위가 동일한 경우 왼쪽에서 오른쪽으로 결합합니다.
비트 NOT ~x, 논리 부정 연산자 !x, 부호 연산자 +x, -x
우선순위: 1
~는 피연산자를 이진수로 나타냈을 때 자리별로 비트를 반전합니다. 즉, 0인 자리는 1을, 1인 자리는 0을 지정한 값을 반환합니다.
!는 피연산자의 값이 참(0이 아닌 값)인 경우 0을, 거짓(0)인 경우 1을 반환합니다.
-는 부호를 반전하며, +는 특별한 역할을 하지 않습니다.
증감 연산자 x++, x--, ++x, --x
우선순위: 2 (후위형), 3 (전위형)
피연산자의 앞에 붙인 경우, 피연산자의 값을 1 중감시킨 후 변화된 값으로 이후의 평가를 진행합니다. 피연산자의 뒤에 붙인 경우 피연산자의 값을 1 증감시키지만, 이후의 평가는 증감 전의 값으로 진행됩니다.
산술 연산자 — 곱셈·나눗셈·모듈로 x * y, x / y, x % y
우선순위: 4
*는 곱셈을, /는 나눗셈을, %는 모듈로(나머지) 연산을 수행합니다. 나눗셈과 모듈로 연산의 경우 오른쪽 피연산자의 값이 0일 수 없습니다.
산술 연산자 — 덧셈·뺄셈 x + y, x - y
우선순위: 5
+는 덧셈을, -는 뺄셈을 수행합니다.
비트 이동 연산자 x << y, x >> y
우선순위: 6
<<는 오른쪽 피연산자에 지정된 값만큼 비트를 왼쪽으로 밀고, >>는 왼쪽으로 밉니다. 오른쪽 피연산자의 값이 음수일 수는 없습니다.
비교 연산자 x < y, x <= y, x >= y, x > y
우선순위: 7
각각 왼쪽 값이 오른쪽 값보다 작은지, 작거나 같은지, 크거나 같은지, 큰지 비교합니다. 참인 경우 1을, 거짓인 경우 0을 반환합니다.
상등 연산자 x == y, x != y
우선순위: 8
각각 왼쪽 값이 오른쪽 값과 일치하는지, 일치하지 않는지 비교합니다. 참인 경우 1을, 거짓인 경우 0을 반환합니다.
비트 연산자 — AND x & y
우선순위: 9
비트 AND 연산을 수행합니다. 두 피연산자의 이진수 표현을 자리별로 비교하여, 모두 1인 자리는 1로, 한쪽이라도 0인 자리는 0으로 계산한 값을 반환합니다.
비트 연산자 — XOR x ^ y
우선순위: 10
비트 XOR 연산을 수행합니다. 두 피연산자의 이진수 표현을 자리별로 비교하여, 서로 다른 자리는 1로, 서로 같은 자리는 0으로 계산한 값을 반환합니다.
비트 연산자 — OR x | y
우선순위: 11
비트 OR 연산을 수행합니다. 두 피연산자의 이진수 표현을 자리별로 비교하여, 한쪽이라도 1인 자리는 1로, 모두 0인 자리는 0으로 계산한 값을 반환합니다.
논리 연산자 — 논리곱 x && y
우선순위: 12
논리곱 연산을 수행합니다. 두 피연산자가 모두 0이 아니면 1을 반환하며, 한쪽이라도 0이면 0을 반환합니다.
논리 연산자 — 논리합 x || y
우선순위: 13
논리합 연산을 수행합니다. 두 피연산자 중 한쪽이라도 0이 아니면 1을 반환하며, 모두 0이면 0을 반환합니다.
조건 연산자 x ? y : z
우선순위: 14
x를 평가한 뒤, 참(0이 아닌 값)이 나오면 y로, 거짓(0)이 나오면 z로 분기합니다. 분기되지 않는 쪽의 표현식은 아예 평가되지 않습니다.
대입 연산자 x = y 및 복합 대입 연산자 x += y, x -= y, x *= y, x /= y, x %= y, x &= y, x ^= y, x |= y, x <<= y, x >>= y
우선순위: 15
x에 y의 값을 저장합니다. x를 평가한 결과는 반드시 변수여야 합니다. 이 연산자의 반환값은 y의 값입니다.
산술 연산자와 비트 연산자의 바로 뒤에 등호 =를 붙이면 복합 대입 연산자로 사용할 수 있습니다. x의 값과 y의 값으로 연산을 진행한 뒤, x에 그 값을 대입하고 이 값을 반환합니다.
쉼표 x, y
우선순위: 16
x를 평가한 뒤 y를 평가합니다. 반환값은 y를 평가한 결과입니다. C의 세미콜론 ;과 동일하게 여러 표현식을 한 줄에 넣으면서 각 표현식을 구분하기 위해 사용합니다.
형식 문법
BNF(Backus-Naur Form)로 기술한 문법은 [부록] BNF 문법에서 확인할 수 있습니다.