프로그래밍 언어의 구조를 정의하는 규칙의 집합을 의미한다, Terminal Symbol,Non-Terminal Symbols, 생성 규칙, 시작 심볼의 네 가지 요소로 구성된다.
더 이상 다른 심볼로 분해될 수 없는 언어의 가장 기본적인 단위이다. 프로그래밍 언어에서 어휘(Lexeme)또는 토큰(Token)이라고도 불리며, 실제 소스 코드에 나타나는 키워드, 연산자, 숫자, 식별자 등이 해당된다.
다른 심볼들의 집합을 나타내는 추상적인 개념으로, 문장 구조나 문법적인 단위를 표현한다. 즉, 하나 이상의 terminal 심볼 또는 Non-terminal 심볼로 대체될 수 있는 변수와 같은 역할을 한다. 보통 꺾쇠(< >)로 묶어 표현한다.
<expression> (표현식): <term> + <term> 과 같이 더 작은 단위로 나뉠 수 있습니다.<statement> (문장): <if-statement>, <assignment-statement> 등으로 구체화될 수 있습니다.<term> (항): <factor> * <factor> 등으로 구성될 수 있습니다.Non-terminal 심볼이 어떻게 terminal 심볼이나 다른 Non-terminal 심볼의 조합으로 확장될 수 있는지 정의하는 규칙이다. 언어의 문법 구조를 구체적으로 명시하며, '->' 또는 '::=' 기호를 사용하여 표현한다.
예시
<assignment> → <identifier> = <expression>;
<assignment>)이 '식별자'(<identifier>), 등호(=), '표현식'(<expression>), 세미콜론(;)의 순서로 구선됨을 정의한다.<expression> → <expression> + <term>
모든 생성 규칙이 파생되기 시작하는 최상위 Non-terminal 심볼이다. 이는 문법적으로 올바른 프로그램 전체를 나타내는 가장 큰 개념의 시볼이며, 모든 유효한 문장 구조는 이 시작 심볼로부터 파생될 수 있어야 한다.
<program>: 프로그램 전체 구조를 나타내는 시작 심볼<compilation-unit>: 하나의 완전한 소스 파일을 의미하는 시작 심볼문법은 생성 규칙에 따라 촘스키 계층(Chomsky Hierarchy)이라는 4가지 유형으로 분류된다. 아래로 갈수록 규칙이 더 엄격해지고, 문법 구조는 단순해진다.
가장 일반적인 형태의 문법으로, 생성 규칙에 아무런 제약이 없다.
규칙 형태: α -> β
인식 기계: 튜링 기계 (Turing Machine)
특징: 너무 일반적이어서 실제 프로그래밍 언어를 분석하는 데 거의 사용되지 않는다.
규칙의 좌변(a)이 우변(b)으로 대체될 때,특정 문맥(Context) 안에서만 치환이 가능하도록 제약을 둔 문법이다.
규칙을 적용할 때 주변 문맥을 전혀 고려하지 않는 문법이다. 즉, Non-terminal 심볼 하나는 언제든지 규칙의 우변으로 대체될 수 있다.
가장 제약이 강하고 단순한 구조를 가진 문법이다. 규칙의 우변 형태가 매우 제한적이다.