精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一門語(yǔ)言的作用域和函數(shù)調(diào)用是如何實(shí)現(xiàn)的

開(kāi)發(fā) 前端
Visitor? 模式正好和 Listener 相反,這是由我們自行控制需要訪問(wèn)哪個(gè) AST 節(jié)點(diǎn),同時(shí)需要在每次訪問(wèn)之后返回?cái)?shù)據(jù),這點(diǎn)非常適合來(lái)做程序運(yùn)行期。

前言

上次利用 Antlr 重構(gòu)一版??用 Antlr 重構(gòu)腳本解釋器??之后便著手新增其他功能,也就是現(xiàn)在看到的支持了作用域以及函數(shù)調(diào)用。

int b= 10;
int foo(int age){
for(int i=0;i<10;i++){
age++;
}
return b+age;
}
int add(int a,int b) {
int e = foo(10);
e = e+10;
return a+b+3+e;
}
add(2,20);
// Output:65

整個(gè)語(yǔ)法規(guī)則大部分參考了 Java,現(xiàn)階段支持了:

  • 函數(shù)聲明與調(diào)用。
  • 函數(shù)調(diào)用的入棧和出棧,保證了函數(shù)局部變量在函數(shù)退出時(shí)銷毀。
  • 作用域支持,內(nèi)部作用域可以訪問(wèn)外部作用域的變量。
  • 基本的表達(dá)式語(yǔ)句,如i++, !=,==

這次實(shí)現(xiàn)的重點(diǎn)與難點(diǎn)則是作用域與函數(shù)調(diào)用,實(shí)現(xiàn)之后也算是滿足了我的好奇心,不過(guò)在講作用域與函數(shù)調(diào)用之前先來(lái)看看一個(gè)簡(jiǎn)單的變量聲明與訪問(wèn)語(yǔ)句是如何實(shí)現(xiàn)的,這樣后續(xù)的理解會(huì)更加容易。

變量聲明

int a=10;
a;

由于還沒(méi)有實(shí)現(xiàn)內(nèi)置函數(shù),比如控制臺(tái)輸出函數(shù) print(),所以這里就直接訪問(wèn)變量也能拿到數(shù)據(jù)

運(yùn)行后結(jié)果如下:

圖片

首先看看變量聲明語(yǔ)句的語(yǔ)法:

variableDeclarators
: typeType variableDeclarator (',' variableDeclarator)*
;

variableDeclarator
: variableDeclaratorId ('=' variableInitializer)?
;
typeList
: typeType (',' typeType)*
;
typeType
: (functionType | primitiveType) ('[' ']')*
;
primitiveType
: INT
| STRING
| FLOAT
| BOOLEAN
;

只看語(yǔ)法不太直觀,直接看下生成的 AST 樹(shù)就明白了:

圖片

編譯期 左邊這棵 ?BlockVardeclar? 樹(shù)對(duì)應(yīng)的就是  int a=10;?,右邊的 blockStm? 對(duì)應(yīng)的就是變量訪問(wèn) a。

整個(gè)程序的運(yùn)行過(guò)程分為編譯期和運(yùn)行期,對(duì)應(yīng)的流程:

遍歷 AST 樹(shù),做語(yǔ)義分析,生成對(duì)應(yīng)的符號(hào)表、類型表、引用消解、還有一些語(yǔ)法校驗(yàn),比如變量名、函數(shù)名是否重復(fù)、是否能訪問(wèn)私有變量等。

運(yùn)行期:從編譯期中生成的符號(hào)表、類型表中獲取數(shù)據(jù),執(zhí)行具體的代碼邏輯。

訪問(wèn) AST

對(duì)于剛才提到的編譯期和運(yùn)行期其實(shí)分別對(duì)應(yīng)兩種訪問(wèn) AST? 的方式,這也是 Antlr 所提供兩種方式。

Listener 模式

第一種是 Listener 模式,就這名字也能猜到是如何運(yùn)行的;我們需要實(shí)現(xiàn) Antlr 所提供的接口,這些接口分別對(duì)應(yīng) AST 樹(shù)中的不同節(jié)點(diǎn)。

