精品欧美一区二区三区在线观看 _久久久久国色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)

在线观看亚洲黄色| 亚洲黄色小说在线观看| 午夜视频在线观看网站| 国精产品一区一区三区mba桃花 | 国产免费中文字幕| 男女羞羞视频在线观看| 久久精品视频免费观看| 91视频免费网站| 日本特黄一级片| japanese国产精品| 亚洲国产精品久久久久秋霞不卡| 日韩国产欧美亚洲| 美女国产在线| www国产精品av| 蜜桃视频免费观看一区| 亚洲精品免费看| 久久综合狠狠综合久久综青草| 这里只有精品999| 91久久夜色精品国产九色| 最新91在线视频| 亚洲第一黄色网址| 日本亚州欧洲精品不卡| 91黄色小视频| 国产玉足脚交久久欧美| 日本中文在线| 国产调教视频一区| 久久99精品久久久久久久青青日本| 这里只有精品免费视频| 国产精品五区| 欧美激情a∨在线视频播放| 亚洲女人毛茸茸高潮| 西野翔中文久久精品字幕| 欧美videos大乳护士334| 羞羞的视频在线| 欧美成人影院| 欧美日韩激情视频8区| 日韩在线视频在线| 久久精品视频免费看| 中文字幕成人av| 欧美一区激情视频在线观看| 欧美亚洲精品在线观看| 国产成人免费视频精品含羞草妖精| 国产精品免费久久久久影院| 国产成人无码一区二区在线播放| 在线不卡欧美| 久久久久久高潮国产精品视| 蜜臀久久精品久久久用户群体| 禁果av一区二区三区| 日韩精品免费在线视频| 亚洲蜜桃精久久久久久久久久久久| 视频在线观看免费影院欧美meiju| 亚洲视频一起| 久久激情五月激情| 成人xxxx视频| 国产精品怡红院| 久久99精品国产麻豆不卡| 国产福利视频一区二区| aaa在线视频| 日韩有码一区二区三区| 国产精品久久久久免费a∨| 最近免费中文字幕大全免费版视频| 国产日本精品| 欧美在线视频a| 亚洲不卡在线视频| 麻豆成人免费电影| 成人免费自拍视频| 国产浮力第一页| 成人午夜视频免费看| 好吊色欧美一区二区三区视频| 男人天堂一区二区| 26uuu亚洲综合色| 日本不卡免费新一二三区| 成年人视频在线观看免费| 国产精品美女久久久久久久久久久| 一区二区视频国产| 青青青国内视频在线观看软件| 亚洲一区二区三区中文字幕在线| 国内精品视频一区二区三区| 亚洲精品88| 卡通动漫国产精品| 欧美日韩精品欧美日韩精品| www.99r| 欧美成年网站| 日韩av中文字幕在线播放| 中文字幕xxx| 日韩理论电影| 久久免费国产视频| 波多野结衣在线观看一区| 精品夜夜嗨av一区二区三区| av成人观看| 九色网友自拍视频手机在线| 国产精品免费丝袜| 日本人体一区二区| av成人亚洲| 精品国产一区久久| 中文字幕人妻一区二区三区在线视频| 久久密一区二区三区| 久久久久国产视频| 亚洲天堂狠狠干| 国产一区二区精品久久91| 久久免费看av| av在线播放国产| 日本精品一区二区三区高清 | 蜜桃av免费观看| 欧美日韩国产一区精品一区| 97超级碰碰人国产在线观看| 亚洲一级特黄毛片| kk眼镜猥琐国模调教系列一区二区| 日本视频一区二区在线观看| 成人在线观看亚洲| 色婷婷综合视频在线观看| 免费高清视频在线观看| 一区二区美女| 久久久久久香蕉网| 国产又粗又猛又色又| 久久综合九色综合97婷婷| 桥本有菜av在线| 成人片免费看| 日韩美女视频在线| 国产一区在线观看免费| 亚洲一区二区三区高清不卡| 91美女片黄在线观看游戏| 免费在线性爱视频| 亚洲国产一区二区在线播放| wwwwwxxxx日本| 精品国产欧美日韩| 性色av一区二区三区红粉影视| 97超碰人人草| 国产欧美一区二区精品婷婷| 免费无码毛片一区二三区| 精品国模一区二区三区欧美| 中日韩美女免费视频网址在线观看| 久草手机在线观看| 国产不卡视频一区| 欧美aaa在线观看| jizz欧美| 国产一区二区三区久久精品| 神马久久久久久久| www.久久精品| 亚洲精品蜜桃久久久久久| 久久伊人久久| 久久中国妇女中文字幕| 艳妇乳肉豪妇荡乳av无码福利| 久久久亚洲精品石原莉奈| 六月婷婷在线视频| www.成人网| 久久久久久999| 欧美天堂在线视频| 性做久久久久久免费观看欧美| 国产伦理在线观看| 海角社区69精品视频| 97久久天天综合色天天综合色hd| 麻豆tv入口在线看| 欧美一区中文字幕| 欧美成人精品一区二区免费看片| 国模大尺度一区二区三区| 日本精品免费视频| 亚洲精品a区| 亚洲欧美视频| 成人在线视频电影| 九色91在线| 亚洲第一福利在线观看| 久久综合久久鬼| 国产很黄免费观看久久| www.欧美黄色| 欧美1区2区3区4区| 456亚洲影院| 国产免费视频在线| 欧美精品日日鲁夜夜添| 青娱乐av在线| 99久久精品国产麻豆演员表| 国产 福利 在线| 少妇精品久久久| 国产精品永久免费| 中国av在线播放| 亚洲国产一区自拍| 欧美一级黄视频| |精品福利一区二区三区| 妖精视频在线观看| 亚洲一区国产| 亚洲欧美日韩国产成人综合一二三区 | 欧美这里只有精品| 香蕉久久99| 国产日韩欧美在线| 羞羞视频在线观看免费| 亚洲精品国产精品国自产在线 | 欧美日韩高清在线播放| 青花影视在线观看免费高清| www.亚洲精品| 日本男人操女人| 一区二区三区毛片免费| 国产精品一区二区欧美黑人喷潮水| 国产粉嫩在线观看| 最近2019中文字幕一页二页| www国产在线| 欧美中文字幕久久| 男女免费视频网站| 国产视频一区二区三区在线观看| 亚洲男人天堂2021| 久久精选视频| 久久av高潮av| 残酷重口调教一区二区| 国产精品日韩欧美一区二区| 成人亚洲综合| 91成人在线视频| 精品视频在线一区二区| 亚洲免费电影一区| 朝桐光av在线一区二区三区| 日本道色综合久久| 国产精品成人网站| 亚洲男人的天堂一区二区| 久久久久久亚洲中文字幕无码| 国产精品88av| 午夜宅男在线视频| 亚洲专区在线| 精品国产av无码一区二区三区| 成人在线免费小视频| 国产精品一 二 三| 成人污版视频| 国产精品自在线| 成人教育av| 91po在线观看91精品国产性色| 岛国成人毛片| 日韩在线观看成人| 久草在线青青草| 精品亚洲精品福利线在观看| 可以免费观看的毛片| 91精品国产乱| 亚洲系列第一页| 欧美最新大片在线看| 日韩欧美性视频| 亚洲精品视频在线看| 精品一区二区在线观看视频| 久久久久久夜精品精品免费| 亚洲欧美高清在线| 国产成人欧美日韩在线电影| 黄色aaaaaa| 久久av资源站| 999在线精品视频| 久久精品久久精品| 人人干人人干人人| 日本少妇一区二区| 91国产精品视频在线观看| 免费精品视频| 日本三级免费观看| 国产精品美女久久久浪潮软件| 草b视频在线观看| 国模 一区 二区 三区| 800av在线免费观看| 国内精品亚洲| 国产91xxx| 午夜影院日韩| www.四虎成人| 三级影片在线观看欧美日韩一区二区| 久久久久久久久久久视频| 一区二区三区四区五区在线| 欧美久久久久久久久久久久久 | 欧美疯狂性受xxxxx另类| fc2ppv国产精品久久| 欧美刺激性大交免费视频| 在线免费av导航| 欧美—级a级欧美特级ar全黄| 欧美24videosex性欧美| 午夜精品视频在线| av资源亚洲| 国产精品久久久久久久久久久久久久 | 亚洲色图.com| 国产精品suv一区二区69| 天天做天天摸天天爽国产一区 | 成人黄色网址| 欧美国产日韩一区二区| 色在线免费观看| 国产精品aaaa| 中文成人在线| 国产精品日韩一区二区| 欧美热在线视频精品999| 一区二区三区四区五区精品| 欧美一区久久| 国产男女无遮挡| 免费高清视频精品| 久久人人爽人人片| 91在线视频网址| 91无套直看片红桃在线观看| 尤物视频一区二区| 你懂的国产在线| 欧美日韩亚洲综合| 女人18毛片水真多18精品| 亚洲日本成人女熟在线观看| 麻豆av在线免费看| 韩日欧美一区二区| 日本免费成人| 国产尤物91| 欧美第一精品| 91专区在线观看| 国内久久精品视频| 亚洲av无码一区二区三区网址| 亚洲国产高清不卡| 久久精品久久精品久久| 欧美三级韩国三级日本一级| 高h调教冰块play男男双性文| 亚洲精品综合久久中文字幕| 国产婷婷视频在线| 欧美一级成年大片在线观看 | 国产欧美韩日| 色综合天天爱| 久久国产亚洲精品无码| 国产综合一区二区| 妺妺窝人体色WWW精品| 亚洲精品视频在线看| 欧美人一级淫片a免费播放| 精品蜜桃在线看| 丝袜美腿美女被狂躁在线观看| 97不卡在线视频| 91精品国产乱码久久久竹菊| 亚洲精品中字| 丝袜诱惑亚洲看片| 人妻 丝袜美腿 中文字幕| 国产精品久久久久一区二区三区共| 日韩精品成人一区| 日韩一区二区中文字幕| 成a人v在线播放| 4388成人网| 国产亚洲成av人片在线观黄桃| 在线免费一区| 免费亚洲电影在线| 中文精品在线观看| 午夜精品福利久久久| 亚洲精品一区二区口爆| 久久亚洲精品毛片| 黄色成人小视频| 日韩wuma| 日韩和欧美一区二区三区| 中文精品在线观看| 欧美日韩午夜视频在线观看| 男人的天堂a在线| 欧美激情视频一区二区三区不卡 | 香蕉久久国产| 国产精品一级黄片| 懂色av中文一区二区三区天美 | julia一区二区三区中文字幕| 久久大片网站| 亚洲欧美日韩一区在线观看| 国产精品久久久久久亚洲av| 亚洲一区二区免费视频| 国产www免费观看| 国产亚洲精品久久久久久777| 亚洲十八**毛片| 久久国产精品一区二区三区| 性一交一乱一区二区洋洋av| 特大黑人巨人吊xxxx| 欧美色视频日本高清在线观看| 五月婷婷丁香网| 欧日韩不卡在线视频| 男人的天堂久久| 四虎永久在线精品无码视频| 久久久综合精品| 91丨九色丨海角社区| 亚洲视频在线观看免费| 欧美日韩尤物久久| 亚洲一卡二卡三卡四卡无卡网站在线看 | www成人在线观看| 台湾佬中文在线| 在线观看不卡av| 国产精品高清一区二区| 国产精品无码电影在线观看| 国产99久久久国产精品潘金网站| 欧美日韩综合一区二区| 亚洲精品一区二区三区福利| 热三久草你在线| 日日夜夜精品网站| 九色综合狠狠综合久久| 久久精品一级片| 国产丝袜一区二区三区| 激情久久一区二区| 日本美女爱爱视频| 99久久免费精品高清特色大片| 99超碰在线观看| 日韩视频一区在线| 国产精品白丝一区二区三区| 亚洲国产精品久久久久爰色欲| 欧美激情中文字幕| 精品国产九九九| 青青久久av北条麻妃黑人| 色中色综合网| 污污内射在线观看一区二区少妇 | 国产精品欧美综合亚洲| 欧美高清性猛交| 国产精品一区二区三区av麻| 亚洲天堂视频在线观看| 最新在线中文字幕| 久99久在线视频| 台湾佬综合网| 青青草原国产在线视频| 亚洲成在线观看| 色视频在线免费观看| 国产精品一区二区三区免费观看| 天堂资源在线中文精品| 欧美日韩大片在线观看| 亚洲欧洲在线免费| 亚洲国产视频二区|