ניתוח תחבירי (parsing) wilhelm, and maurer – chapter 8 aho, sethi, and ullman –...
Post on 20-Dec-2015
227 views
TRANSCRIPT
(Parsingניתוח תחבירי )
Wilhelm, and Maurer – Chapter 8Aho, Sethi, and Ullman – Chapter 4Cooper and Torczon – Chapter 3
scanner generatorsymbol specification
Input program
scanner
symbol string
scanning table
: מפורמליזם לתוכנהscannerתזכורת – ה-
יתרונותהמפרט – קצר יחסיתאפשר לוודא שהמפרט תקיןהתוכנה קלה לתחזוקה
שימושים נוספים בקומפילציה ובשטחים generationלשיטת ה- נוספים
scannerscanning table
driver
parse generatorgrammar
tokens
parser
syntax tree
parsingמפורמליזם לתוכנה :
scannersהמתאר – דומה לזה של יצירת הפורמליזם והשיטות – שונים
הפורמליזם – דקדוק חסר הקשרהאמצעי – אוטומט מחסנית סופי
parsing tables
driver
parserparsing tables
טיפול בשגיאות – נושא חשוב
סוגי שגיאות)"שגיאות לקסיקליות )טעויות "דפוססוגרים לא מאוזנים(שגיאות תחביריות( )שגיאות סמנטיות )אופרנדים מטיפוס לא מתאים)שגיאות לוגיות )לולאה אינסופית
דרישותדיווח על שגיאות בצורה ברורה היחלצות מהירה משגיאות כך שאפשר יהיה לגלות שגיאות
המופיעות בהמשך-שימור יעילות הparser
גישות לטיפול בשגיאות
panic mode השמטת קטעים מהקלט עד מציאת אות – המשמשת לסינכרוניזציה )למשל ";"(
phrase-level recoveryנסיונות תיקון מקומיים – ";" החלפת "," ב
error productionטיפול במצבים מיוחדים, בשיטות דקדוקיות -
global correction יקר, לא פרקטי –
דקדוק חסר הקשר
G=(V, T, P, S)V – nonterminalsמשתנים ,
T – terminals ,טרמינלים ,tokens
Pחוקי גזירה –
P = V (V U T)*
Sמשתנה תחילי –
S V
דוגמא
סימון מלא
סימון מקוצר
V = {E, A}
T ={ ( , ) , - , id , +, - , , / , }
P =
{ E E A E
,A +,
E ( E ),A ‒,
E - E,A ,
E id,A /,A }
S =
E
E E A E | ( E ) | - E | id
A + | ‒ | | / |
דקדוק חסר הקשר - דוגמא
E → E A E | ( E ) | – E | idA → + | – | * | / | ^
שפה חסרת הקשר
– סדרה של החלפות של אותיות לא טרמינליות תוך שימוש גזירהבחוקי הגזירה
– אוסף ביטויים הנגזרים מהמצב התחילי והמכילים טרמינלים שפהבלבד
EE A E
id A E
id + E
id + id
הגזירה סימון
שפה חסרת הקשר
– סדרה של החלפות של אותיות לא טרמינליות תוך שימוש גזירהבחוקי הגזירה
– אוסף ביטויים הנגזרים מהמצב התחילי והמכילים טרמינלים שפהבלבד
– תוצאת סדרת גזירות בה (sentential formתבנית פסוקית )נותרו )אולי( לא-טרמינלים
E * id + E
– גזירה בה מוחלף בכל שלב הסימן השמאלי ביותר גזירה שמאלית)באופן דומה – גזירה ימנית(
שלבית רב גזירה
E
E EA
E
id
E A E
E
E A E
E
id +
E A E
E
id + id
דוגמא
נתון דקדוקS → a A c B eA → A b | bB → d
a b b c d eקלט – a b b c d e
נבחר בשמאלית
a A b c d eנבחר בשמאלית
a A c d e
a A c B e
A A B אלטרנטיבות 3
A
B
S
A B אלטרנטיבות 3
דוגמא
נתון דקדוקS → a A c B eA → A b | bB → d
a b b c d eקלט – a b b c d e
נבחר בשמאלית
a A b c d eנבחר בשמאלית
a A c d e
a A c B e
A A B אלטרנטיבות 3
A
B
S
A B אלטרנטיבות 3
דוגמא
נתון דקדוקS → a A c B eA → A b | bB → d
a b b c d eקלט – a b b c d e
נבחר בשמאלית
a A b c d eנבחר בשמאלית
a A c d e
a A c B e
A A B אלטרנטיבות 3
A
B
S
A B אלטרנטיבות 3
דוגמא
נתון דקדוקS → a A c B eA → A b | bB → d
a b b c d eקלט – a b b c d e
נבחר בשמאלית
a A b c d eנבחר בשמאלית
a A c d e
a A c B e
A A B אלטרנטיבות 3
A
B
S
A B אלטרנטיבות 3
דוגמא
נתון דקדוקS → a A c B eA → A b | bB → d
a b b c d eקלט – a b b c d e
נבחר בשמאלית
a A b c d eנבחר בשמאלית
a A c d e
a A c B e
A A B אלטרנטיבות 3
A
B
S
A B אלטרנטיבות 3
ביטוי רגולרי ודקדוק חסר הקשר
כל מבנה שניתן לבטא ע"י ביטוי רגולרי יכול להיות מתואר ע"י דקדוק
ההיפך לא נכון )למשל?(
אין "תורה מסיני" לגבי מה לשים במנתח הלקסיקלי ומה בדקדוק
, identifiersביטוים רגולרים שימושיים עבור תאור מבנים לקסיקלים כ- קבועים, מילות מפתח וכו'
דקדוקים שימושיים עבור מבנים מקוננים כסוגרים מאוזנים, התאמת begin-end'וכו ,
סוגי הניתוח התחבירי
כל דקדוק חסר-הקשר שקול לאוטומט מחסנית. אז למה שלא נבנה אוטומט מחסנית ונשתמש בו בתור מנתח
תחבירי?
– לכל דקדוק נבדוק את כל Cocke-Younger-Kasamiכללי: – אינו מעשיO(n3)האפשרויות...
המטרהפענוח ובנית עץ הגזירה תוך מעבר בודד על הקלט, משמאל לימין בכל שלב, הקלטw מתחלק ל x y
החלק שטרם נקרא חלק הקלט שקראנו
סוגי הניתוח התחבירי )המשך(
top-down – "מהשורש לעלים )נקרא גם – "ניתוח תחזית – predictive)
bottom-up מהעלים לשורש – מעבירים למחסנית, או מחליפים צד – (shift reduceימין בסימן מהצד השמאלי של חוק הדקדוק )
x y
s
x y
s
מתרגם דקדוק באופן הבא:Recursive Descentאלגוריתם עבור כלnonterminal.מגדירים פונקציה המנתח מתחיל לפעול מהפונקציה המתאימה
הראשון.nonterminalל-:כל פונקציה מחקה את החוק שעבורו הוגדרה, באופן הבא
terminalמהקלט.המתאים אסימון מתורגם לקריאת ה nonterminal מתורגם להפעלת הפונקציה המתאימה
לו. אם ישנם כמה חוקי גזירה עבור אותוnonterminal ,
.lookaheadבוחרים ביניהם בעזרת
Recursive Descent בעזרת top-downניתוח
matchפונקציית עזר:
void match(token t) {if (lookahead == t)
lookahead = next_token();else
error;}
פונקצייה זו משמשת כדי לקרוא טרמינלים.
בלבד.אסימון אחד הוא של lookaheadה-
כתיבת פונקציות בהתאם לדקדוק
למשל, עבור הדקדוק:
E → LIT | ( E OP E ) | not ELIT → true | falseOP → and | or | xor
OP ו-E, LITנגדיר שלוש פונקציות:
כתיבת פונקציות בהתאם לדקדוק
void E() {if (lookahead {TRUE, FALSE}) // E → LIT
LIT();else if (lookahead = LPAREN) // E → ( E OP E )
match(LPARENT); E(); OP(); E(); match(RPAREN);else if (lookahead = NOT) // E → not E
match(NOT); E();else
error;}
}
כתיבת פונקציות בהתאם לדקדוק
void LIT() {if (lookahead = TRUE)
match(TRUE);else if (lookahead = FALSE)
match(FALSE);else
error;}
כתיבת פונקציות בהתאם לדקדוק
void OP() {if (lookahead = AND)
match(AND);else if (lookahead = OR)
match(OR);else if (lookahead = XOR)
match(XOR);else
error;}
איך מחליטים?
, יש לבחור nonterminalאם יש כמה כללים שונים לאותו ביניהם.
יחיד.אסימון של lookaheadבדוגמה האחרונה הסתפקנו ב-
פורמלית:
ם שהאסימונים – רשימת הFIRST(α), נגדיר: A→αעבור כלל באחת או יותר גזירות אפשריות הנובעות מכלל זה.יםראשונ
:Eבדוגמה שלנו, עבור הכללים ל-FIRST(LIT) = { true, false }FIRST( ( E OP E ) ) = { ( }FIRST(not E) = { not }
איך מחליטים?
עבור הכללים FIRSTsאם אין חיתוך בין כל ה- נתון, אין כל בעיה.nonterminalהשונים ל-
אואם יש חיתוך... צריך לתקן את הדקדוק עמוק יותר.lookaheadלהשתמש ב-
בעיות
, או כללים המתחילים εאיך מתגברים על כללי-?εב-
מה קורה עם רקורסיה שמאלית?
E → E A E | ( E ) | – E | idA → + | – | * | / | ^
בעיות
, או כללים המתחילים εאיך מתגברים על כללי-?εב-
זו הופכת להיות ברירת המחדל.
מה קורה עם רקורסיה שמאלית?E → E A E | ( E ) | – E | idA → + | – | * | / | ^
מחליפים את הדקדוק. לכל דקדוק עם רקורסיה שמאלית יש דקדוק
מקביל בלעדיה.