久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網
最全最豐富的資訊網站

詳細解析java詞法分析器DDL遞歸應用

本篇文章給大家帶來了關于java的相關知識,主要介紹了java詞法分析器DDL遞歸應用詳解,有需要的朋友可以借鑒參考下,下面一起來看一下,希望對大家有幫助。

詳細解析java詞法分析器DDL遞歸應用

推薦學習:《java視頻教程》

intellij plugin

既然沒有現成的工具那就自己寫一個吧

考慮到我們主要是用PyCharm開發,正好jetbrains也提供了SDK用于開發插件,所以UI層面可以不用額外考慮了。

使用流程很簡單,只需要導入DDL語句就可以生成Python所需要的Model代碼。

例如導入以下 DDL:

CREATE TABLE `user` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `userName` varchar(20) DEFAULT NULL COMMENT '用戶名',   `password` varchar(100) DEFAULT NULL COMMENT '密碼',   `roleId` int(11) DEFAULT NULL COMMENT '角色ID',   PRIMARY KEY (`id`),   ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8

便會生成對應的 Python 代碼:

class User(db.Model):     __tablename__ = 'user'     id = db.Column(db.Integer, primary_key=True, autoincrement=True)     userName = db.Column(db.String)  # 用戶名     password = db.Column(db.String)  # 密碼     roleId = db.Column(db.Integer)  # 角色ID

詞法解析

仔細對比源文件及目標代碼會很容易找出規律,無非就是解析出表名、字段、及字段的屬性(是否為主鍵、類型、長度),最后再轉換為Python所需要的模板即可。

在我動手之前我認為是非常簡單的,無非就是解析字符串,但實際上手后發現不是那么回事;主要是有以下幾個問題:

  • 如何識別出表名稱?
  • 同樣的如何識別出字段名稱,同時還得關聯上該字段的類型、長度、注釋。
  • 如何識別出主鍵?

總結一句話,如何通過一系列規則識別出一段字符串中的關鍵信息,這同樣也是 MySQL Server 所做的事情。

在開始真正解析 DDL 之前,先來看下一段簡單的腳本如何解析:

x = 20

按照我們平時開發的經驗,這條語句分為以下幾部分:

  • x表示變量
  • =表示賦值符號
  • 20表示賦值結果

所以我們對這段腳本的解析結果應當為:

VAR x

GE =

VAL 100

這個解析過程在編譯原理中稱為”詞法解析“,可能大家聽到編譯原理這幾個字就頭大(我也是);對于剛才那段腳本我們可以編寫一個非常簡單的詞法解析器生成這樣的結果。

狀態遷移

再開始之前先捋一下思路,可以看到上文的結果中通過VAR表示變量、GE表示賦值符號 ”=“、VAL表示賦值結果,現在需要重點記住這三個狀態。

在依次讀取字符解析時,程序就是在這幾個狀態中來回切換,如下圖:

詳細解析java詞法分析器DDL遞歸應用

  • 默認為初始狀態。
  • 當字符為字母時進入VAR狀態。
  • 當字符為 ”=“ 符號時進入GE狀態。

詳細解析java詞法分析器DDL遞歸應用

同理,當不滿足這幾個狀態時候又會回到初始從而再次確認新的狀態。

光看圖有點抽象,直接來看核心代碼:

public class Result{     public TokenType tokenType ;     public StringBuilder text = new StringBuilder(); }

首先定義了一個結果類,收集最終的解析結果;其中的TokenType就對應了圖中的三種狀態,簡單的用枚舉值來表示。

public enum TokenType {     INIT,     VAR,     GE,     VAL }

首先對應到第一張圖:初始化狀態。

需要對當前解析的字符定義一個TokenType

詳細解析java詞法分析器DDL遞歸應用

和圖中描述的流程一致,判斷當前字符給定一個狀態即可。

接著對應到第二張圖:狀態之間的轉換。

詳細解析java詞法分析器DDL遞歸應用

會根據不同的狀態進入不同的case,在不同的case中判斷是否應當跳轉到其他狀態(進入INIT狀態后會重新生成狀態)。

舉個例子:x = 20:

首選會進入VAR狀態,接著下一個字符為空格,自然在 38 行中重新進入初始狀態,導致再次確定下一個字符=進入GE狀態。

當腳本為ab = 30:
第一個字符為 a 也是進入VAR狀態,第二個字符為 b,依然為字母,所以進入 36 行,狀態不會改變,同時將 b 這個字符追加進來;后續步驟就和上一個例子一致了。

多說無益,建議大家自己跑一下單測就會明白:

詳細解析java詞法分析器DDL遞歸應用

詳細解析java詞法分析器DDL遞歸應用

