» נושאי לימוד
» נושאי לימוד
יום שני 29 באפריל 2024
Stream Tokenizer
דף ראשי  מתקדמים  Stream Tokenizer גרסה להדפסה

Stream Tokenizer

 

שיעור זה נכתב במקור ב 24 בספטמבר 1998 תוך שימוש בחבילה להורדהJDK1.1.6 .

שודרג ב JDK1.2  ב 16.12.98.

מטרת שיעור זה היא להדגים את השימוש במחלקה Sream Tokenizer.

 

- הקדמה

- מתודות

- תוכנית הדגמה

                  - מקטעי קוד מעניינים

                  - רישום תוכנית


הקדמה

המחלקה Stream Tokenizer מאפשרת לפרק (to parse) זרם קלט לקבוצה של אסימונים (tokens)ניתן לקרוא את האסימונים ולטפל בהם כל אחד בנפרד.

משתמשים בטבלה כדי לבקר את תהליך הפירוק (parsing process).

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

לכל בית שנקרא מזרם הקלט מתייחסים כתו בטווח של שש מקומות אחרי הנקודה

 hexadecimal range)) מ00 ל- FF.

הStream Tokenizer  מחשיב כל אחד מתווי הקלט כאחת משלושת האפשרויות הבאות:

- תו רווח שמפריד אסימונים בזרם הקלט

- תו שמשמש לתחום מחרוזת עם מירכאות

- תו רגיל שאינו תוחם (delimiter) , לא מקיף מחרוזת עם מירכאות, ואיננו אחד מהבאים:

                      - תו שהוא חלק ממילה

                      - תו שהוא חלק ממספר

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

הם נקבעים כדי לציין:

- האם terminators (תווים שמסיימים שורות) של שורות יוחזרו כאסימונים או שיתייחסו אליהם כרווח שסתם מפריד בין אסימונים.

- האם הערות C-style יזוהו וידלגו עליהם (/*…*/).

- האם הערות C++style יזוהו וידלגו עליהן (//…).

- האם תווים של מילים יוחלפו לאותיות קטנות.

אסימונים סדרתיים נשלפים מהזרם על ידי הפעלת המתודה nextToken() על אובייקט מהמחלקה Stream Tokenizer  אחרי שיוצרים לאובייקט מופע ומעבירים אובייקט של מחלקת הזרם  Reader כפרמטר לפונקציה הבונה. האובייקט של Reader מגדיר את הזרם שיפורק לאסימונים .

המתודה nextToken() תמיד מחזירה int שניתן להשתמש בו בכדי לפרש את האסימון.

המחלקה מכילה ארבעה קבועים של מחלקה. ערך הint  שמוחזר על ידי nextToken() יתאים תמיד לאחד מהקבועים או יכיל את הערך של התו. (מסתבר שהקבועים הם תמיד ערכי int שליליים שאין שום אפשרות שהם יתאימו לערך של תו בטווח  00 עד FF).

ארבעת הקבועים הם:

 TT_EOF קבוע המציין שסוף הזרם נקרא.

 TT_EOL קבוע המציין שסוף השורה נקרא.

 TT_NUMBER קבוע המציין שנקרא אסימון של מספר.

 TT_WORD קבוע המציין שנקרא אסימון של מילה.

בנוסף, המחלקה מספקת שלושה משתני מופע עם הרשאתpublic: nval, sval , ו- ttype.

לאחר קריאה למתודה nextToken, משתנה ה ttype מכיל את האובייקט שזה עתה נקרא. לאסימון שיש בו תו בודד, הערך שלו הוא התו הבודד המומר ל integer.

הערך של מחרוזת עם מירכאות, הוא התו עם הגרשיים  (“ or ’) אם לא, הערך שלה הוא אחד מהבאים:

 TT_WORD מציין שהאסימון הוא מילה.

 TT_NUMBER מציין שהאסימון הוא מספר.

TT_EOL  מציין שסוף השורה נקרא.

    הערך הזה יכול להיות לשדה אם קראו למתודה ()eollsSignificant עם ארגומנט true

 TT_EOF מציין שהגיעו לסוף זרם הקלט.

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

אם האסימון הנוכחי הוא אסימון מילה, sval מכיל מחרוזת הנותנת את התווים של האסימון מילה. כשהאסימון הנוכחי הוא אסימון מחרוזת מירכאות, sval מכיל את גוף (body) המחרוזת.

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

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

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

אלה המסקנות הכלליות שלי המבוססות על עריכת ניסוי בלבד:

במצב ברירת מחדל, תו הרווח (space) הוא תו רווח לבן המשמש להפרדת אסימונים בזרם.

רק האותיות הקטנות והגדולות הן תווי מילים.

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

לדוגמא: השילוב של /0  גרם לתוכנית שלי להחזיר TT_EOF עד שהפעלתי מתודה להכריח את התו / להתפרש כתו רגיל. אופן ההתנהגות היה כאילו הייתה הערת שורה בודדת, ומכיוון שלא היו שום תווי TT_EOL בזרם, לא הייתה התייחסות לתזכורת  של הקובץ בשלמותה.

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

(ordinary characters), אלא אם כן מופעלת אחת מהמתודות כדי לגרום להתייחס אליהם באופן שונה.

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

 29-11-03 / 17:24  עודכן ,  04-10-03 / 16:31  נוצר ע"י רונית רייכמן  בתאריך 
 מתקדמים - הקודםהבא - מתודות 
תגובות הקוראים    תגובות  -  0
דרכונט
מהי מערכת הדרכונט?
אינך מחובר, להתחברות:
דוא"ל
ססמא
נושאי לימוד
חיפוש  |  לא פועל
משלנו  |  לא פועל
גולשים מקוונים: 5