ETH官方钱包

創作內容

2 GP

大學時興趣使然用java做的腳本語言AShell

作者:奇幻│2019-05-09 23:41:04│巴幣:4│人氣:506
這是我大一的時後一時興起做的專案,當時只是想模仿CMD寫個假的Shell,後來寫著寫著就做成腳本語言了....。

以下就做個簡單的介紹

AShell是直譯式的程式語言,直譯器由java撰寫,並在JVM平臺上執行,程式碼附檔名是.ash
1.語言結構
      在AShell中,類別、函數、迴圈 皆可任意嵌套
2.運算子

優先級
運算子
敘述
範例
1
()
函式呼叫
var x = f()
[]
陣列存取
array[4] = 2
.
以物件方式存取成員
obj.age = 34
2
+
一元正號
var i = +1
-
一元負號
var i = -1
! 邏輯非 if !done …
~ 位元取反 var x = ~x
3 ** 次方 var i = 2 ** 4
4
*
乘法
var i = 2 * 4
/
除法
var f = 10 / 3
//
整數除法
var i = 2 // 4
%
模數(取余)
var rem = 4 % 3
%%
整數模數(取余)
var rem = 4 %% 3
5
+
加法
var i = 2 + 3
+
字串相連
var str = “foo” + ”bar”
..
字串相連
var str = “foo” .. ”bar”
-
減法
var i = 5 - 1
6
<<
位元左移
var flags = 33 << 1
>>
位元右移
var flags = 33 >> 1
7
<
小於關係
if i < 42 …
<=
小於等於關係
if i <= 42 ...
>
大於關係
if i > 42 …
>=
大於等於關係
if i >= 42 ...
8
==
等於關係
if i == 42 ...
!=
不等於關係
if i != 42 …
<> 不等於關係 if i <> 42 …
>< 不等於關係 if i >< 42 …
9
&
位元 AND
var flag1 = flag2 & 42
10
^
位元 XOR(獨占or)
var flag1 = flag2 ^ 42
11
|
位元 OR(包含or)
var flag1 = flag2 | 42
12
&&
邏輯 AND
if conditionA && conditionB …
13
||
邏輯 OR
if conditionA || conditionB ...
14
c?t:f
三元條件運算
var i = a > b ? a : b
15
=
直接賦值
var a = b;
16
,
逗號運算子
for (i = 0, j = 0; i < 10; i=i+1, j=j+1) …
3.變數
    
    宣告變數時使用var關鍵字就可以宣告變數,因為AShell數泛類型語言,所以宣告時不需要定義類型。
    在宣告時如果不賦值,變數的預設值將會是null。
    3-1陣列
        
        要建立陣列時,使用大括號就行了。
        
        要使用陣列元素時,使用中括號就行了。
        3-1-1 null值陣列
             
             null值陣列,有就是每個元數值都是null的陣列,在AShell中,若宣告陣列時沒有定義元素值時,該陣列的元素將會null。
       3-2 自訂Key值
            AShell建立陣列時Key值預設都是使用數字,不過使用者可以使用"字串=>"去自訂Key值,例如:
           
           可以在中括號使用字串來存取陣列,當然也可以繼續使用數字來存取。
      3-3 字元串列
          
          在AShell中任何的字串都可以當作字元串列來使用。
      3-4 反宣告
          
          這可以將已經建立的變數刪除掉。
4.迴圈
if條件式
       當條件達成時,就做區間裡的事。
    
while 迴圈
           當條件達成時,就做區間裡的事,做完在檢查條件是否達成,如果達成則在做繼續做。
    
do-while 迴圈
          先做區間裡的事,然後檢查條件是否達成,如果達成則在做繼續做。
    
for 迴圈
             具有記數功能的迴圈。
       

5.函數
        
        使用function關鍵字可以宣告函數,上圖的程式碼中會建立出一個以AShell_Function@開頭存放著函數的記憶體位置並入在f變數中。
        5-1參數預設值
             
             在AShell中函數的參數可以有預設值,要設定預設值時只要用=運算子賦值就行了。
             要使用參數的預設值,只要在呼叫函數時將該參數留白就可以了。
        5-2 回傳值
             
             若要讓函數可以回傳資料,可以使用raturn關鍵字,關鍵字後的回傳值只能有一個,任何類型都可以,且可有可無,若沒有回傳參數,函數將會回傳null值。
             另外,若函數沒有用return關鍵字回傳資料,函數將會預設回傳null值。
        5-3 簡化函數
           
          若函數只需要return一條運算式的運算結果則可以使用簡化函數。
6.類別
                     使用class關鍵字可以宣告類別
                     下圖的程式碼中,程式碼中會建立出一個以AShell_Class@開頭存放著類別的記憶體位置並入在c 變數中。
        
        要讓類別繼承其他類別時可以使用:符號表示。
        另外,AShell語言不支援多重繼承。
        
       6-1 實例化類別
            對存放有類別記憶體位置的變數使用()運算子就可以實例化類別。
            下圖程式碼中,會將AShell_Object@開頭存放著實例化類別的記憶體位置並入在v變數中。
           
       6-2 建構子(建構函數)
            當實例化類別時,將會呼叫執行建構函數。
            建構子不具有回傳值,但是還是可以使用return關鍵字,只是不能帶有回傳參數。
            
            在AShell中建構子的名稱為_inst_。
       6-3 解構子(解構函數)
            當物件正在被回收時,將會呼叫執行解構函數。
            解構子不具有回傳值,但是還是可以使用return關鍵字,只是不能帶有回傳參數。
            ※要注意!目前AShell中由類別實例化出來的物件並不會被自動回收,需要手動回收。
             
            在AShell中解構子的名稱為_dest_。
       6-4 靜態區間
            
           宣告靜態成員的區間,這個區間的成員會在類別被建立時分配到記憶體空間。
           一個類別中可以有多個靜態區間,但是不能互相嵌套。