接著 Antlr 會(huì)自動(dòng)遍歷這棵樹(shù),當(dāng)訪問(wèn)和退出某個(gè)節(jié)點(diǎn)時(shí)變會(huì)回調(diào)我們自定義的方法,這些接口都是沒(méi)有返回值的,所以我們需要將遍歷過(guò)程中的數(shù)據(jù)自行存放起來(lái)。

這點(diǎn)非常適合上文提到的編譯期,遍歷過(guò)程中產(chǎn)生的數(shù)據(jù)自然就會(huì)存放到符號(hào)表、類型表這些容器中。

圖片

以這段代碼為例,我們實(shí)現(xiàn)了程序根節(jié)點(diǎn)、for循環(huán)節(jié)點(diǎn)的進(jìn)入和退出 Listener,當(dāng) Antlr 運(yùn)行到這些節(jié)點(diǎn)時(shí)便會(huì)執(zhí)行其中的邏輯。

https://github.com/crossoverJie/gscript/blob/main/resolver/type_scope_resolver.go

Visitor 模式

Visitor? 模式正好和 Listener 相反,這是由我們自行控制需要訪問(wèn)哪個(gè) AST 節(jié)點(diǎn),同時(shí)需要在每次訪問(wèn)之后返回?cái)?shù)據(jù),這點(diǎn)非常適合來(lái)做程序運(yùn)行期。

配合在編譯期中存放的數(shù)據(jù),便可以實(shí)現(xiàn)各種特性了。

圖片

以上圖為例,在訪問(wèn) Prog 節(jié)點(diǎn)時(shí)便可以從編譯期中拿到當(dāng)前節(jié)點(diǎn)所對(duì)應(yīng)的作用域 scope?,同時(shí)我們可以自行控制訪問(wèn)下一個(gè)節(jié)點(diǎn) VisitBlockStms,訪問(wèn)其他節(jié)點(diǎn)當(dāng)然也是可以的,不過(guò)通常我們還是按照語(yǔ)法中定義的結(jié)構(gòu)進(jìn)行訪問(wèn)。

作用域

即便是同一個(gè)語(yǔ)法生成的 AST 是相同的,但我們?cè)诒闅v AST 時(shí)實(shí)現(xiàn)不同也就會(huì)導(dǎo)致不同的語(yǔ)義,這就是各個(gè)語(yǔ)言語(yǔ)義分析的不同之處。

比如 Java 不允許在子作用域中聲明和父作用域中相同的變量,但 JavaScript 卻是可以的。

有了上面的基礎(chǔ)下面我們來(lái)看看作用域是如何實(shí)現(xiàn)的。

int a=10;
a;

還是以這段代碼為例:

圖片

這里我簡(jiǎn)單畫了下流程:

在編譯期間會(huì)會(huì)為當(dāng)前節(jié)點(diǎn)寫入一個(gè) scope?,以及在 scope? 中寫入變量 “a”。

這里的寫入 scope 和寫入變量是分為兩次 Listener 進(jìn)行的,具體代碼實(shí)現(xiàn)在下面查看源碼。

第一次:https://github.com/crossoverJie/gscript/blob/main/resolver/type_scope_resolver.go#L21

第二次:https://github.com/crossoverJie/gscript/blob/main/resolver/type_resolver.go#L59

接著是運(yùn)行期,從編譯期中生成的數(shù)據(jù)拿到 scope? 以及其中的變量,獲取變量時(shí)有一個(gè)細(xì)節(jié):當(dāng)前 scope 中如果獲取不到需要嘗試從父級(jí) scope 中獲取,比如如下情況:

int b= 10;
int foo(){
return b;
}

這里的 b 在當(dāng)前函數(shù)作用域中是獲取不到的,只能在父級(jí) scope 中獲取。

父級(jí) scope 的關(guān)系是在創(chuàng)建 scope 的時(shí)候維護(hù)進(jìn)去的,默認(rèn)當(dāng)前 scope 就是寫入時(shí) scope 的父級(jí)。

關(guān)鍵代碼試下如下圖:

圖片

