!"#$ %& '()*' ' +,-./) /) 0 #/) %,%, 12
$$(/3#/ " '$$(/34" '$$(//44 / 4 /4/ 4# ##4" 5-6/'$##/" 7#! a(a * b * )b regular expression ile önce bir a üretilir. Ardından iki durumdan birisine göre devam edilir. stenen sayıda a üretilir veya b üretilir. Son olarakta bir b üretilir.,-.%,-.8 3#(# 4#'/" 7#! a(a * b * )b regular expression ön kısım, orta kısım ve son kısım olarak ayrıtırılabilir. S dilde bir string ve M ise orta kısım olmak üzere S ambeklinde bir kural yazılabilir. Burada M, a lardan veya b lerden oluturulabilir. M A ve M B yeni iki kural, A ve B dile ait stringlerdir. A e, A aa ve B e, B bb a(a * b * )b regular expression tarafından oluturulan dil yukarıdaki kurallarla oluturulabilir. aaab string i aaıdaki gibi oluturulur; S amb, S aab (MA), S aaab (AaA), S aaab
+)4 4 0$)4$# /' 6*'## # /# " '$-.8#" S, A, B, M 0a, b, e # " 2' 3$ 4/" + / -63 / /" 2!,-.% Bir context-free grammar G = ( V,, R, S ) eklinde tanımlanır. V alfabe (terminal ve nonterminaller) terminaller ( V ) R kurallar ( V ) x V * S balangıç sembolü ( S ( V )) A V ve u V * için (A, u) R ise A G u yazabiliriz. u, v V * için u G v yazabiliriz sadece ve sadece x, y V * ve A V ve u= xay ve v= xv3y ve A G v3 ise
* G, G ilikisinin reflexive, transitive, closure udur. G grammar i tarafından oluturulan dil L(G) = {w * : S * G w} eklindedir. Kurallar uygulanarak dile ait tüm string ler elde edilebilir. Oluturulan L(G) dili context-free language olarak adlandırılır. A G u ve u G v yerine A u ve u v yazılabilir. w 0 G w 1 G... G w n derivation (türetme) olarak adlandırılır. w n string i w 0 dan türetilmitir. w 0,...,w n V * olabilir. n derivation length (türetme uzunluu) olarak adlandırılır.,-.% 7#! G = (V,, R, S) grammar i için V = {S, a, b}, ={a, b} ve R kümesi S asb ve S e olmak üzere iki tane kurala sahip olsun. Örnek bir derivation aaıdaki gibi olabilir: S asb aasbb aabb lk iki adımda S asb ve son olarak S e uygulanmıtır. Oluturulan dil L(G) = {a n b n : n 0} olmutur. Bazı context-free diller regular deildir, ancak tüm regular diller context-free dildir.
7#! G = ( W,, R, S ) grammar i için W = { S, A, N, V, P }, = { Jim, big, green, cheese, ate }, R = { P N, S = sentence P AP, A = adjective S PVP, V = verb A big, N = noun A green, P = phrase N cheese, N Jim, V ate } L(G) deki grammar olarak doru bazı string ler aaıdadır; Jim ate cheese big Jim ate green cheese big cheese ate Jim Bazı string ler anlamsız olabilir; big cheese ate green green big green big cheese green Jim ate green big Jim,-.% 9 (// 6 4 / 6 0 )/ ## #" 9 +4 #/#6 ))# # $-.8 3#/" 9 7#6-6 4 #8 " 9 6 /# -638/06 6 /# 6$-.8 388 /"
Örnek: Bütün programlama dillerindeki ortak bir kısmı oluturan bir dil tanımlayalım. Bu dil doru yazılmı aritmetik ifadeleri göstersin. id * (id * id + id) yazımı doru ancak * id + ( ve + * id yanlıtır. (id deiken adlarıdır) G = (V,, R, E) V = {+, *, (, ), id, T, F, E }, = {+, *, (, ), id}, R = { E E + T, (R1) E = expression E T, (R2) T = term T T * F, (R3) F = factor T F, (R4) F (E), (R5) F id } (R6),-.% Örnek: (devam) G grammar i (id * id + id) * (id + id) string ini aaıdaki gibi oluturur; E T (R2) T * F (R3) T * (E) (R5) T * (E + T) (R1) T * (T + T) (R2) T * (F + T) (R4) T * (id + T) (R6) T * (id + F) (R4) T * (id + id) (R6) F * (id + id) (R4) (E) * (id + id) (R5) (E + T) * (id + id) (R1) (E + F) * (id + id) (R4) (E + id) * (id + id) (R6) (T + id) * (id + id) (R2) (T * F + id) * (id + id) (R3) (F * F + id) * (id + id) (R4) (F * id + id) * (id + id) (R6) (id * id + id) * (id + id) (R6)
Örnek: Düzgün daılımlı sa ve sol parantezleri üreten bir grammar oluturalım. G = ( V,, R, S ) V = { S, (, ) }, = { (, ) }, R = { S e, S SS S (S)} Aaıdaki türetmeleri G grammar i oluturur; S SS S(S) S((S)) S(( )) ( )(( )) S SS (S)S ( )S ( )(S) ( )(( )),-.% Örnek: Bir DFA M = (K,, δ, s, F ) tarafından tanınan regular dil L(M), G(M) = (V,, R, S) grammar i tarafından oluturulabilir. Burada, V = K, S = s, R = { q ap : δ(q, a) = p} {q e : q F} Nonterminaller otomatın durumları ve a girii için yapılan q dan p ye geçi R içinde q ap eklinde bir kural olarak alınır. Yandaki otomat için oluturulan kurallar; S as, S ba, A ba, A ab, B as, B ba, B e.
9 5 $-.8" 9 $#/''$-.8" 9 5φ {a}/$-.8"+ $S a 4## " 9,-.80$$+ 4 #6" 9,-.86(: 8 "1(: 8 4 44#" 9 8 / 6#6(: #'4'''" 12 9 %$-.8 " /34 8#4#/" 9 6'/$-.84)#8#4# 3'" S SS S(S) (S)(S) (S)( ) ( )( ) S SS (S)S ( )S ( )(S) ( )( ) 9 ;#' 4)#4#*/" 4##" 9 </ /'" 9 =6# / /'" 9 =6#)$$)4'"
12 Bir context-free grammar G = ( V,, R, S ) için parse tree, roots, leaves aaıdaki gibi tanımlanır. 1. a Her a Σ için bu bir parse tree dir. Tek node hem root hemde yapraktır ve a oluturur. 2. A e, R içinde bir kural ise bu bir parse tree dir. A root ve e yapraktır. Sadece e üretir. 3. 12 Hepsi parse tree dir. n 1 için A 1,, A n root ve y 1,, y n üretilir. A A 1,,A n, R içinde kural ise aaıdaki parse tree dir. Üretilen string y 1 y n olur. 4. Bunların dıında hiçbir ey parse tree deildir.
12 Örnek: Aritmetik ifadeleri oluturan grammar in id * (id + id) için oluturduu parse tree aaıdaki gibidir. 12 Bir context-free grammar G = ( V,, R, S ) için D = x 1 x 2... x n ve D3 = x3 1 x3 2... x3 n iki farklı türetmedir. Burada x i, x3 i V * ve x 1, x3 1 V ve x n, x3 n * ki türetmede bir nonterminalden terminal string leri türetilir. D türetmesi D3 türetmesinden öncedir ve D D3eklinde gösterilir eer; n > 2 için 1 < k < n olacak ekilde bir k deeri varsa ve; 1. Tüm i k için x i = x3 i 2. x k-1 = x3 k-1 = uavbw burada u, v, w V * ve A, B V 3. x k = uyvbw, burada A y R 4. x3 k = uavzw, burada B z R 5. x k+1 = x3 k+1 = uyvzw En soldaki nonterminali deitiren türetme dierinden önce gelir.
12 Örnek: Herhangi bir grammar için aaıdaki üç türetmenin önceliklerini çıkaralım. D 1 = S SS (S)S ((S))S (( ))S (( ))(S) (( ))( ) D 2 = S SS (S)S ((S))S ((S))(S) (( ))(S) (( ))( ) D 3 = S SS (S)S ((S))S ((S))(S) ((S))( ) (( ))( ) Burada D 1 D 2 ve D 2 D 3 olur. D 1 D 3 olamaz çünkü birden fazla ara string te farklılık vardır. Bütün türetmeler aynı parse tree ye sahiptir. 12 Örnek: devam D 4 = S SS (S)S (S)(S) ((S))(S) (( ))(S) (( ))( ) D 5 = S SS (S)S (S)(S) ((S))(S) ((S))( ) (( ))( ) D 6 = S SS (S)S (S)(S) (S)( ) ((S))( ) (( ))( ) D 7 = S SS S(S) (S)(S) ((S))(S) (( ))(S) (( ))( ) D 8 = S SS S(S) (S)(S) ((S))(S) ((S))( ) (( ))( ) D 9 = S SS S(S) (S)(S) (S)( ) ((S))( ) (( ))( ) D 10 = S SS S(S) S( ) (S)( ) ((S))( ) (( ))( ) Buradaki tüm öncelik ilikileri aaıdaki ekille gösterilebilir.
12 Bir parse tree üzerinde leftmost derivation ve rightmost derivation elde edilebilir. Leftmost derivation için aacın root node undan balanır ve sürekli ensoldaki nonterminal deitirilir. Rightmost derivation için aacın root node undan balanır ve sürekli ensadaki nonterminal deitirilir. Önceki örnekte D 1 leftmost D 10 ise rightmost derivation yapar. 12 Leftmost derivation için x L y ve rightmost derivation için x R y kullanılır. x L y yazabiliriz eer sadece ve sadece x = wa, y = w, ise ve burada w * ve, V * ve A V ve A kuralı grammar de varsa. x 1 L x 2 L... L x n tüm leftmost türetme sırasını ifade eder.
7 1/ *''">">/0">">$0">">$ 8>? 1/ *''">"?0">" 8>? 1/ *''">"@ 8>?> 1/ *''"?"A 8>?B