词法分析阶段就是从输入流里边一个字符一个字符的扫描,识别出对应的词素,最后把源文件转换成为一个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开头(下文会说明)。