Grammars: 두 판 사이의 차이
| 19번째 줄: | 19번째 줄: | ||
이때 Regular Grammar G가 정규언어와 정확히 동일한 클래스라는 것은 아래와 같은 의미이다: | 이때 Regular Grammar G가 정규언어와 정확히 동일한 클래스라는 것은 아래와 같은 의미이다: | ||
L is regular | L is regular | ||
<math>\ | <math>\Leftrightarrow L=L(G)</math> for some regular grammar G | ||
즉, 정규 언어와 정규 문법으로 생성 가능한 언어는 동일한 집합을 의미한다. | 즉, 정규 언어와 정규 문법으로 생성 가능한 언어는 동일한 집합을 의미한다. | ||
2025년 10월 18일 (토) 03:01 판
상위 문서: Regular Languages
개요
Grammar는 DFA나 NFA처럼 문자열을 소비하며 “인식(recognize)”하는 것이 아닌, 문자열을 생성(generate) 하는 시스템이다. 즉, grammar는 어떤 언어에 속하는 모든 문자열을 만들어내는 규칙들의 모음이다.
Classes of Grammars
문법은 아래와 같이 네가지로 구분된다:
- Unrestricted Grammar: 아무 제약이 없는 일반적인 형태
- Context-sensitive Grammar: 각 규칙에서 이다.
- 이는 규칙을 적용하는 과정에서 문자열의 길이가 줄어들지 않음을 의미한다.
- Context-free Grammar(CFG): 모든 규칙의 왼쪽이 단 하나의 비단말기라는 것을 의미한다.()
- 문맥과 상관없이 하나의 비단말기만 보고 규칙을 적용할 수 있다.
- PDA(푸시다운 오토마톤)과 동일한 계산 능력을 가진다.
- Regular Grammar: CFG보다 더욱 단순한 형태이다.
- 각 규칙은 또는 꼴이며, 오른쪽 끝에 비단말기가 올 수 있다.
- 이는 이름에서 짐작할 수 있듯이 정규언어와 정확히 동일한 클래스이다.
이때 Regular Grammar G가 정규언어와 정확히 동일한 클래스라는 것은 아래와 같은 의미이다:
L is regular for some regular grammar G
즉, 정규 언어와 정규 문법으로 생성 가능한 언어는 동일한 집합을 의미한다.
Definition of Grammars
Grammar는 아래와 같은 4-튜플()을 통해서 정의된다:
- : 비단말기(nonterminal symbols)의 유한 집합
- 예:
- 실제 문자열에 직접 등장하지는 않지만, 생성 과정에서 사용된다.
- : 단말기(terminal symbols) 의 유한 집합
- 예:
- 실제 언어의 문자열을 구성하는 기호들이며, 와 겹치지 않는다.
- : 규칙(rule)의 유한 집합
- 각 규칙은 형태이고,
- 은 최소 하나의 비단말을 포함해야 하며, 규칙은 단말을 단말이나 다른 비단말로 치환하는 역할을 한다.
- : 시작 기호(start symbol)
이때 두 집합 의 모든 기호를 섞어서 만들 수 있는 문자열 전체는 이다. 이는 sentential form이라고 불리며, 문법(Grammar)으로 문자열을 생성하는 과정에서 만들어지는 모든 문자열을 의미한다.
Derivations
문법을 사용해서 문자열을 생성하는 과정(derivation)은 아래와 같다:
- : “u가 v를 한 단계 유도한다.”
- 즉, 어떤 규칙 을 적용하여
인 문자열에서 을 로 바꾸면 가 된다. - 즉, 안의 한 비단말기를 규칙에 따라 다른 형태로 치환하여 를 얻는 것이다.
- 즉, 어떤 규칙 을 적용하여
또한, 주어진 규칙 내에서 여러번 규칙을 적용하여 문자열 를 얻을 수 있는데, 이를 기호로 나타내면 이다. 예를 들어, 와 같은 방식이다. 이를 통해 문법 G가 생성하는 언어 는 아래와 같이 정의된다:
Derivations Example 1
예를 들어, 아래와 같은 CFG 가 주어졌다고 가정하자:
위와 같은 grammar에서 문자열은 아래와 같이 유도된다:
즉, 같은 개수의 0과 1로 이루어진 문자열을 만들며, 이를 수식으로 표현하면 아래와 같다:
Derivations Example 2
아래는 수학식(expression)을 생성하는 CFG 이다:
위 문법은 수학적인 식을 계층적으로 정의한다:
- E (식)은 하나 이상의 항(T)의 덧셈으로 이루어짐
- T(항)은 하나 이상의 인자(F)의 곱셈으로 이루어짐
- F(인자)는 괄호친 식(E) 이거나 단일 변수 a
아래는 위의 산술식 문법을 실제로 적용하여 문자열을 생성하는 예시이다:
즉, 이 문법은 괄호, 곱셈, 덧셈을 포함한 올바른 산술식을 생성할 수 있다.
Leftmost Derivations
위의 예시들을 예리하게 살펴본다면, 하나의 문자열 여러 가지 유도 방법(derivations)을 가지고 생성할 수 있다는 것을 알 수 있다. 따라서 이러한 이런 “유도 순서의 차이”로 생기는 혼란을 없애기 위해, 항상 왼쪽에 있는 비단말기부터 확장하는 규칙을 사용하며, 이를 leftmost derivation(좌측 유도)이라고 한다.
예를 들어, 아래는 위의 산술식을 생성하는 grammar를 leftmost derivation을 사용하여 문자열 를 유도한 것이다:
Parse Trees
Parse Trees는 유도 과정을 트리(tree) 형태로 표현한 것이다. CFG에 대한 parse tree는 아래와 같은 특징을 가진다:
- CFG에 대한 parse tree는 ordered tree이다.
- Internal nodes는 비단말기이다.
- Leaf nodes들은 단말기이다.
- 각 internal nodes는 문법의 규칙 에 따라 자식 노드를 가지며, 자식 노드의 수는 과 같다.
예를 들어 CFG 가 아래와 같이 주어졌다고 가정하자.
위와 같은 grammar에 대해 문자열 를 유도하는 parse tree는 figure 1과 같다. 이때 하나의 leftmost derivation은 하나의 parse tree와 정확히 1:1로 대응한다. Figure 1에 나타난 유도과정은 아래와 같은 leftmost derivation과 대응된다:
Figure 2는 다르게 parse tree가 구성되었다면, 이와 대응되는 leftmost derivation또한 달라진다는 것을 보여준다.
Ambiguity
하나의 문자열을 생성할 때, 여러 개의 트리로 표현될 수 있다면 해당 문법은 “모호하다(ambiguous)”고 한다. 예를 들어, Figure 1, 2에 주어진 서로 다른 트리는 같은 문법을 통해 같은 문자열 를 서로 다른 순서를 통해 유도하는 것을 보여준다. 따라서 해당 문법은 모호하다.