本節書摘來自華章出版社《編譯與反編譯技術實戰 》一書中的第1章,第1.3節,龐建民 主編 ,劉曉楠 陶紅偉 嶽 峰 戴超 編著,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
文法分析的任務是分析句子是否符合文法規範。yacc(yet another compiler compiler)是一個經典的文法分析生成器。yacc最初是由at&t公司的steven c. johnson為unix作業系統開發的,後來一些相容的程式如berkeley yacc、gnu bison、mks yacc和abraxas yacc陸續出現,它們都是在此基礎上做了少許改進或者增強,但是基本概念是相同的。現在yacc也已普遍移植到windows及其他平台上。
文法分析生成器是一個指定某個格式中的一種語言的文法作為它的輸入,并為該語言産生分析過程以作為它的輸出的程式。在曆史上,文法分析生成器被稱作編譯–編譯程式,這是由于按照規律可将所有的編譯步驟作為包含在文法分析程式中的動作來執行。現在的觀點是将文法分析程式僅考慮為編譯處理的一個部分,是以這個術語也就有些過時了。yacc迄今為止仍是常用的文法分析生成器之一。
作為yacc對說明檔案中的“%token number”聲明的對應,yacc 堅持定義所有的記号本身,而不是從别的地方引入一個定義,但是卻有可能通過在記号聲明中的記号名之後書寫一個值來指定将賦給記号的數字值。
yacc的輸入是巴科斯範式(bnf)表達的文法規則以及文法歸約的處理代碼,yacc輸出的是基于表驅動的編譯器,包含輸入的文法歸約的處理代碼部分。
由于所産生的解析器需要詞法分析器的配合,是以yacc經常和詞法分析器的産生器(通常就是lex)聯合使用,把兩部分産生的c程式一并編譯。ieee posix p1003.2标準定義了lex和yacc的功能和需求。
需要指出的是,本書的第4章還有對yacc及其用法更加詳細的介紹。