Sqlite3之Lemon語法解析器初探(1)

2022-09-12 05:24:17 字數 2390 閱讀 4249

看sqlite3原始碼發現用到了lemon語法解析器 ,然後發現一本好的lemon教程

然後參考裡面的例子 做了一些例子。

lemon語法分析器 非常小巧 只依賴於兩個檔案 。

以下的**實現乙個計算器程式。初步的沒有加入詞法生成器,直接呼叫了parse函式來做運算。**中包含注釋,以下並解釋具體點。

//在生成的檔案中包含以下標頭檔案

%include

//計算器裡面型別都是整形

%token_type

//計算符結合方法都是左結合的方法

//之所以分開寫是因為 下面的運算子級別高於上面的 這裡是乘除高於加減

%left plus minus.

%left divide times.

%syntax_error

//意思就是expr定義為乙個公式

program ::=expr(a).

expr(a) ::=expr(b) minus expr(c).

expr(a) ::=expr(b) plus expr(c).

expr(a) ::=expr(b) times expr(c).

expr(a) ::=expr(b) divide expr(c).

//這裡可以看到 expr到底是什麼了    

expr(a) ::= integer(b).

//lemon 的兩種符號 終結符 與非終結符

//終結符來自外面 大寫 非終結符來自內部 小寫

%code }

分析main函式裡面**的執行步驟 expr(a) ::= integer(b). expr(a) ::=expr(b) plus expr(c). program ::=expr(a).

裡面先後執行了這幾個步驟

integer(1) > expr(1)

plus(0)

integer(2) > expr(2)

expr(1)plus(0)expr(2) 匹配到了 a=b+c expr(3)被放到分析stack中 然後呼叫了 printf那個語句

最終列印出來 this 3

接下改變 main()函式裡面code 然後+-乘除混合運算

void * pparser = parsealloc(malloc);

parse(pparser,integer,1);

parse(pparser,plus,0);

parse(pparser,integer,2);

parse(pparser,times,1);

parse(pparser,integer,5);

parse(pparser,0,0);

parsefree(pparser,free);

列印結果 this 11 說明是混合運算

可以用結構體替換 integer來進行複雜運算 這裡不做贅述

編譯原理部分知識回顧:

關於編譯原理知識的一些回顧,發現書本上學的東西基本都忘得差不多了發現。。 真是悲劇,不得不對一些編譯原理知識進行一些回顧複習:

自底向上分析可以解決更多的文法分析問題

lr(k)文法及lr(k)分析技術。所謂lr(k)分析,是指從左至右掃瞄和自底向上的語法分析,且在分析的每一步,只須根據分析棧當前已移進和歸約出的全部文法符號,並至多再向前檢視k個輸入符號,就能確定相對於某一產生式左部符號的控制代碼是否已在分析棧的頂部形成,從而也就可以確定當前所應採取的分析動作 (是移進還是按某一產生式進行歸約等)。

任何乙個標示符都是表示式

任何乙個數都是表示式

復合表示式也是表示式

產生式 語法規則

乙個加減語法的定義:

分析樹的結構

分析樹的概念以及一些特點:

還是上面的那個例子如果定義為

就會出現二義性

這個東西在limon裡面直接用左結合來搞定了

使用sqlite3 模組操作sqlite3資料庫

python內建了sqlite3模組,可以操作流行的嵌入式資料庫sqlite3。如果看了我前面的使用 pymysql 操作mysql資料庫這篇文章就更簡單了。因為它們都遵循pep 249,所以操作方法幾乎相同。廢話就不多說了,直接看 吧。都差不多,首先匯入模組,然後建立連線,然後獲取游標物件,之後利...

爬蟲學習之 sqlite3

sqlite能儲存什麼樣的資料型別 可以儲存空值 整數 浮點數 字串和blob。什麼是blob 是二進位製大物件。例如 zip檔案。什麼是游標 游標是在資料庫中用來移動和執行查詢的物件。sql的全部知識呢?遠不止這些 有乙個很好的初學教程 如果要使用sql必須要匯入sqlite3庫。建立乙個資料庫,...

SQLite3資料庫操作語法

sql的指令格式 所以的sql指令都是以分號 結尾的。如果遇到兩個減號 則代表註解,sqlite3會略過去。建立資料表 假設我們要建乙個名叫film的資料表,只要鍵入以下指令就可以了 create table film title,length,year,starring 這樣我們就建立了乙個名叫f...