ช่วงนี้ไม่ได้เขียนเรื่องใหม่ๆ เนื่องจากมีภาระอยู่กับการเตรียมสอน เลยเอาเรื่องเกี่ยวกับการใช้ flex กับ bison ซึ่งเป็นเครื่องมือสำหรับสร้างคอมไพเลอร์ที่กำลังสอน มาเขียนลงไว้หน่อยเพื่อเตือนความจำตัวเอง และอาจจะเป็นประโยชน์ต่อคนอื่นๆ ที่กำลังจะใช้ด้วย
เริ่มจาก flex ซึ่งเป็นเครื่องมือสำหรับสร้าง lexical analyzer ซึ่งส่วนของคอมไพเลอร์ที่ใช้วิเคราะห์เพื่อแบ่งข้อมูลเข้า (ในที่นี้คือโปรแกรม) ออกเป็นส่วนๆ ที่เรียกว่า token โดย token เปรียบเสมือนคำในภาษาคอมพิวเตอร์ เช่น ชื่อตัวแปร ชื่อฟังก์ชัน หรือ เครื่องหมาย หรือตัวดำเนินการต่างๆ การวิเคราะห์ token นี้จะทำโดยการระบุรูปแบบ (pattern) ของ token แต่ละประเภท ด้วย regular expression เช่น ชื่อตัวแปรในภาษาซี คือ สายอักขระที่เริ่มต้นด้วย a-z A-Z หรือ _ (underscore) แล้วตามด้วยตัวอักษร ตัวเลข หรือ _ (underscore) จะกำหนดด้วย [a-zA-Z_][a-zA-Z0-9_]* ในที่นี้ [] ใช้กำหนดเซตของตัวอักษร ส่วน * หมายถึง Kleene closure หรือสายอักขระที่สร้างจากเซตที่มีความยาวอย่างน้อย 0 ตัว ดังนั้นจะเขียน lex specification file สำหรับโปรแกรมเครื่องคิดเลข ได้คือ
%{ #include"y.tab.h" %} %% [0-9]+ { yylval=atoi(yytext); return NUMBER; } "+"|"-"|"*"|"/"|"("|")" { return yytext[0]; } \n { return yytext[0]; } [ \t] { } . { printf("Error in lexical analyzer.\n"); } %%
มีการกำหนด token หลักๆ 2 แบบ ใน specification file นี้ คือ token สำหรับตัวเลข (NUMBER) ซึ่งเกิดจากตัวเลข ตั้งแต่หนึ่งตัวขึ้นไป โดยนอกจากจะส่งค่า token NUMBER และ ยังส่งค่าของตัวเลขนั้น ไปยัง parser ผ่านทางตัวแปร yylval
4 comments:
วิชานี้สนุกที่สุดเลย
แต่ลืมไปหมดแล้ว
ลืมไปแล้วเหมือนกัน เพิ่งจะมาอ่านใหม่ ตอนเตรียมสอนนี่แหละ
เป็นวิชาที่ไม่ตั้งใจเรียนเอาซะเลย ในห้อง
แต่ตอนทำแล็บก็สนุกดี แม้จะไม่ค่อยเข้าใจ มั่ว ๆ เอา
แล้วทำไปทำมา ตอนนี้ต้องมาทำงานเขียน parser
... หนีไม่พ้นจริง ๆ :P
(อะไรที่เคยบ่นว่า "เรียนไปทำไมวะ" ตอนนี้ใช้หมด !)
เอ่อ... อย่าให้อ.เอกวิชญ์รู้นะครับ ฮ่ะฮ่ะ :P
Post a Comment