PHP-7.1 原始碼學習:詞法分析

xingpingz發表於2019-02-16

前言

yylex

bison 語法分析器呼叫 yylex 獲取詞法單元,對於複雜的語言實現一般都會自定義 yylex,搜尋 yylex 的巨集定義

# grep -rin --color --include=*.h "#define yylex"
Zend/zend_language_parser.c:64:#define yylex zendlex

搜尋 zendlex 函式的定義

# grep -rin --color --include=*.c zendlex
Zend/zend_language_parser.c:1689:int zendlex(zend_parser_stack_elem *elem)

開啟 zend_language_parser.c 檔案檢視 zendlex 函式定義

int zendlex(zend_parser_stack_elem *elem) {
    zval zv;
    int retail;

    ...

again:
    ZVAL_UNDEF(&zv);
    retval = lex_scan(&zv);
    if (EG(Exception)) {
        return T_ERROR;
    }

    switch (retval) {
        ...
    }

    return retval;
}

這裡出現了兩個新的資料型別 zval,zend_parser_stack_elem,從命名推測 zend_parser_stack_elem 是語法分析棧元素(語法分析樹節點),搜尋程式碼裡面哪些地方引用了 zend_parser_stack_elem

grep --color -rinw --include=*.c --include=*.h zend_parser_stack_elem
Zend/zend_compile.h:130:} zend_parser_stack_elem;
Zend/zend_language_parser.c:108:#define YYSTYPE zend_parser_stack_elem

開啟 zend.compile.h 檔案 130 行,zend_parser_stack_elem 是一個聯合體的 typedef

typedef union _zend_parser_stack_elem {
    zend_ast *ast;
    zend_string *str;
    zend_ulong num;
} zend_parser_stack_elem;

zend_language_parser.c 檔案的 108 行表明 zend_parser_stack_elem 是 詞法分析模組 傳遞給 語法分析模組的 token value

總結

相關文章