7.物件回收
目前,在AShell中除了由類別實例化出來的物件無法自動被回收外,其他像是陣列、函數皆可被自動回收。

若要執行手動回收,可以使用AShlib.free()函數做回收。
        
8.例外處理
                     若所執行的程式碼會出現一些預料之內的例外事件時,可以使用try關鍵字在try區間中去捕捉。
        
        上圖程式碼中,若發生例外時,例外訊息會存放在catch的參數e中,可以在catch區間中處理捕捉到的例外事件。
        finally區間,無論有沒有發生例外事件會執行該區間,是一個可有可無的區間。
       7-1 自訂例外
          
          使用theow關鍵字可以拋出例外,拋出的例外可以是任何類型
9.呼叫腳本檔
    
   使用using指令可以調用位在AShell執行檔所在目錄中using_file目錄裡的函示庫腳本檔。
   9-1. 增加函示庫解析目錄位置
        
(getScriptFilePath函數可用取得當前腳本檔案所在目錄)
       addso指令可以添加函示庫解析目錄使using指令可以解析到其他目錄下的腳本檔
   9-2. 呼叫當前腳本執行目錄下的腳本檔
      
       call指令可以呼叫當前腳本執行目錄下的腳本檔,像上面的例子就是調用當前腳本執行目錄下foo目錄下的bar.ash腳本。
10.註解
   
11.調用java函數
要提供給AShell調用的函數,格式必須是
AShellType 函數名稱(AShell_this 可以用來取得AShell端的其他變數, AShellType[] 調用時傳入AShell參數)

※接下來的範例中,AShell解析器的資料夾是放在C:\中,並且在系統的環境變數中的Path變數中添加路徑C:\AShell。
首先,在隨意一個地方建立一個資料夾,名稱也可以隨意取,這裡我就取為NativeTest。
接者建立NativeTest.java,內容為:
import AShell.Data_Type_And_Struct.AShell_this;
import AShell.ValueProcess.AShellType;

public class NativeTest{
    public AShellType echo(AShell_this AShThis, AShellType[] Args) throws Exception{
        if(Args.length==0)
            throw new Exception("Args length can't is 0.");
        System.out.println("java say: " + Args[0].enforce_to_java_String());
        return new AShellType();
    }
}
,然後在Console執行java編譯指令:
javac -classpath C:\AShell\ .\NativeTest.java
,然後就會得到NativeTest.class。

最後,建立NativeTest.ash,內容為:
using System
addnph System.getScriptFilePath()
#addnph為添加java class path解析路徑
#System.getScriptFilePath()則是取得腳本檔案的所在路徑

native echo("NativeTest") #建立java函數,格式為
#native java函數名稱("java函數所在的class的java package路徑,例如:package.name.Class")

echo("hello world")
,然後在Console執行命令:
AShell .\NativeTest.ash
就會看Console輸出:
java say: hello world
12.保留字

保留字
說明
用法
call
呼叫腳本檔
call foo.ash
goto
將控制項跳至標籤
goto tag
true
布林真值
if true
false
布林假值
if false
begin
建立區塊
begin
endbe
endbe
結束建立區塊
begin
endbe
null
空值
var i=null
unvar
變數反宣告(移除變數)
unvar i
var
變數宣告
var i
break
跳出控制迴圈
while true
break
endwh
while
循環迴圈
while true
endwh
endwh
結束循環迴圈
while true
endwh
if
條件式迴圈
if true
endif
elseif
否則如果循環迴圈
if true
elseif true
endif
native
建立native function
native javaFunctionName(“java_package”)
using
引入函式庫檔案
using Stdio.ash
endif
結束循環迴圈
if true
endif
do
後側式迴圈
do
dwhile true
dwhile
結束後側式迴圈
do
dwhile true
continue
結束當前,繼續執行
while true
continue
endwh
function
函數
function f()
endfu
endfu
結束函數
function f()
endfu
return
回傳
function f()
return
endfu
this
當前類別的記憶體位置
class c
var v
function r()
  return this.v
endfu
cndcl
base
最外層的變數空間
base.v
super
當前類別的父類別的記憶體位置
class c:c2
function c()
  super.c2()
endfu
cndcl
class
類別
class c
endcl
_inst_
建構子
class c
    function _inst_()
    endfu
endcl
endcl
結束類別
class c
endcl
throw
自訂例外
throw "Error"
try
例外處理
try
catch e
endtr
catch
例外捕捉
try
catch e
endtr
finally
 
try
catch e
finally
endtr
endtr
結束例外處理
try
catch e
endtr
static
宣告靜態區間
class c
    static
    endst
endcl
endst
結束靜態區塊宣告
class c
    static
    endst
endcl
addso
新增函示庫路徑
addso System.getPath() .. "\\foo"
addnph
新增native function解析路徑
addnph System.getPath() .. "\\foo"
13.語言解析器主程式
14.Hello World
    程式碼:
        using Thread
        Stdio.println("Hello World")
        Thread.pause()
    執行結果:
    

引用網址:http://www.jamesdambrosio.com/TrackBack.php?sn=4387065
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:java|AShell|腳本語言|script

留言共 0 篇留言

我要留言提醒:您尚未登入,請先登入再留言

2喜歡★jack850628 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:發大財語翻譯機... 後一篇:Android的浮動視窗...


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情? 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】