[Compiler] 2.1. Regular Languages

이상윤·2024년 4월 24일

컴파일러

목록 보기
3/7

형식 언어(formal language)

범위 정의

Regular language ⊂ Context-free language ⊂ Context-sensitive language ⊂ Recursively enumerable language

언어 정의

  • Alphabet(Σ) : 기호들의 유한 집합
    Letter=ΣL={A,B,C,,Z,a,b,c,z}Letter = {\Sigma}^L = \{A,B,C,{\dots},Z,a,b,c,{\dots}z\}
    Digit=ΣD={0,1,2,,9}Digit = {\Sigma}^D = \{0,1,2,{\dots},9\}
  • String(s) : alphabet으로 구성된 유한 집합
    if Σ={0},s=0,00,000if \text{ } {\Sigma} = \{0\}, s=0,00,000\dots
    if Σ={a,b},s=a,b,aa,bb,ab,ba,aaa,aabif \text{ } {\Sigma} = \{a,b\}, s=a,b,aa,bb,ab,ba,aaa,aab\dots
    • Notation
      s|s| : s의 길이
      s1s2s_1 s_2 : 두 문자열 s1과 s2의 (순서 있는) 연속 합성. s1s2s_1 s_2s2s1s_2 s_1은 다르다.
      ϵ\epsilon: 빈 문자열
      sis^i: s의 지수연산, 즉 i번의 합성
  • language(L) : 어떤 alphabet으로 이루어진 string들의 유무한 집합
    if Σ={a,b},L1={a,ab,ba,aba} and L2={a,aa,b,ab,ba,aaa,}if \text{ } {\Sigma} = \{a,b\}, L_1 = \{a,ab,ba,aba\} \text{ and } L_2 = \{a,aa,b,ab,ba,aaa,\dots\}
    • Notation
      L1L2L_1 \cup L_2 : L1과 L2의 합집합
      L1L2L_1 L_2 : L1과 L2의 합성
      e.g. L1L2={ab,aaa,abb,abaa} s.t. L1={a,ab},L2={b,aa}L_1 L_2 = \{ab,aaa,abb,abaa\}\text{ s.t. }L_1 = \{a,ab\},L_2=\{b,aa\}
      LiL^i: L을 i번 합성
      LL^* : L을 0번 이상 합성
      L+L^+ : L을 1번 이상 합성

Regular Expression

기본 정규 표현의 연산으로 표현할 수 있으면 정규 표현이다

  • basic regular expreesion
    ϵ\epsilon : L(ϵ)={ϵ}L(\epsilon)=\{\epsilon\}
    aa : L(a)={a}, where a is a symbol in alphabet ΣL(a) = \{a\}\text{, where }a\text{ is a symbol in alphabet }\Sigma
    r1r2r_1|r_2 : L(r1r2)=L(r1)L(r2)L(r_1|r_2) = L(r_1)\cup L(r_2)
    (교환법칙, 결합법칙 성립)
    r1r2r_1r_2 : L(r1r2)=L(r1)L(r2)={s1s2s1L(r1),s2L(r2)}L(r_1r_2) = L(r_1)L(r_2) = \{s_1s_2 | s_1\in L(r_1), s_2\in L(r_2)\}
    (교환법칙 미성립, 결합법칙 성립, 분배법칙 성립)
    rr^* : L(r)=i0L(ri)L(r^*) = \bigcup_{i\geq 0}L(r^i)
    (이때, a=aa^{**} = a^*)

  • 연산 우선순위
    *,+ > 합성(concatenation) > union(|)

0개의 댓글