모호성 해결
-
우선순위 부여 -> nonterminal 추가
-
결합법칙 -> 왼쪽 또는 오른쪽
구문트리 푸는 방법 정확히 알게 됌
(a+b)*c라고 한다면 a+b가 먼저 이루어져야 하므로 트리의 가장 하단부에 위치할 것이고 곱하기는 상단부에 위치할 것
추상구문트리 -> 기본적 비단말 기호 제거 + 괄호 같은 것들 불필요하니 제거 + 플러스 연산기호 같은 것들이 먼저 나오고 그 아래에 a와 b가 나오는 순서
EBNF
BNF + 메타심볼 -> 판독성 증가
BNF는 recursive한 표현이 어려움
메타기호
{} -> 임의 연속 처리
[] -> 선택적인 요소 선택 혹은 사용 안함
() -> 나열된 것 중 하나는 필히 사용
문법 cfg와 csg 비교
문맥자유문법(context-free) 문법
-
S-> aSb ab - L(S) = {a의n승 *b의 n승 >= 1}
문맥유관문법(context-sensitive) 문법
-
S -> abc aAbc - Ab -> bA
- Ac -> Bbcc
- bB -> Bb
-
aB -> aa aaA - L(s) = {a의 n승 * b의 n승 * c의 n승 >=1}
대표적 cfl과 csl (역순서 사례)
-
L1 = {wcw (오른쪽 w의 r승) w ∈ (a ∪ b)* } - ex) aabcbaa (가운데 기준 거울 대칭)
-
L2 = {wcw w ∈ (a ∪ b)* } -
ex) aabc aab -> 앞 뒤 일치 x
-
참고자료
프로그래밍 언어 개념 - 원유헌 저