אנגליתצרפתיתספרדי

Ad


סמל OnWorks

yaccposix - מקוון בענן

הפעל את yaccposix בספק אירוח בחינם של OnWorks על אובונטו מקוון, פדורה מקוון, אמולטור מקוון של Windows או אמולטור מקוון של MAC OS

זוהי הפקודה yaccposix שניתן להפעיל בספק האירוח החינמי של OnWorks באמצעות אחת מתחנות העבודה המקוונות המרובות שלנו, כגון Ubuntu Online, Fedora Online, אמולטור מקוון של Windows או אמולטור מקוון של MAC OS

תָכְנִית:

שֵׁם


yacc - מהדר נוסף (התפתחות)

תַקצִיר


יאק [−dltv] [prefix_file] [-עמ' sym_prefix] דקדוק

תיאור


אל האני יאק כלי השירות יקרא תיאור של דקדוק נטול הקשר ב דקדוק וכתוב ג
קוד מקור, התואם לתקן ISO C, לקובץ קוד, ולחלופין לכותרת
מידע לתוך קובץ כותרת, בספרייה הנוכחית. קוד המקור שנוצר יהיה
לא תלוי בהתנהגות לא מוגדרת, לא מוגדרת או מוגדרת יישום, למעט ב
מקרים שבהם הוא מועתק ישירות מהדקדוק שסופק, או במקרים כאלה
מתועד על ידי היישום. קוד C יגדיר פונקציה ושגרות קשורות
ופקודות מאקרו עבור אוטומט שמבצע אלגוריתם ניתוח העומד בדרישות ב
אלגוריתמים.

הצורה והמשמעות של הדקדוק מתוארות בסעיף תיאור מורחב.

קוד המקור וקובץ הכותרת של C יופקו בצורה המתאימה כקלט עבור ה-C
מהדר (ראה c99).

אפשרויות


אל האני יאק כלי השירות יתאים לנפח הגדרות הבסיס של POSIX.1-2008, סעיף
12.2, שירות תחביר הנחיות, למעט הנחיה 9.

האפשרויות הבאות יתמכו:

prefix_file
השתמש prefix_file במקום y בתור הקידומת לכל שמות קבצי הפלט. הקוד
פילה y.tab.c, קובץ הכותרת y.tab.h (נוצר כאשר צוין), ואת
קובץ תיאור y.output (נוצר כאשר −v צוין), ישונה ל
prefix_file.tab.c, prefix_file.tab.h, ו prefix_file.תְפוּקָה, בהתאמה.

כתוב את קובץ הכותרת; כברירת מחדל נכתב רק קובץ הקוד. ה #define
הצהרות מקשרות את קודי האסימון שהוקצו על ידי יאק עם המוצהר על ידי המשתמש
שמות אסימונים. זה מאפשר קבצי מקור אחרים מאשר y.tab.c כדי לגשת לאסימון
קודים.

−ל הפק קובץ קוד שאינו מכיל #קַו בונה. אם אפשרות זו
אינו קיים, לא מצוין אם קובץ הקוד או קובץ הכותרת מכילים
#קַו הנחיות. יש להשתמש בזה רק לאחר הדקדוק והדבר הקשור אליו
פעולות מנופות באגים באופן מלא.

-עמ' sym_prefix
השתמש sym_prefix במקום yy בתור הקידומת לכל השמות החיצוניים שהופקו על ידי
יאק. השמות המושפעים יכללו את הפונקציות yyparse(), yylex(), ו
yyerror(), והמשתנים yylval, yychar, ו yydebug. (בשארית
בסעיף זה, ששת הסמלים שצוטטו מופנים באמצעות שמות ברירת המחדל שלהם
רק כנוחות סימון.) שמות מקומיים עשויים גם להיות מושפעים מה- -עמ'
אוֹפְּצִיָה; אולם, ה -עמ' האופציה לא תשפיע #define סמלים שנוצרו על ידי
יאק.

−ת שנה הנחיות קומפילציה מותנית כדי לאפשר קומפילציה של ניפוי באגים
קוד בקובץ הקוד. הצהרות איתור באגים בזמן ריצה תמיד יהיו כלולים ב
את קובץ הקוד, אבל כברירת מחדל, הנחיות הידור מותנות מונעות את זה
הַהדָרָה.

−v כתוב קובץ המכיל תיאור של המנתח ודיווח על התנגשויות
נוצר על ידי אי בהירות בדקדוק.

אופרנדים


נדרש האופרנד הבא:

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

STDIN


לא בשימוש.

קלט קבצים


הקובץ דקדוק יהיה קובץ טקסט בפורמט כפי שצוין בתיאור המורחב
סָעִיף.

הסביבה וריאציות


משתני הסביבה הבאים ישפיעו על הביצוע של יאק:

שפה ספק ערך ברירת מחדל עבור משתני הבינאום שאינם מוגדרים או
ריק. (ראה את הכרך של הגדרות הבסיס של POSIX.1-2008, סעיף 8.2,
בינאום משתנים בעד הבכורה של בינאום
משתנים המשמשים לקביעת הערכים של קטגוריות מקומיות.)

LC_ALL אם מוגדר לערך מחרוזת לא ריקה, עוקף את הערכים של כל האחרים
משתני בינאום.

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

LC_MESSAGES
קבע את המקום שבו יש להשתמש כדי להשפיע על הפורמט והתוכן של
הודעות אבחון שנכתבו לפי שגיאת תקן.

NLSPATH קבע את המיקום של קטלוגי הודעות לעיבוד של LC_MESSAGES.

אל האני שפה ו LC_* משתנים משפיעים על ביצוע ה- יאק שירות כאמור. ה ראשי()
פונקציה מוגדרת ב יאק סִפְרִיָה יתקשר:

setlocale(LC_ALL, "")

ובכך התוכנית שנוצרה על ידי יאק יושפע גם מהתוכן של אלה
משתנים בזמן ריצה.

אסינכרוני אירועים


בְּרִירַת מֶחדָל.

STDOUT


לא בשימוש.

STDERR


אם מתגלים התנגשויות הסט/הפחתות או צמצום/צמצום ב דקדוק, יאק יכתוב א
דיווח על התנגשויות אלה לשגיאה הסטנדרטית בפורמט לא מוגדר.

שגיאה סטנדרטית תשמש גם עבור הודעות אבחון.

תפוקה קבצים


קובץ הקוד, קובץ הכותרת וקובץ התיאור יהיו קובצי טקסט. כולם כן
המתואר בסעיפים הבאים.

קופונים שלח
קובץ זה יכיל את קוד המקור C עבור ה yyparse() פונקציה. זה יכיל
קוד עבור הפעולות הסמנטיות השונות עם החלפת מאקרו שבוצעה עליהן כ
המתואר בסעיף תיאור מורחב. הוא יכיל גם עותק של #define
הצהרות בקובץ הכותרות. אם %הִתאַחֲדוּת נעשה שימוש בהצהרה, ההצהרה עבור
YYSTYPE ייכלל גם בקובץ זה.

כותרת שלח
קובץ הכותרות יכיל #define הצהרות שמשייכות את המספרים האסימונים ל-
שמות אסימונים. זה מאפשר לקבצי מקור שאינם קובץ הקוד לגשת לקודי האסימון.
אם %הִתאַחֲדוּת נעשה שימוש בהצהרה, ההצהרה עבור YYSTYPE ו-an חיצוני YYSTYPE yylval
גם הצהרה תיכלל בתיק זה.

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

מורחבים תיאור


אל האני יאק הפקודה מקבלת שפה המשמשת להגדרת דקדוק לשפת יעד
לנתח על ידי הטבלאות והקוד שנוצר על ידי יאק. השפה המקובלת על ידי יאק בתור
דקדוק עבור שפת היעד מתואר להלן באמצעות ה יאק שפת הקלט עצמה.

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

בהינתן דקדוק, ה יאק כלי השירות מייצר את הקבצים המתוארים ב-OUTPUT FILES
סָעִיף. ניתן להרכיב ולקשר את קובץ הקוד באמצעות c99. אם ההצהרה ו
קטעי תוכניות בקובץ הדקדוק לא כללו הגדרות של ראשי(), yylex(), ו
yyerror(), הפלט המהודר דורש קישור עם גרסאות שסופקו חיצונית של אלה
פונקציות. גרסאות ברירת מחדל של ראשי() ו yyerror() מסופקים ב- יאק ספרייה ו
ניתן לקשר באמצעות ה- −ל y אופרנד ל c99. ה יאק ממשקי ספרייה לא צריכים
תמיכה בממשקים עם לא ברירת המחדל yy קידומת סמל. האפליקציה מספקת
פונקציית הניתוח המילוני, yylex(); ה לקס כלי השירות תוכנן במיוחד ל
ליצור שגרה כזו.

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

הקלט הוא טקסט חופשי בהתאם למבנה הדקדוק המוגדר להלן.

לֵקסִיקָלִי מִבְנֶה of מה היא דקדוק
ה , , ו יש להתעלם מהתו, אלא שה-
הבקשה תוודא שהם לא יופיעו בשמות או שמורות למספר תווים
סמלים. הערות יצורפו ב "/* ... */", ויכול להופיע בכל מקום שבו נמצא שם
תָקֵף.

השמות הם באורך שרירותי, מורכבים מאותיות, נקודות ('.'), מדגיש ('_',) ו
ספרות לא ראשוניות. אותיות גדולות וקטנות מובחנות. יישומים תואמים
לא ישתמש בשמות שמתחילים ב yy or YY מאז יאק מנתח משתמש בשמות כאלה. הרבה מ
השמות מופיעים בפלט הסופי של יאק, ולכן יש לבחור אותם כדי להתאים
עם כללים נוספים שנוצרו על ידי מהדר C לשימוש. במיוחד הם מופיעים
in #define הצהרות.

מילולית תכלול תו בודד המוקף בתווי מרכאות בודדות. כל
רצפי הבריחה הנתמכים עבור קבועי תווים על ידי תקן ISO C יהיו
נתמך על ידי יאק.

הקשר עם המנתח המילוני נדון בפירוט להלן.

האפליקציה תבטיח שלא נעשה שימוש בתו NUL בכללי דקדוק או
מילוליות.

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

בדרך כלל יאק מקצה את הקשר בין השמות הסמליים שהוא מייצר לבין השמות שלהם
הערך המספרי הבסיסי. סעיף ההצהרות מאפשר לשלוט ב
הקצאת ערכים אלו.

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

הקבוצה הראשונה של המצהירים מתחת כולן לוקחת רשימה של שמות כטיעונים. הרשימה הזאת יכולה
אפשר להקדים את שמו של חבר איגוד C (נקרא א תג למטה) מופיע
בתוך '<' ו '>'. (כחריג למוסכמות הטיפוגרפיות של שאר הדברים
כרך של POSIX.1-2008, במקרה זהתג> אינו מייצג מטא-משתנה, אלא את
תווים בסוגריים של זווית מילולית המקיפים סמל.) השימוש ב תג מציין כי
אסימונים הנקובים בשורה זו יהיו מאותו סוג C כמו חבר האיגוד אליו מתייחסים
תג. זה נדון ביתר פירוט להלן.

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

להלן מצהיר שם להיות אסימון:

%אֲסִימוֹן [<תג>] שם [מספר] [שם [מספר]]...

If תג קיים, סוג C עבור כל האסימונים בשורה זו יוכרז כסוג
הפניה על ידי תג. אם מספר שלם חיובי, מספר, עוקב אחר א שם, הערך הזה יהיה
מוקצה לאסימון.

להלן מצהיר שם להיות אסימון, ומקצה לו עדיפות:

%שמאלה [<תג>] שם [מספר] [שם [מספר]]...
%ימין [<תג>] שם [מספר] [שם [מספר]]...

שורה אחת או יותר, כל אחת מתחילה באחד מהסמלים הללו, יכולה להופיע בסעיף זה.
לכל האסימונים באותו קו יש אותה רמת קדימות ואסוציאטיביות; הקווים
הם בסדר עדיפות גוברת או חוזק מחייב. %שמאלה מציין כי
אופרטורים בקו זה נותרים אסוציאטיביים, ו %ימין באופן דומה מציין זכות
אופרטורים אסוציאטיביים. אם תג קיים, הוא יכריז על סוג C עבור שםכמתואר
ל %אֲסִימוֹן.

להלן מצהיר שם להיות אסימון, ומציין שלא ניתן להשתמש בזה
מבחינה אסוציאטיבית:

%nonassoc [<תג>] שם [מספר] [שם [מספר]]...

אם המנתח נתקל בשימוש אסוציאטיבי באסימון זה הוא מדווח על שגיאה. אם תג is
קיים, הוא יכריז על סוג C עבור שםכמתואר עבור %אֲסִימוֹן.

להלן מצהיר כי חבר האיגוד שםs הם לא טרמינלים, ולכן זה נדרש
יש תג שדה בתחילתו:

%סוּג <תג> שם...

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

כל שם בשימוש דקדוק לא מוגדר על ידי א %אֲסִימוֹן, %שמאלה, %ימין, או %nonassoc
מניחים שההצהרה מייצגת סמל לא טרמינלי. ה יאק השירות ידווח
שגיאה עבור כל סמל שאינו מסוף שאינו מופיע בצד שמאל של לפחות אחד
כלל דקדוק.

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

המצהירים הבאים אינם עוקבים אחר הדפוס הקודם.

להלן מצהיר על הלא טרמינלי שם להיות ה התחלה סמל, המייצג את
המבנה הגדול והכללי ביותר המתואר על ידי כללי הדקדוק:

%הַתחָלָה שם

כברירת מחדל, זהו הצד השמאלי של כלל הדקדוק הראשון; ברירת מחדל זו יכולה להיות
מבוטלת בהכרזה זו.

להלן מצהיר על יאק מחסנית ערכית להיות איחוד של סוגי הערכים השונים
הרצוי.

%הִתאַחֲדוּת { גוּף of התאחדות (in C)}

גוף האיגוד לא יכיל אסימוני עיבוד מקדים של סד מתולתל לא מאוזנים.

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

לחילופין, בהתחשב בכך שלפחות אחדתג> נעשה שימוש במבנה, ניתן להכריז על האיחוד
בקובץ כותרות (שיכלל בסעיף ההצהרות באמצעות א #include
לבנות בפנים %{ ו %}), ו typedef משמש להגדרת הסמל YYSTYPE לייצג
האיחוד הזה. האפקט של %הִתאַחֲדוּת הוא לספק את ההצהרה של YYSTYPE ישירות מ
מה היא יאק קֶלֶט.

הצהרות והגדרות בשפה ג' יכולות להופיע בסעיף ההצהרות, המצורף
לפי הסימנים הבאים:

%{ ... %}

הצהרות אלו יועתקו לקובץ הקוד, ויהיה להן היקף גלובלי בתוכו
שניתן להשתמש בהם בסעיפים של הכללים והתוכניות. ההצהרות לא יכילו
"%}" מחוץ להערה, מחרוזת מילולית או קבועה מרובה תווים.

הבקשה תוודא שסעיף ההצהרות יסתיים על ידי האסימון %%.

דקדוק חוקי in יאק
סעיף הכללים מגדיר את הדקדוק נטול ההקשר שיתקבל על ידי הפונקציה יאק
יוצר ומשייך לכללים אלה פעולות בשפה C וקדימות נוספת
מֵידָע. הדקדוק מתואר להלן, ולאחר מכן הגדרה פורמלית.

קטע הכללים מורכב מחוקי דקדוק אחד או יותר. לכלל דקדוק יש את הצורה:

A : גוף ;

הסמל A מייצג שם לא טרמינלי, ו גוף מייצג רצף של אפס או
יותר שםs, מילוליים, ו סמנטי פעולהs אשר לאחר מכן ניתן לאחר מכן אופציונלי
עֲדִיפוּת לשלוטס. רק השמות והמילולים משתתפים בהיווצרות ה
דקדוק; הפעולות הסמנטיות וכללי הקדימות משמשים בדרכים אחרות. ה ו
ה הם יאק סימני פיסוק. אם יש כמה כללי דקדוק עוקבים עם
אותו צד שמאל, ה ('|') ניתן להשתמש כדי להימנע משכתוב של
צד שמאל; במקרה זה ה מופיע רק אחרי הכלל האחרון. הגוף
חלק יכול להיות ריק (או ריק משמות ומילוליות) כדי לציין שהלא טרמינלי
סמל מתאים למחרוזת הריקה.

אל האני יאק כלי השירות מקצה מספר ייחודי לכל כלל. כללים באמצעות הפס האנכי
סימון הם כללים נפרדים. המספר שהוקצה לכלל מופיע בתיאור
קובץ.

האלמנטים הכוללים BODY הם:

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

סמנטי פעולה
עם כל כלל דקדוק, המשתמש יכול לשייך פעולות שיש לבצע בכל פעם
הכלל מוכר בתהליך הקלט. (שים לב שהמילה ``פעולה'' יכולה
מתייחסים גם לפעולות של המנתח - הסט, צמצום וכן הלאה.)

פעולות אלו יכולות להחזיר ערכים ויכולות להשיג את הערכים שהוחזרו על ידי הקודם
פעולות. ערכים אלה נשמרים באובייקטים מסוג YYSTYPE (ראה %הִתאַחֲדוּת).
ערך התוצאה של הפעולה יישמר על ערימת הניתוח ביד שמאל
צד של הכלל, שניתן לגשת להפחתות אחרות כחלק מימין
צַד. על ידי שימוש בתג> מידע המסופק בסעיף ההצהרות, ה
קוד שנוצר על ידי יאק ניתן לבדיקת הקלדה קפדנית ולהכיל שרירותית
מֵידָע. בנוסף, המנתח המילוני יכול לספק את אותם סוגים של
ערכים עבור אסימונים, אם תרצה בכך.

פעולה היא הצהרת C שרירותית וככזו יכולה לעשות קלט או פלט, להתקשר
תוכניות משנה, ולשנות משתנים חיצוניים. פעולה היא הצהרת C אחת או יותר
סגור בפלטה מתולתלת '{' ו '}'. ההצהרות לא יכילו
אסימוני עיבוד מקדים של סד מתולתל לא מאוזן.

ניתן להשתמש במשתנים פסאודו מסוימים בפעולה. אלו הן פקודות מאקרו לגישה
למבני נתונים המוכרים באופן פנימי יאק.

$$ ניתן להגדיר את ערך הפעולה על ידי הקצאתו ל-$$. אם סוג
הבדיקה מופעלת ולא יכול להיות סוג הערך שיוקצו
נקבע, עשויה להיווצר הודעת אבחון.

$מספר זה מתייחס לערך המוחזר על ידי הרכיב שצוין על ידי
אסימון מספר בצד ימין של כלל, קריאה משמאל לימין;
מספר יכול להיות אפס או שלילי. אם מספר הוא אפס או שלילי, זה
מתייחס לנתונים המשויכים לשם על הערימה של המנתח
לפני הסמל השמאלי ביותר של הכלל הנוכחי. (זה, "$ 0"
מתייחס לשם שמיד לפני השם השמאלי ביותר ב-
הכלל הנוכחי שניתן למצוא בערימה של המנתח ו "$−1" מתייחס ל
סמל ל שלה שמאל.) אם מספר מתייחס לאלמנט מעבר לזרם
נקודה בכלל, או מעבר לתחתית הערימה, התוצאה היא
לא מוגדר. אם בדיקת סוג מופעלת וסוג הערך שיש
לא ניתן לקבוע שהוקצו, ייתכן שתיווצר הודעת אבחון.

$<תג>מספר
אלה תואמים בדיוק לסמלים המתאימים ללא תג
הכללה, אך אפשר בדיקת סוגים קפדנית (ולמנוע לא רצויים
סוג המרות). ההשפעה היא שהמאקרו מורחב לשימוש תג
כדי לבחור אלמנט מהאיחוד YYSTYPE (באמצעות dataname.tag).
זה שימושי במיוחד אם מספר אינו חיובי.

$<תג>$ זה מטיל על הפניה את סוג חבר האיגוד אליו מתייחסים
by תג. בנייה זו ישימה כאשר הפניה לשמאל
ערך ההקשר מופיע בדקדוק, ומספק יאק עם אמצעי
לבחירת סוג.

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

כברירת מחדל, הערך של כלל יהיה הערך של האלמנט הראשון בו.
אם לרכיב הראשון אין סוג (במיוחד במקרה של a
מילולי) ובדיקת סוג מופעלת על ידי %סוּג, תופיע הודעת שגיאה.

עֲדִיפוּת
מילת המפתח %prec ניתן להשתמש כדי לשנות את רמת העדיפות הקשורה ל-a
כלל דקדוק מסוים. דוגמאות לכך הן במקרים בהם unary ו-binary
למפעיל יש את אותו ייצוג סמלי, אבל צריך לתת לו שונה
קדימות, או היכן הטיפול בבנייה מעורפלת אם-אחרת
נחוץ. הסמל השמור %prec יכול להופיע מיד אחרי הגוף של
כלל הדקדוק ויכול להיות אחריו שם סמלי או מילולי. זה יהיה
לגרום לכך שהקדימות של כלל הדקדוק תהפוך לזו של האסימון הבא
שם או מילולי. הפעולה עבור הכלל בכללותו יכולה לעקוב %prec.

אם יופיע סעיף תוכנית, הבקשה תוודא שכללי הדקדוק הם
הופסק על ידי %%.

תוכניות סעיף
אל האני תוכניות סעיף יכול לכלול את ההגדרה של מנתח מילוני yylex(), וכל
פעולות אחרות; לדוגמה, אלה המשמשים בפעולות המפורטות בכללי הדקדוק. זה
לא מצוין אם סעיף התוכניות מקדים או עוקב אחר הפעולות הסמנטיות ב
קובץ הפלט; לכן, אם היישום מכיל הגדרות מאקרו כלשהן ו
הצהרות שנועדו לחול על הקוד בפעולות הסמנטיות, היא תציב אותן
בתוך "%{ ... %}" בסעיף ההצהרות.

קֶלֶט דקדוק
הקלט הבא ל יאק מניב מנתח עבור הקלט יאק. התחביר הפורמלי הזה
מקבל עדיפות על תיאור תחביר הטקסט הקודם.

המבנה המילוני מוגדר פחות מדויק; לֵקסִיקָלִי מִבְנֶה of מה היא דקדוק מגדיר
רוב המונחים. ההתאמה בין התנאים הקודמים לאסימונים למטה היא כ
הבא.

מזהה זה תואם את הרעיון של שם, שניתנו בעבר. זה כולל גם
מילוליות כפי שהוגדרו קודם לכן.

C_IDENTIFIER
זהו שם, ובנוסף ידוע שאחריו מגיע א . א
מילולי לא יכול להניב את האסימון הזה.

מספר מחרוזת של ספרות (מספר שלם עשרוני לא שלילי).

סוג, נשאר, סימן, LCURL, RCURL
אלה מתאימות ישירות ל %סוּג, %שמאלה, %%, %{, ו %}.

{ ... } זה מציין קוד מקור בשפת C, עם הכללה אפשרית של '$'
פקודות מאקרו כפי שנדון קודם לכן.

/* דקדוק ל מה היא קלט ל yacc. */
/* בסיסי ערכים. */
/* אל האני הבא יש לו מוכר by מה היא לֵקסִיקָלִי מנתח. */

%token IDENTIFIER /* כולל מזהים ומילולים */
%token C_IDENTIFIER /* מזהה (אך לא מילולי)
ואחריו :. */
%token NUMBER /* [0-9][0-9]* */

/* מילים שמורות : %type=>TYPE %left=>LEFT, וכן הלאה */

%token שמאל ימינה NONASSOC TOKEN PREC TYPE התחלה איחוד

%token MARK /* הסימן %%. */
%token LCURL /* הסימן %{. */
%token RCURL /* הסימן %}. */

/* מילות תווים של 8 סיביות עומדות בפני עצמן; */
יש להגדיר אסימונים /* עבור תווים מרובים בתים. */

%מפרט התחלה

%%

מפרט: defs MARK חוקי זנב
;
זנב: MARK
{
/* בפעולה זו, הגדר את שאר הקובץ. */
}
| /* ריק; ה-MARK השני הוא אופציונלי. */
;
defs : /* ריק. */
| defs def
;
def : התחל מזהה
| הִתאַחֲדוּת
{
/* העתק את הגדרת האיחוד לפלט. */
}
| LCURL
{
/* העתק קוד C לקובץ הפלט. */
}
RCURL
| תג rword nlist
;
rword: TOKEN
| שמאלה
| ימין
| NONASSOC
| סוּג
;
תג: /* ריק: מזהה תג איגוד אופציונלי. */
| '<' מזהה '>'
;
nlist: nmno
| nlist nmno
;
nmno : IDENTIFIER /* הערה: מילולי לא חוקי עם סוג %. */
| IDENTIFIER NUMBER /* הערה: לא חוקי עם סוג %. */
;

/* סעיף כללים */

כללים: C_IDENTIFIER rbody prec
| כללים כללים
;
כלל: C_IDENTIFIER rbody prec
| '|' rbody prec
;
rbody: /* ריק */
| מזהה גוף
| מעשה גוף
;
פעולה : '{'
{
/* העתק את הפעולה, תרגם $$ וכן הלאה. */
}
'}'
;
prec : /* ריק */
| מזהה מראש
| PREC IDENTIFIER מעשה
| prec ';'
;

קונפליקטים
המנתח המיוצר עבור דקדוק קלט עשוי להכיל מצבים שבהם מתרחשים התנגשויות. ה
קונפליקטים מתרחשים כי הדקדוק לא LALR(1). דקדוק מעורפל תמיד מכיל
לפחות אחד LALR(1) קונפליקט. ה יאק כלי השירות יפתור את כל ההתנגשויות, באמצעות אחד מהם
כללי ברירת מחדל או כללי קדימות שצוינו על ידי המשתמש.

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

הכללים שלהלן מתארים כיצד לציין אילו פעולות לנקוט כאשר מתרחשת התנגשות. לֹא
ניתן לפתור את כל קונפליקציית השינוי/הפחתה בהצלחה בדרך זו מכיוון שהקונפליקט עלול להיפתר
נובע ממשהו אחר מלבד עמימות, כך ששימוש לא זהיר במתקנים אלו עלול לגרום
השפה המקובלת על ידי המנתח שונה בהרבה מזו שהתכוונה. ה
קובץ התיאור יכיל מספיק מידע כדי להבין את הסיבה ל
סְתִירָה. כאשר אי בהירות היא הסיבה שברירת המחדל או הכללים המפורשים צריכים להיות
מספיק כדי לייצר מנתח עובד.

העדיפויות והאסוציאטיביות המוצהרות (ראה הצהרות סעיף) רגילים
פתור התנגשויות ניתוח באופן הבא:

1. עדיפות ואסוציאטיביות קשורה לכל כלל דקדוק; זה
קדימות ואסוציאטיביות של האסימון או המילולי האחרון בגוף הכלל. אם
מה היא %prec נעשה שימוש במילת מפתח, היא עוקפת את ברירת המחדל הזו. ייתכן שחלק מכללי הדקדוק לא
יש גם עדיפות וגם אסוציאטיביות.

2. אם יש התנגשות הסט/הפחתת, וגם כלל הדקדוק וגם סמל הקלט
יש קדימות ואסוציאטיביות הקשורים אליהם, אז הקונפליקט נפתר
לטובת הפעולה (הסטה או הקטנה) הקשורה לקדימות הגבוהה יותר. אם ה
הקדימות זהות, אז נעשה שימוש באסוציאטיביות; אסוציאטיבי שמאל מרמז
צמצום, אסוציאטיבי ימני מרמז על תזוזה, ואי אסוציאטיבי מרמז על טעות ב-
מחרוזת בניתוח.

3. כאשר יש קונפליקט תזוזה/צמצום שלא ניתן לפתור על ידי כלל 2, השינוי הוא
בוצע. קונפליקטים שנפתרו בדרך זו נספרים בפלט האבחון המתואר ב
שְׁגִיאָה טיפול.

4. כאשר יש קונפליקט צמצום/הפחת, צמצום נעשה לפי כלל הדקדוק ש
מתרחש מוקדם יותר ברצף הקלט. קונפליקטים שנפתרו בדרך זו נספרים ב-
פלט אבחון המתואר ב שְׁגִיאָה טיפול.

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

שְׁגִיאָה טיפול
האסימון שגיאה יישמר לטיפול בשגיאות. השם שגיאה ניתן להשתמש ב
חוקי דקדוק. זה מציין מקומות שבהם המנתח יכול להתאושש משגיאת תחביר. ה
ערך ברירת המחדל של שגיאה יהיה 256. ניתן לשנות את ערכו באמצעות a %אֲסִימוֹן הצהרה.
המנתח המילוני לא אמור להחזיר את הערך של שגיאה.

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

כאשר המנתח מזהה שגיאת תחביר, הוא בדרך כלל מתקשר yyerror() עם הדמות
מחרוזת "תחביר שְׁגִיאָה" כטענה שלה. השיחה לא תתבצע אם המנתח עדיין פעיל
מתאושש משגיאה קודמת כאשר השגיאה מזוהה. המנתח נחשב ל
להתאושש משגיאה קודמת עד שהמנתח עבר לפחות שלוש
סמלי קלט רגילים מאז שזוהתה השגיאה האחרונה או שבוצעה פעולה סמנטית
המאקרו yyerrok. המנתח לא יתקשר yyerror() כאשר YYERROR מבוצע.

פונקציית המאקרו YYRECOVERING תחזיר 1 אם זוהתה שגיאת תחביר וה-
מנתח עדיין לא התאושש ממנו במלואו. אחרת, אפס יוחזר.

כאשר מתגלה שגיאת תחביר על ידי המנתח, המנתח יבדוק אם תחביר קודם
זוהתה שגיאה. אם זוהתה שגיאה קודמת, ואם אין סמלי קלט רגילים
הועברו מאז שזוהתה השגיאה הקודמת, המנתח בודק אם
סמל מבט קדימה הוא סמן קצה (ראה מִמְשָׁק ל מה היא לֵקסִיקָלִי מנתח). אם כן, ה
מנתח יחזור עם ערך שאינו אפס. אחרת, סמל המבט קדימה יהיה
נמחק והניתוח הרגיל יתחדש.

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

המאקרו yyerrok בפעולה סמנטית יגרום למנתח לפעול כאילו יש לו במלואו
שוחזר מכל שגיאה קודמת. המאקרו yyclearin יגרום לביטול הניתוח
אסימון המבט הנוכחי. אם אסימון ההסתכלות הנוכחי עדיין לא נקרא,
yyclearin לא תהיה השפעה.

המאקרו YYACCEPT יגרום למנתח לחזור עם הערך אפס. המאקרו YYABORT
יגרום למנתח לחזור עם ערך שאינו אפס.

מִמְשָׁק ל מה היא לֵקסִיקָלִי מנתח
אל האני yylexפונקציה () היא פונקציה בעלת ערך שלם שמחזירה a אסימון מספר
המייצג את סוג הקריאה של האסימון. אם יש ערך המשויך לאסימון
חזר על ידי yylex() (ראה את הדיון ב תג לעיל), הוא יוקצה ל-
משתנה חיצוני yylval.

אם מנתח ו yylex() לא מסכימים על המספרים האסימונים הללו, תקשורת אמינה
ביניהם לא יכול להתרחש. עבור מילוליות (תו של בייט בודד), האסימון הוא פשוט ה-
ערך מספרי של התו בערכת התווים הנוכחית. המספרים של אסימונים אחרים
ניתן לבחור על ידי יאק, או שנבחר על ידי המשתמש. בכל מקרה, ה #define לבנות
של C משמש כדי לאפשר yylex() כדי להחזיר את המספרים הללו באופן סמלי. ה #define הצהרות
מוכנסים לקובץ הקוד, ולקובץ הכותרת אם הקובץ מתבקש. הסט של
תווים המותרים על ידי יאק במזהה גדול מזה המותר על ידי C. Token
שמות שנמצאו מכילים תווים כאלה לא ייכללו ב- #define הצהרות.

אם מספרי האסימונים נבחרו על ידי יאק, יוקצו האסימונים שאינם מילוליים
מספרים גדולים מ-256, אם כי לא משתמע סדר. ניתן להקצות אסימון במפורש
מספר על ידי מעקב אחר הופעתו הראשונה בסעיף ההצהרות עם מספר.
שמות ומילוליים שאינם מוגדרים כך שומרים על הגדרת ברירת המחדל שלהם. כל המספרים האסימונים
שהוקצה על ידי יאק יהיה ייחודי ומובחן ממספרי האסימונים המשמשים עבור מילוליים ו
אסימונים שהוקצו על ידי המשתמש. אם מספרי אסימון כפולים גורמים להתנגשויות ביצירת מנתח,
יאק ידווח על טעות; אחרת, לא מצוין אם הקצאת האסימון היא
התקבל או שדווחה על שגיאה.

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

מַשׁלִים מה היא תָכְנִית
נוסף על yyparse() ו yylex(), הפונקציות yyerror() ו ראשי() נדרשים ל
לעשות תוכנית שלמה. האפליקציה יכולה לספק ראשי() ו yyerror(), או אלה
שגרות ניתן לקבל מה יאק סִפְרִיָה.

יאק סִפְרִיָה
הפונקציות הבאות יופיעו רק ב- יאק ספרייה נגישה דרך −ל y
אופרנד ל c99; לכן ניתן להגדיר אותם מחדש על ידי יישום תואם:

int ראשי(לבטל את)
פונקציה זו תקרא yyparse() וצא עם ערך לא מוגדר. פעולות אחרות
בתוך פונקציה זו אינם מצוינים.

int yyerror(const char *s)
פונקציה זו תכתוב את הארגומנט שהסתיים ב-NUL לשגיאה סטנדרטית, ואחריו
א .

הסדר של −ל y ו −ל l אופרנדים שניתנו ל c99 הוא משמעותי; הבקשה תהיה
או לספק את שלו ראשי() לתפקד או להבטיח זאת −ל y קודם −ל l.

Debugging מה היא מנתח
המנתח שנוצר על ידי יאק יהיו בו מתקני אבחון שיכולים להיות אופציונליים
מופעל בזמן הידור או בזמן ריצה (אם מופעל בזמן הידור). ה
הידור של קוד איתור באגים בזמן ריצה נמצא בשליטה של ​​YYDEBUG, מעבד קדם
סֵמֶל. אם ל-YYDEBUG יש ערך שאינו אפס, קוד ניפוי הבאגים ייכלל. אם זה
הערך הוא אפס, הקוד לא ייכלל.

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

מתי −ת צוין, קובץ הקוד ייבנה כך שאם YYDEBUG אינו כבר
מוגדר בזמן הקומפילציה (באמצעות ה c99 אפשרות YYDEBUG, למשל), YYDEBUG
להיות מוגדר במפורש ל-1. מתי −ת לא צוין, קובץ הקוד ייבנה כך,
אם YYDEBUG לא מוגדר כבר, הוא יוגדר במפורש לאפס.

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

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

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

הספרות של תורת הניתוח מגדירה מושגים אלה.

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

שולחן: פנימי גבולות in יאק

┌───────────┬─────────┬─────────────────────────── ─────┐
│ │ מינימום │ │
לְהַגבִּילמַקסִימוּםתיאור
├───────────┼─────────┼─────────────────────────── ─────┤
│{NTERMS} │ 126 │ מספר אסימונים. │
│{NNONTERM} │ 200 │ מספר לא-טרמינלים. │
│{NPROD} │ 300 │ מספר כללים. │
│{NSTATES} │ 600 │ מספר מדינות. │
│{MEMSIZE} │ 5200 │ אורך כללים. סך הכל │
│ │ │ אורך, בשמות (אסימונים ו│
│ │ │ שאינם מסופים), מכל ה│
│ │ │ כללי הדקדוק. ה│
│ │ │ צד שמאל נספר עבור │
│ │ │ כל כלל, גם אם הוא לא │
│ │ │ חוזר במפורש, כמו │
│ │ │ המצוין ב דקדוק חוקי in
│ │ │ יאק. │
│{ACTSIZE} │ 4000 │ מספר פעולות. ``פעולות'' │
│ │ │ כאן (ובתיאור │
│ │ │ קובץ) מתייחסים לפעולות מנתח │
│ │ │ (הסטה, הקטנה וכן הלאה) לא │
│ │ │ לפעולות סמנטיות המוגדרות ב│
│ │ │ דקדוק חוקי in יאק. │
└───────────┴─────────┴─────────────────────────── ─────┘

יְצִיאָה סטָטוּס


יוחזרו ערכי היציאה הבאים:

0 השלמה מוצלחת.

>0 אירעה שגיאה.

השלכות OF שגיאות


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

אל האני הבא סעיפים יש לו אִינפוֹרמָטִיבִי.

בקשה נוהג


יישומים היסטוריים חווים התנגשויות שמות על השמות yacc.tmp, yacc.acts,
yacc.debug, y.tab.c, y.tab.h, ו y.output אם יותר מעותק אחד של יאק פועל ב-a
ספרייה בודדת בבת אחת. ה נוספה אפשרות כדי להתגבר על בעיה זו. ה
בעיה קשורה של התרת ריבוי יאק מנתחים שיוצבו באותו קובץ היו
מטופל על ידי הוספת א -עמ' אפשרות לעקוף את הקוד הקשיח בעבר yy קידומת משתנה.

התיאור של -עמ' option מציינת את הסט המינימלי של שמות פונקציות ומשתנים
שגורמים להתנגשות כאשר מנתחים מרובים מקושרים יחד. YYSTYPE לא צריך להיות
השתנה. במקום זאת, המתכנת יכול להשתמש לתת את קבצי הכותרת עבור מנתחים שונים
שמות שונים, ולאחר מכן הקובץ עם ה- yylex() עבור מנתח נתון יכול לכלול את
כותרת עבור מנתח זה. שמות כגון yclearerr לא צריך לשנות כי הם
משמשים רק בפעולות; אין להם קישור. יתכן כי א
ליישום יש שמות אחרים, או פנימיים ליישום דברים כגון
yclearerr, או מתן תכונות לא סטנדרטיות שאיתן הוא רוצה לשנות -עמ'.

אופרטורים לא נאריים זהים לאופרטור בינארי באופן כללי זקוקים להם
עדיפות מותאמת. זה מטופל על ידי %prec סמל ייעוץ המשויך ל-
כלל דקדוק מסוים המגדיר את האופרטור האנרי הזה. (לִרְאוֹת דקדוק חוקי in יאק.)
יישומים אינם נדרשים להשתמש באופרטור זה עבור אופרטורים אונריים, אלא בדקדוקים
שאינם דורשים זאת הם נדירים.

דוגמאות


גישה אל יאק הספרייה מתקבלת עם אופרנדים של חיפוש ספרייה ל c99. כדי להשתמש ב-
יאק ספריה ראשי():

c99 y.tab.c −ל y

גם את לקס הספרייה וה יאק הספרייה מכילה ראשי(). כדי לגשת ל יאק ראשי():

c99 y.tab.c lex.yy.c −ל y −ל l

זה מבטיח כי יאק תחילה מחפשים את הספרייה, כך שהיא ראשי() משמש.

ההיסטורי יאק ספריות הכילו שתי פונקציות פשוטות המקודדות בדרך כלל
על ידי מתכנת האפליקציות. פונקציות אלו דומות לקוד הבא:

#include
int ראשי (ריק)
{
חיצוני int yyparse();

setlocale(LC_ALL, "");

/* אם המנתח הבא הוא כזה שנוצר על ידי lex, ה-
היישום חייב להיות זהיר כדי להבטיח כי LC_CTYPE
ו-LC_COLLATE מוגדרים למקום POSIX. */
(void) yyparse();
החזרה (0);
}

#לִכלוֹל

int yyerror(const char *msg)
{
(void) fprintf(stderr, "%s\n", msg);
החזרה (0);
}

Rationalale


ההפניות ב הפניה דוחות עשוי להיות מועיל בבניית המנתח
גֵנֵרָטוֹר. מאמר DeRemer ו-Pennello המוזכרים (יחד עם העבודות בו
references) מתאר טכניקה ליצירת מנתחים התואמים לנפח זה של
POSIX.1-2008. העבודה בתחום זה ממשיכה להתבצע, ולכן מיישמים צריכים להתייעץ
ספרות עדכנית לפני ביצוע יישומים חדשים כלשהם. המאמר המקורי של Knuth הוא ה
בסיס תיאורטי לסוג זה של מנתח, אך הטבלאות שהוא יוצר אינן מעשית
גדול עבור דקדוקים סבירים ואין להשתמש בו. הנוסח ``שווה ערך ל'' הוא
בכוונה להבטיח כי השולחנות הטובים ביותר שיש LALR(1) ניתן ליצור.

היה בלבול בין מחלקת הדקדוקים, האלגוריתמים הדרושים ליצירת
מנתחים, והאלגוריתמים הדרושים לניתוח השפות. כולם סבירים
מְאוּנָך. בפרט, מחולל מנתח שמקבל את כל הטווח של LR(1)
דקדוקים אינם צריכים ליצור טבלה מורכבת יותר מזו שמקבלת SLR(1) (א
מחלקה חלשה יחסית של דקדוקי LR) עבור דקדוק שבמקרה כזה SLR(1). כמו
גם היישום אינו חייב להכיר במקרה; דחיסת טבלה יכולה להניב את SLR(1)
טבלה (או אחת אפילו קטנה מזה) מבלי להכיר בכך שהדקדוק הוא SLR(1). ה
מהירות של LR(1) מנתח עבור כל מחלקה תלוי יותר בייצוג הטבלה ו
דחיסה (או יצירת הקוד אם נוצר מנתח ישיר) מאשר על המחלקה
של דקדוק שמחולל הטבלה מטפל בו.

המהירות של מחולל הנתח תלויה במידה מסוימת במעמד הדקדוק שלו
ידיות. עם זאת, האלגוריתמים המקוריים של מאמר Knuth לבניית מנתחי LR היו
על פי מחברו קבע כי היה איטי בצורה בלתי מעשית באותה תקופה. למרות ש-LR מלא זה יותר
מורכב מאשר LALR(1), ככל שהמהירות והאלגוריתמים של המחשב משתפרים, ההבדל (במונחים
של זמן ביצוע מקובל של שעון קיר) הופך פחות משמעותי.

מחברים פוטנציאליים מוזהרים מהמאמר של DeRemer ו-Pennello
שצוטט בעבר מזהה באג (פישוט יתר של החישוב של LALR(1)
מערכות מבט) בחלק מה LALR(1) הצהרות אלגוריתם שקדמו לו
פרסום. הם צריכים לקחת את הזמן כדי לחפש את הנייר הזה, כמו גם רלבנטי עדכני
עבודה, במיוחד של Aho.

אל האני נוספה אפשרות לספק שיטה ניידת להתרת יאק לעבוד על
מנתחים מרובים נפרדים באותה ספרייה. אם ספרייה מכילה יותר מאחד
יאק דקדוק, ושני הדקדוקים בנויים בו-זמנית (על ידי, למשל, א
במקביל לעשות תוכנית), תוצאות קונפליקט. אמנם הפתרון אינו פרקטיקה היסטורית,
זה מתקן ליקוי ידוע ביישומים היסטוריים. שינויים מקבילים היו
בוצע לכל הסעיפים שהתייחסו לשמות הקבצים y.tab.c (עכשיו ``קובץ הקוד''),
y.tab.h (עכשיו ``קובץ הכותרת''), ו y.output (עכשיו ``קובץ התיאור'').

הדקדוק עבור יאק הקלט מבוסס על תיעוד System V. התיאור הטקסטואלי
מראה שם שה ';' נדרש בסוף הכלל. הדקדוק וה
יישום אינו מחייב זאת. (השימוש של C_IDENTIFIER גורם להפחתה להתרחש ב
המקום הנכון.)

כמו כן, ביישום זה, המבנים כגון %אֲסִימוֹן ניתן לסיים על ידי א
, אך הדבר אינו מותר על פי הדקדוק. מילות המפתח כגון %אֲסִימוֹן יכול
מופיעים גם באותיות רישיות, ששוב לא נדון. ברוב המקומות שבהם '%' משמש,
ניתן להחליף, ויש איות חלופי לחלק מהסמלים
(לדוגמה, %שמאלה יכול להיות "%<" או אפילו "\<").

מבחינה היסטורית,תג> יכול להכיל כל תווים מלבד '>', כולל חלל לבן, ב
יישום. עם זאת, מאז ה תג חייב להתייחס לחבר איגוד בתקן ISO C, ב
תרגול יישומים תואמים צריכים לתמוך רק בקבוצת התווים עבור ISO C
מזהים סטנדרטיים בהקשר זה.

ידוע שחלק מהיישומים ההיסטוריים מקבלים פעולות שמסתיימות על ידי א
פרק זמן. יישומים היסטוריים מאפשרים לעתים קרובות '$' בשמות. יישום תואם
לא צריך לתמוך באף אחת מההתנהגויות הללו.

החלטה מתי להשתמש %prec ממחיש את הקושי לציין את ההתנהגות של יאק.
ייתכנו מצבים שבהם ה דקדוק אינו, למהדרין, בטעות, ובכל זאת
יאק לא יכול לפרש את זה בצורה חד משמעית. הפתרון של אי בהירות בדקדוק יכול
במקרים רבים ניתן לפתור על ידי מתן מידע נוסף, כגון שימוש %סוּג or
%הִתאַחֲדוּת הצהרות. לעתים קרובות זה קל יותר וזה בדרך כלל מניב מנתח קטן יותר לקחת
חלופה זו כאשר היא מתאימה.

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

הודעות סטטיסטיקה ממספר יישומים היסטוריים כוללים את הסוגים הבאים של
מידע:

n/512 מסופים, n/300 לא מסופים
n/600 כללי דקדוק, n/1500 מדינות
n להזיז/להפחית, n לצמצם/להפחית קונפליקטים שדווחו
n/350 ערכות עבודה בשימוש
זיכרון: מצבים וכו'. n/15000, מנתח n/ 15000
n/600 סטים מובהקים של מבט קדימה
n סגירות נוספות
n כניסות למשמרת, n חריגים
n ערכים של goto
n ערכים שנשמרו כברירת מחדל
שטח האופטימיזציה בשימוש: קלט n/15000, פלט n/ 15000
n כניסות בטבלה, n אפס
פיזור מקסימלי: n, היסט מירבי: n

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

הפורמט של y.output הקובץ לא ניתן מכיוון שמפרט הפורמט לא היה
נראה כמשפר את ניידות היישומים. הרישום נועד בעיקר לעזור לאדם
משתמשים מבינים את המנתח וניפוי באגים; שימוש ב y.output על ידי סקריפט יישום תואם
יהיה יוצא דופן. יתר על כן, יישומים לא יצרו תפוקה עקבית ולא
פורמט פופולרי היה ברור. הפורמט שנבחר על ידי היישום צריך להיות אנושי-
קריא, בנוסף לדרישה שזה יהיה קובץ טקסט.

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

כמה יישומים מזהים "={" כשווה ערך ל- '{' כי זה מופיע בהיסטוריה
תיעוד. בנייה זו הוכרה ותועדה כיושנת לפני זמן רב
1978, בהפניה Yacc: עדיין אחר מהדר-מהדר. כרך זה של POSIX.1-2008
בחרה להשאיר אותו כמיושן ולהשמיט אותו.

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

FUTURE כיוונים


אין.

השתמש ב-yaccposix באינטרנט באמצעות שירותי onworks.net


שרתים ותחנות עבודה בחינם

הורד אפליקציות Windows & Linux

  • 1
    itop - ITSM CMDB OpenSource
    itop - ITSM CMDB OpenSource
    פורטל תפעול IT: פתוח לחלוטין
    מקור, ITIL, שירות מבוסס אינטרנט
    כלי ניהול כולל מלא
    CMDB הניתן להתאמה אישית, מערכת עזרה ו
    איש מסמכים...
    הורד את itop - ITSM CMDB OpenSource
  • 2
    קלמנטינה
    קלמנטינה
    קלמנטיין היא מוזיקה מרובת פלטפורמות
    נגן ומארגן ספרייה בהשראת
    אמארוק 1.4. יש לו מהיר ו
    ממשק קל לשימוש, ומאפשר לך
    חפש ו...
    הורד את קלמנטיין
  • 3
    XISMuS
    XISMuS
    שימו לב: לעדכון מצטבר 2.4.3 יש
    שוחרר!! העדכון עובד עבור כל אחד
    גרסה קודמת של 2.xx. אם משדרגים
    מגרסה v1.xx, אנא הורד ו
    אני ...
    הורד את XISMuS
  • 4
    facetracknoir
    facetracknoir
    תוכנית מעקב ראש מודולרית כי
    תומך במספר עוקבי פנים, מסננים
    ופרוטוקולי משחק. בין הגששים
    הם SM FaceAPI, AIC Inertial Head
    עוקב ...
    הורד את facetracknoir
  • 5
    קוד QR של PHP
    קוד QR של PHP
    PHP QR Code הוא קוד פתוח (LGPL)
    ספרייה להפקת קוד QR,
    ברקוד דו מימדי. מבוסס על
    ספריית libqrencode C, מספקת API עבור
    יצירת סרגל קוד QR...
    הורד PHP QR Code
  • 6
    פריסיב
    פריסיב
    Freeciv הוא מבוסס תור חינמי
    משחק אסטרטגיה מרובה משתתפים, שבו כל אחד
    שחקן הופך למנהיג של א
    ציוויליזציה, נלחמת להשיג את
    המטרה הסופית: להיות...
    הורד את Freeciv
  • עוד »

פקודות לינוקס

Ad