lex 與 yacc 是給程式設計師用的工具,一種第一眼就會愛上一輩子的工具。
在還沒有遇見 lex 與 yacc 之前,你的生活還是可以過得下去,只是每次在寫程式中的解析部分(parsing)時,總是覺得繁雜;只是每次在讀取使用者輸入的命令時,總是掛一漏萬,顧到了這裡就忘了那裡。有的時候你也許會想:如果有人可以幫我處理這些看起來不同其實本質相同卻很無趣的工作,多好!
看完這本《lex & yacc》之後,會不會有那麼一點想見恨晚的感覺?
恨的是有這麼強大的工具為什麼到現在我才知道?不禁讓人開始懷疑從前那些虛擲的精力與浪費的時間。過去花去最寶貴的生命所寫出來的字彙分析器或解析器,竟然不如 lex 與yacc 所自動產生出來的?更氣人的是:原來需要幾百幾千行的程式,現在居然只要簡單地下幾行規格就可以完成?
如果你已經嚐過字彙分析器與解析器的痛苦,lex 與 yacc 會是你的解藥;如果你還不感受過這種痛苦,lex 與 yacc 會是你的抗體。不管是解藥還是抗體,下次在遇到字彙分析器與解析器的問題,你應該會毫不猶豫地想到:沒錯!這用 lex 與 yacc 就可以輕鬆解決了。
突然間,你會發現什麼問題好像都可以用 lex 與 yacc 來解決。使用者輸入的資料、從 WWW 上取得的 HTML 文件、news 或是 BBS 的上的文章……、等等。也許是 lex 與 yacc 太平易近人以致於讓你輕易愛上他們,不過背後的真正原因是:我們經常處裡的資料都是很有結構性(well-organized)的資料。
要從一篇新聞稿中取出事件的人、事、時、地、物到目前為止還是人類做的最好,但是要從HTML 文件中取出 TITLE(標頭)、Hyperlink 等資訊,無疑地,電腦程式可以幫我們輕易地找出來,而且是自動地、效率也相當好。在電腦的世界有的是數不完的結構性資料(所謂的結構性,另一種說法就是電腦比較容易看懂的樣子),而這些擷取與組合資訊的電腦程式就很適合用 lex 與 yacc 來完成。
lex 與 yacc 要怎麼使用,本書自有相當多的範例,跟著一步步往前進,自會有一些體會;慢慢地,下次再遇到某些問題,你才會想到;啊!這可以用 lex 來解決!或是用 yacc 來解決!套用語言學上的術語來看,lex 處理的是 morphology(構詞學)上的問題,而 yacc 處理的是 syntax(句法學)上的問題。
lex 與 yacc 是 UNIX 上的傳統,不過這也造成一生下來就跟 Wintel 長大的人很少聽過 lex 與 yacc,就像外國人很少知道什麼叫夜市,除非到過台灣。要知道就算是目前最熱門的 Java 語言,仍然有人要寫一個可以產生 Java 程式碼的 yacc,更遑論 lex 與 yacc 原本就是用來配合最具工業強度(industry-strength)的 C 語言。
不過,lex 與 yacc 就像是汽車一般。從台南到台北可以用走的,不過要是你有汽車,很少人不選擇用開車的。雖然開車要經過學習跟考試,要瞭解什麼是排檔跟離合器,不過想到可以在二高上面馳騁,我想你不會因為要學 lex 與 yacc 而覺得很辛苦。
開車並不難學,只要有好的教練;同樣地,lex 與 yacc 也不難學,只要你好好看這本書。