第四步獲取變量的值也是需要訪問(wèn)到 AST 中的字面量節(jié)點(diǎn)獲取值即可,核心代碼如下:

圖片

圖片

函數(shù)

函數(shù)的調(diào)用最核心的就是在運(yùn)行時(shí)需要把當(dāng)前函數(shù)中的所有數(shù)據(jù)入棧,訪問(wèn)完畢后出棧,這樣才能實(shí)現(xiàn)函數(shù)退出后自動(dòng)釋放函數(shù)體類的數(shù)據(jù)。

核心代碼如下:

圖片

int b= 10;
int foo(){
return b;
}
int func(int a,int b) {
int e = foo();
return a+b+3+e;
}
func(2,20);

即便是有上面這類函數(shù)類調(diào)其他函數(shù)情況也不必?fù)?dān)心,無(wú)非就是在執(zhí)行函數(shù)體的時(shí)候再往棧中寫入數(shù)據(jù)而已,函數(shù)退出后會(huì)依次退出棧幀。

圖片

有點(diǎn)類似于匹配括號(hào)的算法 {[()]},本質(zhì)上就是遞歸調(diào)用。

總結(jié)

限于篇幅其中的許多細(xì)節(jié)沒(méi)有仔細(xì)討論,感興趣的朋友可以直接跑跑單測(cè),debug 試試。

https://github.com/crossoverJie/gscript/blob/main/compiler_test.go

目前的版本還比較初級(jí),比如基本類型還只有 int,也沒(méi)有一些常用的內(nèi)置函數(shù)。

后續(xù)會(huì)逐步完善,比如新增:

  • 函數(shù)多返回值。
  • 自定義類型
  • 閉包

等特性,這個(gè)坑會(huì)一直填下去,希望在年底可以用 gscript? 寫一個(gè) web 服務(wù)端那就算是里程碑完成了。

現(xiàn)階段也實(shí)現(xiàn)了一個(gè)簡(jiǎn)易的 REPL? 工具,大家可以安裝試用:

圖片

源碼地址:https://github.com/crossoverJie/gscript

責(zé)任編輯:武曉燕 來(lái)源: crossoverJie
相關(guān)推薦

2019-11-18 11:00:58

程序員編程語(yǔ)言

2015-07-28 15:35:48

學(xué)習(xí)語(yǔ)言

2017-04-07 10:45:43

編程語(yǔ)言

2017-04-07 16:49:00

語(yǔ)言程序編程

2022-02-27 14:45:16

編程語(yǔ)言JavaC#

2022-11-04 11:11:15

語(yǔ)言入職項(xiàng)目

2022-09-07 08:05:32

GScript?編程語(yǔ)言

2020-11-12 07:00:50

JavaScript前端編程語(yǔ)言

2021-07-09 06:48:30

語(yǔ)言Scala編程

2022-02-21 11:15:59

編程語(yǔ)言后端開(kāi)發(fā)

2024-06-27 09:00:00

人工智能編程語(yǔ)言軟件開(kāi)發(fā)

2012-03-28 09:40:40

JavaScript

2014-12-03 09:48:36

編程語(yǔ)言

2011-12-30 09:33:02

程序員語(yǔ)言

2013-07-26 10:23:04

2015-08-17 15:12:56

新技術(shù)語(yǔ)言框架

2021-01-29 13:29:53

系統(tǒng)調(diào)用

2021-10-10 12:45:13

編程語(yǔ)言開(kāi)發(fā)

2015-11-12 10:25:48

編程語(yǔ)言

2015-11-11 10:01:42

