정규 표현식은 간편하고, 표현력이 좋으며, 정확하고, 널리 사용되고 있다.
토큰들은 일반적으로 정규 표현식을 이용해서 표현된다.
정규 표현식은 다음 7가지와 같다.
1) 빈 공집합 :
2) 빈 문자열 :
3) 시그마 :
4) 과 이 정규표현식일 때, |
5) 과 이 정규표현식일 때, .
6) R이 정규표현식일 때, ()
7) R이 정규표현식일 때,
Yes.
규칙(5)에 따라서, "R1.R2"이다.
규칙(3)에 따라서, "a.R2"이다.
규칙(3)에 따라서, "a.b"이다.
Yes.
규칙(4)에 따라서, "R1|R2"이다.
규칙(3)에 따라서, "a|R2"이다.
규칙(3)에 따라서, "a|b"이다.
NO.
| 는 정규 표현식이지만, 는 정규 표현식이 아니다. 이것은 Set Operation 이기 때문에, 옳지 않다.
YES.
정규 표현식은 언어를 정의하는데, 언어는 '정규 표현식이 표현할 수 있는 모든 문자열의 집합'이다.
(1) L() =
을 이용하여 표현 가능한 모든 문자열은 이다.
(2) L() = {}
을 이용하여 표현 가능한 모든 문자열은 이다.
(3) L() = {a}, where is a
= a 일 때, 로 표현 가능한 모든 문자열은 a이다.
(4) L( | ) = {L() L()}
합집합 을 이용하여 표현 가능한 모든 문자열은 L() L() 이다.
(5) L( . ) = {L() . L()}
접합 을 이용하여 표현 가능한 모든 문자열은 {L() . L()} 이다.
✔️참고: 두 문자열 집합 A와 B에 대하여, A.B = {xy| x A and y B } 이다.
🌳주의사항
- Union은 [a b c] 와 같은 형식으로도 표현할 수 있다.
- Kleene Closure R+ 은 하나 이상으로, RR*과 같은 의미를 가진다.
- R?은 0 혹은 1을 의미한다.
✔️ L(a|b) = L(a) L(b) = {a} {b} = {a,b}
✔️ L(a|b|c) = L(a|b) L(b) = {a, b} {c} = {a, b, c}
✔️ L(a|) = L(a) L() = {a} {} = {a, }
✔️ L(|) = {}
💬 왜 {, } 이 아님?!
✔️ {} != {}
전자는 원소가 하나인 집합이고, 후자는 공집합이다.
✔️ a == a 인가?!
Yes. 는 빈 문자열이기 때문에 제거 가능하다. a = a = a이다.
✔️ L(a.b)로 생성 가능한 문자열?!
L(a.b) = L(a).L(b) = {a}.{b} = ab
✔️ L((a|b).c) 로 생성 가능한 문자열?!
L((a|b).c) = L(a|b).L(c) = (L(a)L(b)).L(c) = ({a} {b}).L(c) = {a,b}.{c} = {ac, bc}
✔️ L(a|b*) 으로 만들어낼 수 있는 string은 무엇이 있는가?
L(a)UL(b*) = {a}U{, b, bb, bbb ... } = {a, , b, bb, bbb...}
✔️ L((a|b)*) 으로 만들어낼 수 있는 string은 무엇이 있는가?
L((a|b)*) = L({a,b}*) = {, a, b, aa, ab, ba, bb, aaa, aab, aba, abb, baa, bab, bba, bbb ... }
✔️ L(a.b*)으로 만들어낼 수 있는 string은 무엇이 있는가?
L(a.b*) = L(a).L(b*) = {a}.{, b, bb, bbb.. } = {a, ab, abb, abbb ... }
✔️ A = {aa, b} B = {a, b} 일 때 L(A.B) = L(A).L(B) = {aa,b}.{a,b} = {aaa, aab, ba, bb}
💬 ab도 L(A.B)에 속하나?! 안 속할듯
✔️ A = {aa, b, }, B = {a, b} 일 때 L(A.B) = {?!}
💬 답 = L(A.B) = L(A).L(B) = {aa, b, }.{a, b} = {aaa, aab, ba, bb, a, b} = {aaa, aab, ba, bb, a, b} 맞나 ?!
* > . > |
✔️ L(a|b.c)는 a|(b.c) 를 의미한다.
✔️ L(a|b.c) = L(a|L(b).L(c)) = L(a|{b}.{c})
= L(a|{bc}) = L(a) {bc} = {a, bc}
✔️ L(a.b|c) = L(ab | c)
✔️ L((R)) = L(R)
✔️ L((a|b).c) = L(a|b).L(c) = {a,b}.{c} = {ac, bc} 처럼 괄호가 . 보다 높은 우선 순위를 가진다.
✔️ 괄호를 'symbols'로서 사용하고 싶으면 escape sequence를 사용하여 \(, \) 로 사용할 수 있다.
L() = {} L() L().L() L().L().L() L().L().L().L() ...
() = {}
() = ().()
() = ()
💬 = a 인데 = aa* 인게 맞나?
(단, 010- 으로 시작한다고 가정)
But "12-1-1" 같은 경우도 포함된다.
But "111-1111-1111"도 포함
regular expression => regular expression equation
x -> a | b => x = a + b
y -> c | d => y = c + d
z -> e | f => z = e + f
R1 = {a} R2 = {b}
R1 U R2 = {a, b}
=> 불가능하다. 2digit인 aa, ab, ba, bb 는 Union으로 만들 수 없기 때문 !
program = statement*
statement = statement PLUS statement | NUM | parenthesis
parenthesis = (statement)