https://github.com/kmizu/minis と https://github.com/momeemt/minim を参考に作ったJulia製のインタプリタです。
内容は 3時間で作る自作言語のJuliaトランスパイラ を参照してください。
Minia.jl は、ソースコードをJuliaのASTに変換し、それを実行します。
文法はだいたい https://github.com/momeemt/minim に沿っていますが、
else の省略, elseif, return の追加などを行っています。
詳細は src/rules.jl を参照してください。
] add https://github.com/abap34/Minia.jl
# 入力としてファイルを渡すと、 そのファイルを Juliaの AST に変換します.
ast = Minia.parse("path/to/file.minia")
# ファイルを実行します.
Minia.run("path/to/file.minia")fizzbuzz.minia:
function fizzbuzz(n) {
i = 0
while (i < 100){
i = i + 1
if (i % 15 == 0) {
println("FizzBuzz")
} elseif (i % 3 == 0) {
println("Fizz")
} elseif (i % 5 == 0) {
println("Buzz")
} else {
println(i)
}
}
}
fizzbuzz(100)これを Minia.parse に渡すと、以下のようなASTが得られます:
julia> Minia.parse("fizzbuzz.minia") |> dump
Expr
head: Symbol let
args: Array{Any}((2,))
1: Expr
head: Symbol block
args: Array{Any}((0,))
2: Expr
head: Symbol block
args: Array{Any}((2,))
1: Expr
head: Symbol function
args: Array{Any}((2,))
1: Expr
head: Symbol call
args: Array{Any}((2,))
1: Symbol fizzbuzz
2: Symbol n
2: Expr
head: Symbol block
args: Array{Any}((2,))
1: Expr
2: Expr
2: Expr
head: Symbol call
args: Array{Any}((2,))
1: Symbol fizzbuzz
2: Int64 100つまり、以下のようなコードが得られています:
julia> Minia.parse("fizzbuzz.minia") |> println
let
function fizzbuzz(n)
i = 0
while i < 100
i = i + 1
if i % 15 == 0
println("FizzBuzz")
elseif i % 3 == 0
println("Fizz")
elseif i % 5 == 0
println("Buzz")
else
println(i)
end
end
end
fizzbuzz(100)
endなので、実行すると以下のようになります:
julia> Minia.run("fizzbuzz.minia")
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16