詞法分析階段就是從輸入流里邊一個字符一個字符的掃描,識別出對應的詞素,最后把源文件轉換成為一個TOKEN序列,然后丟給語法分析器。從詞法分析階段中,詞法分析器也能檢測到源代碼里邊的一些錯誤。例如在Zend引擎的詞法分析階段就有這樣一段代碼: zend_error(E_COMPILE_WARNING, "Unterminated comment starting line %d", CG(zend_lineno));當檢測到/*開頭,但是沒有*/結尾時,Zend引擎會拋出一個Waring提示,但是并不影響接下來的詞法解析,詞法分析階段一般都不會造成嚴重的解析錯誤,因為詞法分析階段的職責就是識別出Token序列而已,它并不需要知道Token跟Token之間是否具備什么聯系(那個應該是語法分析階段的職責)。在Zend引擎的詞法分析器中也會拋出致命的解析錯誤而終止詞法分析階段,如下代碼: zend_error_noreturn(E_COMPILE_ERROR, "Could not convert the script from the detected " "encoding /"%s/" to a compatible encoding", zend_multibyte_get_encoding_name(LANG_SCNG(script_encoding)));這個解析錯誤是因為從輸入流里邊檢測到的代碼的編碼不合法,顯然,這里是應該終止掉整個解析過程的。Zend引擎的詞法分析器re2c來生成,詞法分析的階段會涉及到各個狀態,其變量命名均為yy開頭(下文會說明)。