java怎麼取數組的值(JAVA開發C語言解釋器)
2023-09-20 15:11:45
本節技術內容難度較大,一個成熟的編譯器或者解釋器,要能夠解析和執行目標語言開發的複雜 程序代碼,我們用java開發的c語言解釋器,能夠執行用C語言開發的較為複雜的程序時,才稱得上是合格的,從本節開始,我們致力於C語言解釋器的開發,要實現的目標是,我們解釋器能夠正確地解析用C語言實現的快速排序功能的程序,程序的樣例如下:
#include int a[5];void init{ int i; for (i = 0; i =end){ printf("begin >= end ,return"); return; } int v; int p; p = begin; v=a[p]; int b; int e; b = begin; e = end; while(b<e){ while(b<e && a[e]>=v){ e--; } while(b<e && a[b] <=v){ b ; } int temp = a[e]; a[e] = a[b]; a[b] = temp; } a[begin] = a[b]; a[b] = v; quicksort(begin,b-1); quicksort(b 1,end);}int main { printf("Hello, World!\n"); init; quicksort(0,4); int i; i=0; do { printf("%d",a[i]); i ; } while (ivar_decl LB const_expr RB
上面的語法推導表達式用來對應數組的類型聲明,其中var-decl解析int a 這一部分,LB對應左中括號,const_expr對應數組的長度,也就是元素的個數,對應於代碼就是數字3,RB則對應右括號],
對數組某個元素的訪問則通過下面的語法表達式實現:
unary->unary LB expr RB
例如a[0],那麼表達式右邊的unary對應的就是數組變量名a,LB對應的左括號,expr對應0,RB對應右括號
我們看看a[0]對應的代碼執行樹是怎麼樣的,執行樹的構建過程和代碼實現
a[0] = 1, 也就是對數組元素賦值這一程序邏輯對應的執行順序如下:
同理,語句a[1] = 2 所對應的執行樹,結構與上面一模一樣,只不過細節有點改變而已,於是生成的執行樹結構如下:
對於求和語句 b = a[0] a[1], 解釋器先對變量b構造其解析樹:
我們再構造a[0] a[1] 的代碼執行樹:
上面兩部分執行樹結合起來,得到最終求和賦值語句的執行樹:
圖二,圖三,圖六構成了整段代碼執行樹的主體部分,通過遍歷這三部分執行樹,執行相應動作,就可以實現本節數值賦值和讀取程序所要實現的功能了
,