24 December 2005

สร้างโปรแกรมเครื่องคิดเลขด้วย flex กับ bison

ช่วงนี้ไม่ได้เขียนเรื่องใหม่ๆ เนื่องจากมีภาระอยู่กับการเตรียมสอน เลยเอาเรื่องเกี่ยวกับการใช้ 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:

Anonymous said...

วิชานี้สนุกที่สุดเลย
แต่ลืมไปหมดแล้ว

Anonymous said...

ลืมไปแล้วเหมือนกัน เพิ่งจะมาอ่านใหม่ ตอนเตรียมสอนนี่แหละ

Anonymous said...

เป็นวิชาที่ไม่ตั้งใจเรียนเอาซะเลย ในห้อง
แต่ตอนทำแล็บก็สนุกดี แม้จะไม่ค่อยเข้าใจ มั่ว ๆ เอา


แล้วทำไปทำมา ตอนนี้ต้องมาทำงานเขียน parser
... หนีไม่พ้นจริง ๆ :P

(อะไรที่เคยบ่นว่า "เรียนไปทำไมวะ" ตอนนี้ใช้หมด !)

Anonymous said...

เอ่อ... อย่าให้อ.เอกวิชญ์รู้นะครับ ฮ่ะฮ่ะ :P