
一般詞法分析器和語法分析器會一起使用,語法分析器會調用詞法分析器來讀取輸入,詞法分析器匹配到特定的模式后,就向語法分析器報告(類型和值之類的)。也就是說,詞法分析器的工作,就是讀取、報告、再讀、再報告,而語法分析器的工作,就是調用詞法分析器讀取,以及根據(jù)詞法分析器的反饋,看輸入是否和語法規(guī)則匹配。
一、Lex
Lex 是一種生成掃描器的工具。掃描器是一種識別文本中的詞匯模式的程序。 這些詞匯模式(或者常規(guī)表達式)在一種特殊的句子結構中定義。
一種匹配的常規(guī)表達式可能會包含相關的動作。這一動作可能還包括返回一個標記。
1、當 Lex收到文件或文本形式的輸入時,它試圖將文本與常規(guī)表達式進行匹配。 它一次讀入一個輸入字符,直到找到一個匹配的模式。 如果能夠找到一個匹配的模式,Lex 就執(zhí)行相關的動作(可能包括返回一個標記)。
2、另一方面,如果沒有可以匹配的常規(guī)表達式,將會停止進一步的處理,Lex 將顯示一個錯誤消息。
Lex 和 C 是強耦合的。一個 .lex 文件(Lex 文件具有 .lex 的擴展名)通過 lex 公用程序來傳遞,并生成 C 的輸出文件。這些文件被編譯為詞法分析器的可執(zhí)行版本。
二、Yacc
Yacc 代表 Yet Another Compiler Compiler。 Yacc 的 GNU 版叫做 Bison。它是一種工具,將任何一種編程語言的所有語法翻譯成針對此種語言的 Yacc 語 法解析器。它用巴科斯范式(BNF, Backus Naur Form)來書寫。按照慣例,Yacc 文件有 .y 后綴。
三、flex:詞法分析器
flex是一個詞法分析器,一個Lex的GNU實現(xiàn)。用來將一個.l文件生成一個.c程序文件。即生成一個詞法分析器。然后讀取輸入,和正則表達式匹配,再執(zhí)行相應的動作,實現(xiàn)了程序的功能。
我們可以發(fā)現(xiàn)flex實現(xiàn)在程序外部就可以接受輸入的功能。
四、bison:語法分析器
一個Yacc的GNU實現(xiàn),根據(jù)文法把一系列的記號轉換成一個語法分析樹。
五、re2c:詞法解析器
re2c是一個掃描器制作工具,可以創(chuàng)建非常快速靈活的掃描器。它可以產(chǎn)生高效代碼,基于C語言,可以支持C/C++代碼。 與其它類似的掃描器不同,它偏重于為正則表達式產(chǎn)生高效代碼(和他的名字一樣)。因此,這比傳統(tǒng)的詞法分析器有更廣泛的應用范圍。
PHP在最開始的詞法解析器是使用的是flex,后來PHP的改為使用re2c。 在源碼目錄下的Zend/zend_language_scanner.l 文件是re2c的規(guī)則文件, 如果需要修改該規(guī)則文件需要安裝re2c才能重新編譯。
六、php使用的詞法解析器和語法解析器
詞法解析器:re2c
語法解析器:bison
參考
1、Yacc 與 Lex 快速入門
2、The Lex & Yacc Page
3、PHP的詞法解析器:re2c
4、Bison的使用
5、PHP語法分析器:RE2C && BISON 總結
6、編譯技術,從BNF范式到文法識別簡介
7、flex&bison 學習筆記