DDL 解析

簡單的解析完成后來看看DDL這樣的腳本應當如何解析:

CREATE TABLE `user` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `userName` varchar(20) DEFAULT NULL COMMENT '用戶名',   `password` varchar(100) DEFAULT NULL COMMENT '密碼',   `roleId` int(11) DEFAULT NULL COMMENT '角色ID',   PRIMARY KEY (`id`),   ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8

原理類似,首先還是要看出規律(也就是語法):

  • 表名是第一行語句,同時以CREATE TABLE開頭。
  • 每一個字段的信息(名稱、類型、長度、備注)都是以 “`” 符號開頭 “,” 結尾。
  • 主鍵是以 PRIMART 字符串開頭的字段,以)結尾。

根據我們需要解析的數據種類,我這里定義了這個枚舉:

詳細解析java詞法分析器DDL遞歸應用

然后在初始化類型時進行判斷賦值:

詳細解析java詞法分析器DDL遞歸應用

由于需要解析的數據不少,所以這里的判斷條件自然也就多了。

遞歸解析

針對于DDL的語法規則,我們這里還有需要有特殊處理的地方;比如解析具體字段信息時如何關聯起來?

舉個例子:

`userName` varchar(20) DEFAULT NULL COMMENT '用戶名', `password` varchar(100) DEFAULT NULL COMMENT '密碼',

這里我們解析出來的數據得有一個映射關系:

詳細解析java詞法分析器DDL遞歸應用

所以我們只能一個字段的全部信息解析完成并且關聯好之后才能解析下一個字段。

于是這里我采用了遞歸的方式進行解析(不一定是最好的,歡迎大家提出更優的方案)。

} else if (value == '`' && pStatus == Status.BASE_INIT) {     result.tokenType = DDLTokenType.FI;     result.text.append(value); }

