<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 46.3\. 分析器階段 _分析器階段_含兩個部分: * 在`gram.y`和`scan.l`里定義的_分析器_ 是使用 Unix 工具bison和flex創建的。 * _轉換處理_對分析器返回的數據結構進行修改和增補。 ## 46.3.1\. 分析器 分析器必須檢查(以純 ASCII 文本方式到來的)查詢字符串的語法。如果語法正確, 則創建一個_分析樹_并將之傳回,否則,返回一個錯誤。 實現分析器和詞法器使用了著名的 Unix 工具bison和flex。 _詞法器_在文件`scan.l`里定義, 負責識別_標識符_和 _SQL 關鍵字_等。 對于發現的每個關鍵字或者標識符都會生成一個_記號_并且傳遞給分析器。 分析器在文件`gram.y`里定義并且包含一套_語法規則_ 和觸發規則時執行的_動作_。動作代碼(實際上是 C 代碼)用于建立分析樹。 文件`scan.l`用flex轉換成 C 源文件 `scan.c`,而`gram.y`用bison 轉換成`gram.c`。在完成這些轉換后,一個通用的 C 編譯器就可以用于創建分析器。 千萬不要對生成的 C 源文件做修改,因為下一次調用flex 或bison時會把它們覆蓋。 > **Note:** 上面提到的轉換和編譯是使用跟隨PostgreSQL發布的 _makefiles_自動完成的。 對bison或者`gram.y` 里的語法規則的詳細描述超出本文的范圍。有很多關于flex 和bison的書籍和文檔。你在開始研究`gram.y` 里給出的語法之前應該對bison很熟悉,否則你是看不懂那里面的內容, 理解不了發生了什么事情的。 ## 46.3.2\. 轉換處理 分析器階段只使用和 SQL 語法結構相關的固定規則創建一個分析樹。它不會查找任何系統表, 因此就不可能理解請求查詢里面的詳細的語意。在分析器技術之后, _轉換處理_接受分析器傳過來的分析樹然后做進一步處理,解析哪些查詢中引用了哪個表、 哪個函數、哪個操作符的語意。所生成的表示這個信息的數據結構叫做_查詢樹_。 把裸分析和語意分析分成兩個過程的原因是系統表查找只能在一個事務中進行, 而不想在一接收到查詢字符串就發起一個事務。裸分析階段已經足夠可以標識事務控制命令( `BEGIN`,`ROLLBACK`等),并且這些東西不用任何進一步的分析就可以執行。 一旦知道正在處理一個真正的查詢(比如`SELECT`或`UPDATE`), 就可以發起一個事務了(如果還沒開始這么一個)。只有這個時候可以調用轉換處理。 轉換處理生成的查詢樹結構上在很大程度上類似于裸分析樹,但是在細節上有很多區別。 比如,在分析樹里的`FuncCall`節點代表那些看上去像函數調用的東西。 根據引用的名字是一個普通函數還是一個聚集函數,這個可能被轉換成一個`FuncExpr` 或`Aggref`節點。同樣,有關字段和表達式結果的具體數據類型也添加到查詢樹中。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看