SQL語法分析 基礎篇

2021-08-25 02:35:45 字數 1729 閱讀 6556

先上個簡單的sql語句(mysql):

「select c1,c1+3 as c2,c3 aliasc3,」字串」 from table1 where id>1 and id<100」

從表table1中查詢id大於1小於100的記錄。

查詢的字段為列c1,根據c1計算得到的c2,別名為aliasc3的c3,還有乙個匿名字段 字串常量」字串」.

這條簡單的select查詢語句可以分為三部分:

1.查詢的輸出字段(緊接關鍵字select之後)

2.查詢的表(緊接關鍵字from之後)

3.過濾條件(緊接關鍵字where之後)

用程式要如何解析這條語句呢?

首先,我們遇到了關鍵字「select」,之後遇到乙個空格,這時我們開始記錄輸出欄位的內容,然後我們遇到了關鍵字」from」,記錄查詢表的內容,直到遇到關鍵字」where」,這後面就是過濾條件,記錄它。

這樣我們就得到了這條語句的三個部分。但是這還遠遠不夠,下面來看字段列表部分:

字段之間用逗號分隔,單個欄位的內容可能(只是列名,使用as指定了別名的列,列需要使用表示式計算,常量)。

單純的列名很簡單,使用了別名的列,有as關鍵字也很好處理,as關鍵字之前為表示式(我們將列名看作變數),之後為別名。

沒有as關鍵字的別名表示式,在讀取完乙個表示式後遇到空白,空白後是乙個有效的欄位名稱,之後再沒有其他內容。

最後乙個字串常量的匿名字段,沒有指定別名,所以它是乙個常量表示式。

根據以上規則,我們姑且將as當作「別名運算子」,這樣就可以將所有輸出列的內容抽象為乙個「表示式物件」。

//表示式介面

inte***ce iexpression

//二元表示式,包含乙個左運算元,右運算元,運算子

class binaryexpression:iexpression

//右運算元

public iexpression right

//運算子

public

string operator

//實現介面的「計算表示式的值」

public

object

calculate()

else

if(operator=="-")

else

if(……)

}//函式表示式

class functionexpression:iexpression

//函式的引數列表

public iexpression params

}…………

}

再看查詢表部分,實際上mysql(以及其他資料庫)的查詢語句還支援查詢多個表和從查詢結果中再次查詢(子查詢),我們可以將查詢表的列表也看作是乙個表示式列表。

過濾條件部分,憑經驗可以知道,它就是乙個邏輯運算表示式。

綜上,我們現在可以將一條查詢語句抽象為如下模型:

class select

//要查詢的字段

public iexpression fields

//查詢條件

public iexpression condition

……//還有其他的連線查詢、排序、分組、聯合等請檢視完整原始碼。

}

這樣我們就可以通過一步步解析得到乙個select語句的完整結構。

通過這個結構我們就可以生成各種資料庫的通用查詢語句。

語法分析語句篇

語句分為 復合語句 if語句 return 語句 break 語句 continue 語句 for 語句 表示式語句 復合語句 宣告語句 宣告在前,語句在後,宣告可以有多個,語句可以有多個 如int a,b int x 2,y 5 語句就是個復合語句 表示式語句 或 表示式 if語句 if 表示式 ...

語法分析 自上而下分析

語法分析 是編譯過程的核心部分。它的任務是在詞法分析識別出單詞符號串的基礎上,分析並判定程式的語法結構是否符合語法規則。語言的語法結構是用上下文無關文法描述的。因此,語法分析器的工作本質上就是按文法的產生式,識別輸入符號串是否為乙個句子。這裡所說的輸入串是指由單詞符號 文法的終結符 組成的有限序列。...

編譯原理(三)語法分析基礎

1.根據文法規則,從源程式單詞符號串中識別出語法成分,並進行語法檢查,未予以分析和 生成做準備。2.兩大分析方法 自頂向上分析與自底向上分析。1.自頂向下分析方法 直觀理解為從開始符號出發,依據規則建立推導序列,最後推至目標字串。2.存在主要問題 3.主要解決方法 1.自底向上分析方法 直觀理解,從...