29 December 2005

Conditional Expression

ภาษา C จะมี conditional expression (?:) ซึ่งทำหน้าที่เป็น if statement สำหรับ expression โดยเฉพาะ เช่น

int a, b;
...
a = b==1 ? 1 : 2;
...

จะกำหนดค่าของ a เป็น 1 หรือ 2 ขึ้นอยู่กับค่าของ b ดังนั้น conditional expression ในกรณีนี้ จึงทำงานเหมือน

if (b==1)
  a=1;
else
  a=2;

เมื่อวานนี้หลังจากลองทำการบ้านแล็บที่ให้นักศึกษาไป เพิ่งรู้ว่าภาษาซี จะกำหนด type ของ conditional expression ในเวลา compile โดยส่วนใหญ่อาศัยกฎ implicit cast เลยขอจดเอาไว้หน่อย เช่น

int a,b;
int i;
float f;
...
a = b==1 ? i : f;
...

Type ของ conditional expression นี้ จะเป็น float เนื่องจากมี int กับ float เป็น operand ที่ 2 กับ 3 จึงเป็นไปตามกฎคือ เปลี่ยน int เป็น float ดังนั้น ใน expression นี้ ถึงแม้ว่า b จะมีค่าเท่ากับ 1 ก็จะเกิดการ promote ค่า i ให้เป็น float ก่อน แล้วจึง demote กลับไปเป็น int อีกครั้งเวลากำหนดค่าให้ a

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

01 December 2005

กรรม

ช่วงนี้มีการเปลี่ยนระบบทีวีของหอพักใหม่ เลยมีช่องทีวีผ่านดาวเทียมแปลกๆ ให้ดู เปิดไปเปิดมา มีรายการที่เกี่ยวกับเรื่องเวรกรรม ดูแล้วทึ่งกับความสามารถของนักบวชคนนั้นจริงๆ แค่คนที่มาปรึกษาเล่าว่า ตอนนี้ลำบากอย่างนั้น มีปัญหาอย่างนี้ ก็สามารถบอกได้เลยว่าสมัยก่อนไปทำโน้นทำนี้ไว้ ทำให้กลายเป็นกรรมส่งผลมาถึงปัจจุบัน ถ้าอยากจะแก้ไข ก็ให้ไปทำอย่างนั้นอย่างนี้ตามที่บอก ก็จะสามารถแก้กรรมเก่าได้

ฟังช่วงแรกก็เฮ้อ..... แต่ฟังไปฟังมาแล้วก็ขำดี ขำตรงที่ขนาดเจ้าตัวบอกจำไม่ได้ว่าไปทำกรรมไว้จริงหรือเปล่า แต่ก็เชื่อนักบวชนั้นว่าเคยทำจริงๆ แถมยังจะไปแก้กรรมตามที่บอกด้วย เฮ้อ.... ตัวเองก็ไม่ได้ศึกษาพุทธศาสนาลึกซึ้งเท่าไรหรอกนะ แต่พุทธศาสนาไม่เคยสอนเรื่องล้างบาป หรือแก้กรรมไม่ใช่หรือ ? ถ้าเราเคยทำกรรมชั่วไว้ เราก็ต้องไปรับผลกรรมนั้นสักวันหนึ่ง เพียงแต่ว่าเราอาจจะเจือจางผลนั้นได้ ด้วยการทำกรรมดี เหมือนการเติมน้ำเพิ่มลงไปในน้ำเกลือ ถ้าเติมไปเรื่อยๆ รสเค็มก็จะค่อยๆ จางหายไปเอง ไม่ใช่หรือ ?