當當前字符為 ”`“ 符號時,將狀態置為 “FI”(FieldInfo),同時當解析到為 “,” 符號時便進入遞歸處理。

詳細解析java詞法分析器DDL遞歸應用

可以理解為將這一段字符串單獨提取出來處理:

`userName` varchar(20) DEFAULT NULL COMMENT '用戶名',

接著再將這段字符遞歸調用當前方法再次進行解析,這時便按照字段名稱、類型、長度、注釋的規則解析即可。

同時既然存在遞歸,還需要將子遞歸的數據關聯起來,所以我在返回結果中新增了一個pid的字段,這個也容易理解。

默認值為 0,一旦遞歸后便自增 +1,保證每次遞歸的數據都是唯一的。

用同樣的方法在解析主鍵時也是先將整個字符串提取出來:

PRIMARY KEY (`id`)

只不過是 “P” 打頭 “)” 結尾。

} else if (value == 'P' && pStatus == Status.BASE_INIT) {     result.tokenType = DDLTokenType.P_K;     result.text.append(value); }

詳細解析java詞法分析器DDL遞歸應用

也是將整段字符串遞歸解析,再遞歸的過程中進行狀態切換P_K ---> P_K_V最終獲取到主鍵。

詳細解析java詞法分析器DDL遞歸應用

所以通過對剛才那段DDL解析得到的結果如下:

詳細解析java詞法分析器DDL遞歸應用

這樣每個字段也通過了pid進行了區分關聯。

所以現在只需要對這個詞法解析器進行封裝,便可以提供一個簡單的API來獲取表中的數據了。

詳細解析java詞法分析器DDL遞歸應用

推薦學習:《java視頻教程》

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
日韩国产一区二区| 奇米狠狠一区二区三区| 国产乱人伦丫前精品视频| 日韩欧美久久| 久久久亚洲欧洲日产| 国产精品久av福利在线观看| 红杏一区二区三区| 日韩国产一区二区| 激情久久中文字幕| 久久国产成人| 五月天综合网站| 丝袜诱惑制服诱惑色一区在线观看| 亚洲伊人精品酒店| 国产欧美久久一区二区三区| 精品国产一区二区三区性色av| 午夜在线播放视频欧美| 亚洲三级毛片| 欧美交a欧美精品喷水| www.51av欧美视频| 婷婷激情图片久久| 日本午夜精品久久久久| 狠狠久久伊人中文字幕| 激情综合自拍| 国产精选一区| 久久青草久久| 蜜桃av一区二区三区电影| 久久国产日韩欧美精品| 天堂8中文在线最新版在线| 亚洲欧美日韩专区| 你懂的亚洲视频| 欧美精品一线| 欧美1区2区3| 欧美午夜不卡| 欧美激情aⅴ一区二区三区 | 四虎国产精品免费久久| 欧美激情久久久久久久久久久| 99精品在线| 日本欧美在线看| 精品国产不卡| 日韩一区精品字幕| 亚洲涩涩在线| 日韩精品五月天| 99精品电影| 欧美极品中文字幕| 亚洲图片久久| 国产91久久精品一区二区| 国产日韩欧美一区二区三区| 亚洲国产综合在线看不卡| 国产欧美大片| 六月婷婷一区| 精品成人免费一区二区在线播放| 日本不卡视频一二三区| 成人午夜精品| 国产精品欧美在线观看| 首页国产欧美日韩丝袜| 国产白浆在线免费观看| 国产精品美女午夜爽爽| 日韩制服丝袜先锋影音| 亚洲不卡av不卡一区二区| 国产精品v日韩精品v欧美精品网站 | 国产日韩视频在线| 欧美午夜不卡影院在线观看完整版免费| 久久精品国产亚洲aⅴ| 亚洲美女久久| 伊人成人网在线看| 中文字幕系列一区| 红杏一区二区三区| 久久国内精品| 日韩欧美精品一区二区综合视频| 欧美三级第一页| 亚洲高清影视| 国产欧美日韩精品一区二区免费 | 国产精品日韩| 高清av不卡| 欧美日韩视频网站| 精品日韩一区| 老司机精品视频网| 日韩有吗在线观看| 亚洲特色特黄| 99精品视频精品精品视频| 日韩一区二区中文| 激情国产在线| 波多野结衣久久精品| 国产精品不卡| 欧美国产小视频| 激情国产在线| 国产 日韩 欧美 综合 一区| 久久国产三级精品| 奇米亚洲欧美| 国产乱论精品| 欧美aa在线视频| 久久免费影院| 精品国产乱码久久久久久樱花| 欧美国产另类| 成人一区不卡| 午夜影院一区| 极品裸体白嫩激情啪啪国产精品| 99精品综合| 婷婷激情综合| 蜜桃av一区二区三区电影| 石原莉奈一区二区三区在线观看 | 97人人精品| 日韩综合精品| 91成人精品| 男女男精品视频网| 亚洲一级淫片| 国产欧美日韩精品一区二区三区| 久久99影视| 92国产精品| 国产精品99免费看| 蜜臀av性久久久久蜜臀aⅴ流畅| 最新国产精品久久久| 日韩av二区在线播放| 国产精品magnet| 国产理论在线| 久久中文字幕二区| 欧美在线综合| 久久国内精品| 欧美日韩视频网站| 亚洲尤物在线| 日韩二区在线观看| 国内精品亚洲| 91精品福利| 亚洲1区在线| 久久成人福利| 久久久久99| 久久香蕉精品| 免费观看亚洲天堂| 欧美日韩高清| 国产欧美日韩视频在线| 水蜜桃久久夜色精品一区| 亚洲成人av观看| 亚洲精品大全| 国产日韩电影| 亚洲精品美女91| 樱桃视频成人在线观看| 亚洲久久一区| 91综合网人人| 综合在线一区| 亚洲天堂一区二区| 婷婷综合电影| 日本久久成人网| 日韩二区三区在线观看| 精品免费av在线| 日本午夜精品久久久| 香蕉视频亚洲一级| 日韩av不卡一区二区| 久久免费高清| 国产精品久久乐| 2023国产精品久久久精品双| 国产精品99久久免费| 狠狠爱成人网| 精品久久久网| 亚洲精品看片| 久久中文字幕二区| 精品三级在线观看视频| 免费看黄色91| 日韩在线精品| 国产精品一在线观看| 日韩午夜电影| 精品美女视频 | 免费av一区| 麻豆91精品视频| 蜜臀av性久久久久蜜臀aⅴ流畅| 91一区二区三区四区| 亚洲精品在线国产| 亚洲电影在线一区二区三区| 精品色999| 欧美亚洲一区二区三区| 亚洲黄色影院| 日产午夜精品一线二线三线| 日韩av网站在线观看| 久久久久99| 成人在线超碰| 国产精品久久久免费| 视频一区中文字幕| 国产一区亚洲| 91中文字幕精品永久在线| 欧美一级二区| 日韩精品一卡二卡三卡四卡无卡 | 日韩电影免费在线观看| 国产欧美另类| 日韩精品视频一区二区三区| 伊人成人网在线看| 久久亚洲在线| 中文字幕成在线观看| 国产精品chinese| 国产精区一区二区| 欧美在线黄色| 亚洲三级网站| 亚洲乱亚洲高清| 免费不卡在线视频| 六月婷婷一区| 亚洲一区有码| 免费美女久久99| 久久一二三区| 午夜一区在线| 久久国产精品久久久久久电车| 午夜日韩av| 首页国产欧美久久|