91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PostgreSQL 源碼解讀(167)- 查詢#87(基礎知識-語法分析器Bison)

發布時間:2020-08-04 14:29:31 來源:ITPUB博客 閱讀:169 作者:husthxd 欄目:關系型數據庫

輸入一條SQL語句,PostgreSQL如何解析輸入的SQL,識別SQL類型以及基表/字段等信息?接下來的幾節將逐一進行解析.
本節介紹了開源工具語法分析器Bison.

一、Bison

基本概念
Bison是一個語法分析器,和Flex配合使用,它可以將用戶提供的語法規則轉化成一個語法分析器。Flex生成token stream,Bison根據定義的產生式和動作表來解析token stream,從而解析句子.
Bison自定義語法文件,一般以.y作為文件擴展名,其格式如下:


%{
Declarations
%}
Definitions
%%
Productions
%%
User subroutines

其中Declarations(聲明)和 User subroutines(用戶自定義過程)和Flex的.l文件是一樣的,Bison會將這些代碼原樣的拷貝到y.tab.c文件中;Definitions(定義)段和Flex類似,也是在這個段定義一些Bison專有的變量,稍后再解釋這個文件中的這個段里的代碼;最重要的是Productions 段,這里面是用戶編寫的語法產生式.

示例
下面用Flex和Bison實現一個簡單的乘法器.
mul.l
詞法文件


%{
#include "y.tab.h"
void yyerror(const char *msg);
void undefined_char(char c);
%}
%%
[0-9]+          { yylval = atoi(yytext); return T_NUMBER; }
[*()\n]        { return yytext[0]; }
.               { return 0; /* end when meet everything else */ }
%%
int yywrap(void) { 
    return 1;
}
void undefined_char(char c) {
    char buf[32] = "Unrecognized character: ?";
    buf[24] = c;
    yyerror(buf);
}
void yyerror(const char *msg) {
    printf("Error :%s\n", msg);
    exit(1);
}

mul.y
語法文件


%{
#include <stdio.h>
%}
%token T_NUMBER
%left '*'
%%
S   :   S E '\n'        { printf("result = %d\n", $2); }
    |   /* empty */     { /* empty */ }
    ;
E   :   E '*' E         { $$ = $1 * $3; }
    |   T_NUMBER        { $$ = $1; }
    ;
%%
int main() {
    return yyparse();
}

makefile


CC = gcc
OUT = mul
OBJ = lex.yy.o y.tab.o
MUL_L = mul.l
MUL_Y = mul.y
build: $(OUT)
run: $(OUT)
    ./$(OUT)
clean:
    rm -f *.o lex.yy.c y.tab.c y.tab.h y.output $(OUT)
$(OUT): $(OBJ)
    $(CC) -o $(OUT) $(OBJ)
lex.yy.c: $(MUL_L) y.tab.c
    flex $<
y.tab.c: $(MUL_Y)
    bison -vdty $<

執行:


[xdb@localhost mul]$ make run
./mul
23*3
result = 69

二、參考資料

Bison

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

若羌县| 新兴县| 广饶县| 松潘县| 车致| 汕尾市| 襄樊市| 凤城市| 青龙| 云浮市| 吉木乃县| 凤冈县| 通许县| 宁晋县| 合川市| 文化| 滕州市| 刚察县| 蚌埠市| 渝中区| 尉氏县| 龙门县| 宝丰县| 京山县| 伊川县| 那坡县| 沐川县| 绥宁县| 茌平县| 临清市| 武邑县| 麻栗坡县| 岳阳县| 许昌市| 峡江县| 巴林左旗| 通山县| 娱乐| 库车县| 新泰市| 双城市|