개요
Syntax란 프로그래밍 언어에서, 기호의 집합으로 구성된 statements혹은 expression을 의미한다. 이 syntax는 프로그래밍 언어의 문법을 구성한다. syntax는 위치정보와 기호를 통해서 (주로, 컴퓨터에서는 글자로 표현된다.) 표현된다. syntax는 프로그래밍 언어의 형태를 나타내며, Semantics와는 다르게 의미정보는 가지고 있지 않는다. Semantic정보가 처리되기 전에, 컴퓨터에 의해서 판단되는 정보가 syntax이다. 그러나, 특정 조건에서는 Semantic정보를 알아야 Syntax정보를 파악할 수 있는 경우도 존재한다.
Syntax의 정의
Syntax는 Regular expression과 Backus-Naur form에 의해서 정의되며 nonterminals와 terminal symbol로 구성된다. 여기서 terminal symbol은 불변의 값 상수나 표현식을 의미하며, nonterminal symbol은 terminal symbol의 합으로 구성되는 집합기호를 의미한다.
<기호> = <표현식>
에서 기호는 nonterminal, 표현식은 terminal의 집합이다.
Syntax의 종류
Concrete syntax
구체적 문법은 정확히 어떻게 프로그래머가 프로그램을 작성해야 할지를 지시한다. 예를 들어서 C에서는 두 함수를 더하는 구문을 +로 정의하여서 4 + 4
로 나타낼 수 있다. 그러나 이러한 구조를 새로운 언어에서는 다음과 같이 나태낼 수 도 있다. + 4 4
이처럼 구체적 문법은 프로그래머가 작성해야 하는 방식을 정의한다.
구체적 문법은 "특정 프로그램이 정의하는 프로그래머가 따라야 하는 규칙"이다.
expr ::= num
| "(" expr "+" expr ")"
| "(" expr "-" expr ")"
예를 들어서, Arithmetic operation의 구체적 문법은 다음과 같다.
expr ::= num
| "(" expr "+" expr ")"
| "(" expr "-" expr ")"
는 다음과 동일한 의미를 지닌다.
expr ::= num
| "{" "+" expr expr "}"
| "{" "-" expr expr "}"
즉 이처럼 구체적 syntax는 문법적 구조를 지니는 규칙이다.
Abstract syntax
요약 문법은 구체적 문법에서 공통으로 표현하는 것으로 표현하는 것을 의미한다. 구체적 문법과는 다르게 요약 문법에서는 symbol의 정의가 큰 의미가 없다. 대신 상징으로 다음과 같은 정의에서는 다음과 같은 문법이 도출된다는 Abtracted한 문법을 나타낸다. 즉 구체적 문법의 Abtraction이 요약 문법이다.
요약 문법 (추상 문법)은 추상화된 문법의 규칙이다.
예를 들어서, 위의 설명한 구체적 문법의 Arithmetic operation의 추상 문법은 다음과 같다.
- [math] n \in \mathbb{Z} \Rightarrow n \in A \\ e_1 \in A \wedge e_2 \in A \Rightarrow e_1 + e_2 \in A \\ e_1 \in A \wedge e_2 \in A \Rightarrow e_1 - e_2 \in A \\ [/math]
구체적 syntax를 수학적인 기호로 표현한 것이다. 이를 Inference rule로 표현하면 다음과 같다.
- [math]\begin{array}{c} {n \in \mathbb{Z}} \\\hline {n \in A} \end{array}[/math]
- [math]\begin{array}{c} {e_1 \in A \qquad e_2 \in A} \\\hline {e_1 + e_2 \in A} \end{array}[/math]
- [math]\begin{array}{c} {e_1 \in A \qquad e_2 \in A} \\\hline {e_1 - e_2 \in A} \end{array}[/math]