編程語(yǔ)言選擇
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产精品网红直播| 精品91自产拍在线观看一区| 亚洲国产一区二区三区在线| 在线观看视频中文字幕| 欧美成人tv| 日韩高清av一区二区三区| 国产福利一区视频| 国产传媒在线播放| 高清久久久久久| 国产精品精品一区二区三区午夜版 | 欧美成人综合网站| 东京热加勒比无码少妇| a在线免费观看| 国产网站一区二区| www.久久爱.cn| 久久久久久亚洲av无码专区| 欧美精品啪啪| 中文字幕无线精品亚洲乱码一区 | 91精品人妻一区二区三区四区| 免费h视频在线观看| 国产精品福利在线播放| 久久久精品有限公司| 国产一区二区波多野结衣| 99精品热6080yy久久| 欧美成人精品xxx| 乐播av一区二区三区| 亚洲日本视频在线| 6080亚洲精品一区二区| 一级在线免费视频| 外国成人直播| 精品av在线播放| 97久久国产亚洲精品超碰热| 69xxxx欧美| 91麻豆精东视频| 国产三区精品| 亚洲AV无码成人片在线观看| 免费看欧美美女黄的网站| 国产91精品久久久| 91看片在线播放| 亚洲精品国产日韩| 久久久久久久久久国产精品| 一本色道久久88| 超碰成人久久| 一本色道久久88综合日韩精品| 欧美无人区码suv| 99久久免费精品国产72精品九九| 7878成人国产在线观看| 91福利国产成人精品播放| 免费日韩电影| 91福利社在线观看| 中文字幕第36页| 第四色男人最爱上成人网| 一本色道久久综合狠狠躁的推荐 | 日韩av网站大全| 国产xxxxxxxxx| 卡通动漫国产精品| 日韩电影网在线| 在线观看av中文字幕| 日本成人7777| 亚洲美女免费精品视频在线观看| 熟女人妻在线视频| 精品国产中文字幕第一页| 亚洲欧美变态国产另类| 亚洲AV无码成人精品区明星换面 | 亚洲色图偷窥自拍| 手机免费看av| 日本不卡电影| 久久天天躁狠狠躁夜夜av| 国产尤物在线播放| 欧美日韩国产免费观看| 国内精品久久久久久久久| 国产在线精品观看| 美女国产精品| 国产日韩欧美自拍| 北条麻妃一二三区| 91一区二区三区在线观看| 精品欧美一区二区久久久伦| 免费在线国产| 亚洲欧洲www| bt天堂新版中文在线地址| 黄色18在线观看| 欧美在线视频你懂得| 国产精品久久久久久久av福利| 久久伊人影院| 亚洲九九九在线观看| 美女100%露胸无遮挡| 欧美91福利在线观看| 亚州欧美日韩中文视频| 日本视频www色| 精品一区二区三区视频在线观看| 国产精品.com| 国产女人在线观看| 一区二区三区国产豹纹内裤在线| www国产精品内射老熟女| av成人在线播放| 欧美白人最猛性xxxxx69交| 蜜桃传媒一区二区亚洲av| 91日韩在线| 2019中文字幕全在线观看| 这里只有精品国产| av亚洲精华国产精华精华| 神马影院一区二区三区| 91九色在线播放| 欧美日韩一区在线观看| 女同性恋一区二区三区| 五月天久久777| 热久久免费视频精品| av中文字幕播放| 欧美激情在线免费观看| 一本久道高清无码视频| 国产69精品久久| 亚洲激情成人网| tube国产麻豆| 日本人妖一区二区| 精品蜜桃一区二区三区| 国产精品扒开做爽爽爽的视频| 色猫猫国产区一区二在线视频| 韩国三级在线看| 久久精品影视| 国产精品福利网| 亚洲av成人无码网天堂 | 中文字幕亚洲高清| 国产乱码字幕精品高清av | www.成人.com| 精品久久久久久亚洲国产300| 91小视频在线播放| 欧美日韩中文一区二区| 欧美一级成年大片在线观看| 国产免费高清视频| 国产精品久久久久久久第一福利| 欧美牲交a欧美牲交aⅴ免费真| 成人h动漫免费观看网站| 久热精品视频在线观看| 国产精品无码粉嫩小泬| 久久精品在这里| 男人天堂网视频| 美女福利一区| 午夜精品www| 亚洲老妇色熟女老太| 亚洲免费看黄网站| 91丝袜超薄交口足| 911精品美国片911久久久| 国产日韩精品综合网站| 日本暖暖在线视频| 欧美区一区二区三区| 国产精品一区二区亚洲| 日韩综合一区二区| 天天好比中文综合网| 亚洲欧洲自拍| 亚洲热线99精品视频| 国产午夜免费福利| 国产日韩三级在线| 黄色三级视频在线| 91亚洲国产| 91在线观看免费高清| 九七电影韩国女主播在线观看| 7777精品伊人久久久大香线蕉| 香蕉久久久久久久| 国产真实乱子伦精品视频| 中国一级黄色录像| 欧美激情精品| 国内久久久精品| 亚洲欧洲精品视频| 色悠悠亚洲一区二区| 少妇无套高潮一二三区| 美女网站在线免费欧美精品| 中文字幕一区二区三区有限公司| 韩国三级大全久久网站| 久久久久免费视频| 视频福利在线| 欧美偷拍一区二区| 亚洲xxxx3d动漫| 成人免费视频国产在线观看| 国产精品沙发午睡系列| 九一国产精品| 91精品视频在线免费观看| 欧美在线激情网| 一本一道无码中文字幕精品热| 26uuu亚洲| 久久婷婷综合色| 欧美精品日韩| 日本一区二区三区www| 欧美日韩免费电影| 欧美黄网免费在线观看| 青青操视频在线| 欧美精品一卡两卡| 亚洲国产综合久久| 国产欧美日韩亚州综合| 自拍一级黄色片| 国产亚洲精品v| 中文字幕一区二区三区有限公司 | 人妻久久一区二区| aaa欧美日韩| 日韩人妻精品无码一区二区三区| 天天做夜夜做人人爱精品| 日韩av电影国产| 亚洲丝袜一区| 亚洲欧美一区二区三区四区| 国产精品久久免费| 欧美日韩黄色大片| 91嫩草|国产丨精品入口| 久久美女艺术照精彩视频福利播放 | 欧美成人精精品一区二区频| 中文字幕一区在线播放| 亚洲私人影院在线观看| 熟女少妇一区二区三区| 狠狠色丁香婷婷综合久久片| 97视频在线免费播放| 欧美激情一级片一区二区| 色99中文字幕| 日本午夜精品| 国产精品乱码视频| 国产精品视频一区二区三区综合| 欧美影院久久久| 欧美hdxxxxx| www国产精品com| 国产中文在线视频| 日韩av在线网| 午夜精品在线播放| 91精品国模一区二区三区| 天天爱天天做天天爽| 亚洲电影一区二区三区| 免费高清在线观看电视| 国产精品进线69影院| 亚洲熟妇无码av| 99久久精品国产观看| 国产sm在线观看| 精品一区二区三区在线观看国产| 黑人粗进入欧美aaaaa| 国产美女一区| 男女视频网站在线观看| 欧美另类女人| 97精品国产97久久久久久粉红| 欧美一二区在线观看| 欧洲成人一区二区| 思热99re视热频这里只精品| 国产精品一区二区你懂得| 日日夜夜精品视频| 91传媒视频免费| 午夜免费欧美电影| 97久久人人超碰caoprom欧美| 高清在线一区二区| 国产视频观看一区| 亚洲伊人伊成久久人综合网| 国产精品视频网址| 黄色精品视频网站| 国产噜噜噜噜久久久久久久久| 亚洲a∨精品一区二区三区导航| 国产91色在线免费| 日韩欧美一区二区三区免费观看 | 亚洲香蕉久久| 成人激情视频网| 国产精品视频一区视频二区| 亚洲va久久久噜噜噜| 久久在线观看| 国产精品加勒比| 欧美18免费视频| 欧美黄色直播| re久久精品视频| 午夜精品福利一区二区| 99久久99久久精品国产片桃花| 中文字幕久久一区| 欧美日韩精品| 精品欧美一区免费观看α√| 新狼窝色av性久久久久久| 国产真实乱子伦| 美腿丝袜亚洲色图| 自拍视频第一页| av高清久久久| 国产毛片欧美毛片久久久| 国产精品理论在线观看| 午夜精品福利在线视频| 亚洲综合丝袜美腿| 六月丁香激情综合| 精品视频一区三区九区| 国产丰满果冻videossex| 欧美精品一区二区三区久久久| 青春有你2免费观看完整版在线播放高清| 亚洲人成网站999久久久综合| 日本在线观看免费| 久久久久亚洲精品国产| 日韩电影av| 97av影视网在线观看| 亚洲精品国产精品粉嫩| 超碰成人在线免费观看| 亚洲小说欧美另类婷婷| 日本999视频| 美女呻吟一区| 欧美一二三四区在线| 国产叼嘿视频在线观看| 亚洲精选一区二区| 在线观看免费视频你懂的| 91国自产精品中文字幕亚洲| 国产精品麻豆成人av电影艾秋| 超碰97在线资源| 国产成人三级| 欧美狂野激情性xxxx在线观| 蜜桃视频一区| 中文字幕制服丝袜| 国产精品视频一二| 久久露脸国语精品国产91| 欧美揉bbbbb揉bbbbb| 可以免费看毛片的网站| xvideos亚洲人网站| 国产h片在线观看| 成人有码在线视频| 九九综合九九| 国产一区二区三区在线免费| 久热综合在线亚洲精品| gogo亚洲国模私拍人体| 亚洲国产成人午夜在线一区| 国产无精乱码一区二区三区| 欧美日韩亚洲综合在线 | 熟女性饥渴一区二区三区| 国产一区二区成人久久免费影院| 右手影院亚洲欧美| 亚洲国产一区在线观看| 国产精品主播一区二区| 亚洲性生活视频在线观看| 岛国av在线网站| 91入口在线观看| 91精品啪在线观看国产81旧版| 国产精品69页| 91免费版在线| 日本一二三区视频| 日韩精品一区二区三区视频在线观看| 92国产在线视频| 国产精品福利网站| 国产日产精品_国产精品毛片| 青青青青草视频| 成人丝袜视频网| 激情五月婷婷在线| 日韩欧美中文字幕一区| 在线观看的av| 国产精品欧美一区二区| 精品少妇av| 久久婷婷国产91天堂综合精品| 久久综合狠狠综合久久综合88| 91蜜桃视频在线观看| 精品成人免费观看| 丁香高清在线观看完整电影视频| 亚洲一区二区三区在线视频 | 鲁大师精品99久久久| 亚洲色成人www永久在线观看| 国产成人免费在线视频| 丰满少妇高潮久久三区| 欧美一区2区视频在线观看| 粗大黑人巨茎大战欧美成人| 成人av番号网| 91精品国产调教在线观看| 欧美美女一级片| 亚洲男人天堂av| 亚洲精品911| 69久久夜色精品国产69| 日本午夜精品久久久| 成年人黄色片视频| 欧美国产日韩精品免费观看| 在线免费看av片| 精品中文字幕在线2019| 一区二区三区欧洲区| 欧美一级片免费播放| 2021国产精品久久精品| 性高潮视频在线观看| 日韩一区在线视频| 亚洲啊v在线免费视频| 波多野结衣乳巨码无在线| 国产日韩欧美a| 国产伦精品一区二区三区免.费| 免费不卡欧美自拍视频| 极品国产人妖chinesets亚洲人妖 激情亚洲另类图片区小说区 | 欧美性猛交视频| 超碰在线国产| 99电影在线观看| 先锋a资源在线看亚洲| 国产精品无码无卡无需播放器| 91麻豆精品91久久久久同性| 日本无删减在线| 欧美高清一区二区| 精品一区二区三区免费播放| 国产性生活网站| 亚洲视频777| 精品国产乱码久久久久久樱花| 久久国产精品网| 国产精品美女久久久久久久久| 亚洲a视频在线观看| 人体精品一二三区| 中文字幕av亚洲精品一部二部| 国产精品边吃奶边做爽| 欧美日韩成人综合在线一区二区| 男女在线视频| 日韩免费电影一区二区| 丁香婷婷综合网| 小泽玛利亚一区二区三区视频| 久久久久久久久久国产精品| 成久久久网站| 黄色片视频免费观看| 欧美一区二区在线免费播放| 天堂av中文在线观看| 激情视频小说图片| 久久久精品中文字幕麻豆发布|