Lex & YACC (ตอนที่ 1)

บทความนี้ อาจมีการอ้างอิงทฤษฎีพื้นฐานของภาษาโปรแกรม (Programming Language) และการสร้างคอมไพเลอร์ ผู้อ่านควรมีความรู้พื้นฐานในส่วนนี้เล็กน้อย เพื่อที่จะทำความเข้าใจได้เร็วขึ้น

Lex และ YACC นั้นมักใช้ช่วยในการเขียนซอฟต์แวร์ประเภทคอมไพเลอร์ หรือซอฟต์แวร์ที่มีการรับข้อมูลเข้าเป็น Text และมี Pattern ที่แน่นอน ซึ่งจะช่วยประหยัดเวลาในการพัฒนาได้เป็นอย่างมาก สำหรับปัจจุบันเราจะใช้งานโปรแกรมที่มีชื่อว่า Flex และ Bison แทน Lex และ YACC ซึ่งขั้นตอนการติดตั้งนั้นไม่ลำบากมากนัก สำหรับผู้ที่ใช้ Linux ก็เพียงแต่ดาวน์โหลด package ที่มีชื่อว่า flex และ yacc (เช่น sudo apt-get install flex bison สำหรับ Ubuntu) และสำหรับผู้ที่ใช้ Windows ก็เพียงแต่ติดตั้ง Cygwin และเพียงแต่เพิ่ม package ชื่อ flex และ bison ระหว่างติดตั้งเข้าไปด้วยนั่นเอง


ภาพจาก http://msdn.microsoft.com/en-us/magazine/cc136756.aspx

Flex เป็นโปรแกรมสำหรับสร้างโค้ดภาษา C ที่ซึ่งทำหน้าที่เป็น Scanner หรือ Lexical analyzer ในคอมไพเลอร์ เจ้า Scanner ที่ว่านี้จะทำหน้าที่เป็นตัวเปลี่ยน input ทั้งหมดที่เป็นสตริงให้กลายเป็น Token หรือหน่วยพื้นฐานที่สุดสำหรับที่เราสนใจและจะนำไปตรวจสอบไวยากรณ์หรือ Pattern อีกทีที่ตัว Parser ตัวอย่างเช่น สตริงที่รับเข้ามาเป็น 512 + 456 ซึ่งเป็นตัวอักษร 7 ตัวด้วยกัน แต่สำหรับที่เราสนใจแล้ว 512 นั้นเป็น Token เดียวกันนั่นคือเป็นตัวเลข การแปลงสตริงทั้งหมดเป็น Token นี่แหละคือหน้าที่ของ Flex

Bison นั้นก็ทำหน้าที่คล้ายกับ Flex คือเป็นโปรแกรมสำหรับสร้างโค้ดภาษา C ที่ทำหน้าที่เป็น Parser หรือ Syntax Analyzer ที่เป็นตัวตรวจสอบไวยากรณ์ของ Token ทั้งหมดว่าเป็นไปตามรูปแบบที่ถูกต้องหรือไม่ ซึ่งเราจะเขียนไวยากรณ์ในรูปแบบของไฟล์ .y (ตัวไวยากรณ์จะเขียนคล้ายกับ BNF มาก) และใช้ Bison คอมไพล์ไฟล์ .y เพื่อสร้างโค้ดภาษา C ที่ทำหน้าที่เป็น Parser และเรียกใช้ด้วย yyparse()

สรุปคือทั้ง Flex และ Bison (Lex และ YACC) นั้นเป็นโปรแกรมที่ทำหน้าที่คล้ายกับคอมไพเลอร์ เพื่อช่วยสร้างโค้ดภาษา C สำหรับสร้างคอมไพลเอร์อีกต่อหนึ่ง (ซอฟต์แวรที่เราต้องการสร้างอาจไม่ใช่คอมไพเลอร์โดยตรง แต่มีลักษณะคล้ายในส่วนที่ว่าต้องรับเข้ามูลเป็นข้อความที่มีรูปแบบ (Pattern)) ในตอนหน้าจะมาต่อกันที่การเขียน Scanner ด้วย Flex ครับ

ปล. ชื่อเต็มของ YACC คือ Yet Another Compiler Compile ซึ่งถึงจะดูตรงไปตรงมา แต่ก็เท่ดีเหมือนกัน (มันเท่ตรงที่ตรงไปตรงมานี่แหละครับ)

Taxonomy upgrade extras: