구문 기술의 일반적인문제
• 언어의 구문 규칙은 언어의 알파벳으로부터 구성된 문자열들이 그 언어에 속하는지의 여부
• 어휘항목(lexeme) : 가장 낮은 수준의 구문 단위
• 수치 리터럴 (Numeric literal)
• 연산자 (Operator)
• 특수어 (Special word)
• 등등
• 어휘항목의 여러가지 그룹
• 식별자 (identifier) : 변수, 메소드, 클래스등의 이름
• 토큰 (token) : 어휘항목들에 대한 한 부류
• 예 : index = 2 * count + 17;
• 프로그램은 문자보다는 어휘항목들로 구성된 문자열들이라고 생각될 수 있다.
3.
Backus-Naur 형식과 문맥-자유문법
• 프로그래밍 언어에 속한 토큰들의 형태는 정규 문법으로 기술될 수 있
음
• 전채 프로그램 언어의 구문은 몇 가지 사항만 제외하면 문맥-자유 문법
으로 기술될 수 있음.
• Backus-Naur 형식의 기원
• 배커스-나우르 표기법(Backus–Naur form), 약칭 BNF는 문맥 무관 문법을 나타
내기 위해 만들어진 표기법이다. - 위키백과
• 1959년 국제 학술회의에서 John Backus에 의해 발표됨
• 1960년 Peter Naur에 의해 약간의 수정이 이루어짐
• Backus-Naur 형식 또는 BNF라고 불림
• BNF는 문맥 자유 문법이라 불림
4.
기본 원리
• 메타언어 : 다른 언어를 기술하는데 사용되는 언어
• BNF도 메타언어
• BNF는 구문 구조에 대해서 추상화를 사용한다.
• LHS(left-hand side) : 정의되고 있는 추상화
• RHS(right-hand side) : LHS의 정의,
토큰, 어휘 항목, 다른 추상화에 대한 참조로 구성
• 위의 정의를 규칙(rule) 또는 생성(production)이라고 부른다.
• 논 터미널 기호(non-terminal symbol) : 추상화
• 터미널 기호(terminal) : 규칙에 포함된 어휘 항목과 토큰
• BNF기술 또는 문법은 규칙들의 모임이다.
• 논 터미널 기호는 두 개 이상의 다른 정의를 가질 수 있음.
• OR (|)기호를 통해 구분됨
• 예) 단순 JAVA 배정문
• <assign>-><var>=<expression>
• 예) 위 예베의 규칙은 아래와 같이 나뉨
• 추상화 <var>의 사례
• 어휘항목 =
• <expression>의 사례
• 예) 변경전
• <if_stmt> -> if (<logic_expr>) <stmt>
• <if_stmt> -> if (<logic_expr>) <stmt> else <stmt>
• 예) 변경후
• <if_stmt> -> if (<logic_expr)>) <stmt>
| if (<logic_expr>) <stmt> else <stmt>
5.
리스트 명세
• 수학에서는가변 길이 리스트를 생략기호(…)를 통해 나타내지만,
BNF는 생략기호를 포함하지 않음
• 따라서 BNF는 재귀(recursive)를 이용해서 리스트를 나타냄
• LHS가 RHS 상에 나타나면 그 규칙은 재귀적이라고 함
• 예)
• <ident_list> -> identifier
| identifier, <ident_list>