המשימה
השלב האחרון של הפרויקט יתמקד בעבודה עם קבצים. נוסיף לתכנית את היכולת לקרוא משפטים שאנו מעונינים לנתח מקובץ קלט, לנתח אותם, ולדווח לנו על התוצאות בקובץ פלט מיוחד.
בכך נוכל בלחיצת כפתור להריץ את המנתח שכתבנו על משפטים רבים, לגלות מי מהם אינם חוקיים לפי הדקדוק, ולראות את עץ הגזירה של אלה שכן.
|
הנחיות והדרכה
פתיחת קובץ לקריאה או לכתיבה נעשית בפרולוג (בגרסת SWI שאנו עובדים אתה) באמצעות המתאר open/3. סגירת קובץ נעשית בעזרת close/1.
כתיבה לקובץ נעשית באמצעות המתארים write, nl, ו-tab שהשתמשנו בהם בשלב הקודם, בתוספת מתואר שהוא קובץ שפתחנו לכתיבה.
בשלב ראשון כתבו גרסא חדשה של המתאר להדפסת עצי גזירה שתדפיס לקובץ במקום למסך.
כתבו חוק חדש שראשו test_sentences וגופו מכיל את הפעולות של פתיחת קבצי הקלט והפלט, ניתוח משפטי קובץ הקלט, וסגירת הקבצים בסיום.
ניתוח משפטי הקלט ייעשה באמצעות מתאר נוסף read_and_test/3 שיקבל את קובץ הקלט, קובץ הפלט, ומתואר נוסף שישמש כמונה של מספר המשפטים המנותחים.
קראו באופן רקורסיבי למתאר זה, שיקרא כל פעם שורה מקובץ הקלט וינתח אותה. את הקריאה מהקובץ בצעו בעזרת read/2 שקורא מהקובץ במתואר הראשון שלו את ביטוי הפרולוג הבא, לתוך המתואר השני. מכיוון שמשפטי הקלט כתובים כרשימות בפרולוג, נוכל כך לקרוא רשימה אחר רשימה, או משפט אחר משפט. איך נדע שהגענו לסוף הקובץ ויש לעצור את הרקורסיה? המתאר at_end_of_stream(File) יודיע לנו על כך: הוא מחזיר "אמת" כשהוא מזהה את סוף הקובץ.
הערה אחרונה לגבי מבנה התכנית. יש לנו בשלב זה היכולת לבצע שלוש פעולות בלתי תלויות: האחת היא היכולת לפתוח ולסגור קבצים, השניה היא היכולת לנתח משפטים בעברית, והשלישית - להדפיסם יפה למסך.
מכיוון שאלה פעולות שונות, כדאי להפריד אותן כל אחת למסגרת, או מודול, משלה. כל מודול ייצא את המתארים הדרושים לשימוש הכלל, מבלי שנצטרך לתת את הדעת על המימוש הפנימי שלהם. השתמשו במתארים module ו-use_module כדי לארוז את הדקדוק במודול אחד, את המתאר להדפסת עצי גזירה במודול שני, וקראו לשניהם בתכנית הסופית שלכם על מנת להשתמש במתארים שהם מייצאים.
|