支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

50.3. 解析器階段 #

解析器階段包含兩個部分

  • gram.yscan.l 中定義的解析器是使用 Unix 工具 bisonflex 構建的。

  • 轉換過程對解析器傳回的資料結構進行修改和擴充。

50.3.1. 解析器 #

解析器必須檢查查詢字串(以純文字形式傳入)的語法是否有效。 如果語法正確,則建立並傳回語法分析樹; 否則傳回錯誤。 解析器和詞法分析器是使用著名的 Unix 工具 bisonflex 實現的。

詞法分析器在檔案 scan.l 中定義,負責識別識別符號SQL 關鍵字等等。 對於找到的每個關鍵字或識別符號,都會產生一個符記並傳遞給解析器。

解析器在檔案 gram.y 中定義,由一組文法規則動作組成,這些規則和動作會在規則觸發時執行。 動作的程式碼(實際上是 C 程式碼)用於建構語法分析樹。

檔案 scan.l 使用程式 flex 轉換為 C 原始碼檔案 scan.c,而 gram.y 使用 bison 轉換為 gram.c。 這些轉換發生後,可以使用普通的 C 編譯器來建立解析器。 永遠不要對產生的 C 檔案進行任何變更,因為下次呼叫 flexbison 時,它們將被覆寫。

注意

前面提到的轉換和編譯通常使用 PostgreSQL 原始碼發佈版附帶的 makefile 自動完成。

bisongram.y 中給出的文法規則的詳細描述超出了本手冊的範圍。 有許多書籍和文件介紹 flexbison。 在開始研究 gram.y 中給出的文法之前,您應該熟悉 bison,否則您將無法理解那裡發生的事情。

50.3.2. 轉換過程 #

解析器階段僅使用有關 SQL 語法結構的固定規則來建立語法分析樹。 它不會在系統目錄中進行任何查詢,因此無法理解所請求操作的詳細語意。 解析器完成後,轉換過程會將解析器傳回的樹作為輸入,並執行語意解釋,以了解查詢引用的表、函數和運算符。 用於表示此資訊的資料結構稱為查詢樹

將原始剖析與語意分析分離的原因是,系統目錄查詢只能在交易中完成,而我們不希望在收到查詢字串後立即啟動交易。原始剖析階段足以識別交易控制命令(例如 BEGINROLLBACK 等),然後可以正確執行這些命令,而無需進一步分析。一旦我們知道我們正在處理實際的查詢(例如 SELECTUPDATE),如果我們還沒有在交易中,那麼就可以啟動一個交易。只有這樣才能調用轉換過程。

轉換過程建立的查詢樹在結構上與原始剖析樹在大多數地方相似,但在細節上有很多差異。例如,剖析樹中的 FuncCall 節點表示在語法上看起來像函數呼叫的東西。這可能會轉換為 FuncExprAggref 節點,具體取決於引用的名稱是普通函數還是聚合函數。此外,關於欄位和表達式結果的實際數據類型的信息會被添加到查詢樹中。

提交更正

如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的地方,請使用此表格來報告文件問題。