logo

דקדוק ללא הקשר (CFG)

CFG מייצג דקדוק ללא הקשר. זהו דקדוק פורמלי המשמש ליצירת כל התבניות האפשריות של מחרוזות בשפה פורמלית נתונה. ניתן להגדיר דקדוק G נטול הקשר על ידי ארבעה טפולים כ:

 G = (V, T, P, S) 

איפה,

G הוא הדקדוק, המורכב מקבוצה של כלל הייצור. הוא משמש ליצירת מחרוזת של שפה.

ט הוא הסט הסופי של סמל מסוף. זה מסומן באותיות קטנות.

IN הוא הסט הסופי של סמל לא טרמינלי. זה מסומן באותיות גדולות.

פ הוא קבוצה של כללי ייצור, המשמשת להחלפת סמלים שאינם מסופים (בצד שמאל של הייצור) במחרוזת עם סמלים טרמינליים אחרים או שאינם מסוף (בצד ימין של הייצור).

עדכון מ- join sql

ס הוא סמל ההתחלה המשמש לגזירת המחרוזת. נוכל לגזור את המחרוזת על ידי החלפה חוזרת ונשנית של לא-טרמינל בצד ימין של הייצור עד שכל הלא-טרמינלים הוחלפו בסמלי טרמינל.

דוגמה 1:

בנה את ה-CFG עבור השפה שיש בה כל מספר של א' מעל הסט ∑= {a}.

פִּתָרוֹן:

כידוע הביטוי הרגולרי לשפה הנ'ל הוא

 r.e. = a* 

כלל ההפקה עבור הביטוי הרגולרי הוא כדלקמן:

 S → aS rule 1 S → ε rule 2 

עכשיו אם אנחנו רוצים לגזור מחרוזת 'aaaaaa', נוכל להתחיל עם סמלי התחלה.

 S aS aaS rule 1 aaaS rule 1 aaaaS rule 1 aaaaaS rule 1 aaaaaaS rule 1 aaaaaaε rule 2 aaaaaa 

שם. = a* יכול ליצור קבוצה של מחרוזת {ε, a, aa, aaa,.....}. יכול להיות לנו מחרוזת ריק כי S הוא סמל התחלה וכלל 2 נותן S → ε.

דוגמה 2:

בנה CFG עבור הביטוי הרגולרי (0+1)*

פִּתָרוֹן:

js מוגדר

ה-CFG יכול להינתן על ידי,

 Production rule (P): S → 0S | 1S S → ε 

הכללים הם בשילוב של 0 ו-1 עם סמל ההתחלה. מאז (0+1)* מציין {ε, 0, 1, 01, 10, 00, 11, ....}. בקבוצה זו, ε הוא מחרוזת, כך שבכלל, נוכל להגדיר את הכלל S → ε.

דוגמה 3:

בנה CFG עבור שפה L = כאשר w € (a, b)*.

פִּתָרוֹן:

המחרוזת שניתן ליצור עבור שפה נתונה היא {aacaa, bcb, abcba, bacab, abbcbba, ....}

הדקדוק יכול להיות:

hashtable לעומת hashmap
 S → aSa rule 1 S → bSb rule 2 S → c rule 3 

עכשיו אם אנחנו רוצים לגזור מחרוזת 'abbcbba', נוכל להתחיל עם סמלי התחלה.

 S → aSa S → abSba from rule 2 S → abbSbba from rule 2 S → abbcbba from rule 3 

לפיכך ניתן לגזור כל מחרוזת מסוג זה מכללי הייצור הנתונים.

דוגמה 4:

בנה CFG עבור השפה L = aנב2nכאשר n>=1.

פִּתָרוֹן:

המחרוזת שניתן ליצור עבור שפה נתונה היא {abb, aabbbb, aaabbbbbb....}.

הדקדוק יכול להיות:

 S → aSbb | abb 

עכשיו אם אנחנו רוצים לגזור מחרוזת 'aabbbb', נוכל להתחיל עם סמלי התחלה.

 S → aSbb S → aabbbb