MinRubyパーサの構文解析結果を眺める
#MinRuby
minrubyをパース
minruby をインストール。
code:sh
gem install minruby
irbを起動して、minruby_parse で構文解析した結果を取得する
code:irb
$ irb -rminruby
irb(main):001:0> minruby_parse "10"
=> "lit", 10
irb(main):002:0> minruby_parse "10 + 20"
=> "lit", 10, "lit", 20
リテラル
code:irb
irb(main):006:0> minruby_parse "10"
=> "lit", 10
整数をプリント
code:irb
irb(main):001:0> minruby_parse "p 10"
=> ["func_call", "p", "lit", 10]
こんな感じに出力できれば良い?
code:print_int.S
.text
.align 2
.globl _main
_main:
sub sp, sp, #32
stp x29, x30, sp, #16
# 整数をプリント
mov w0, #255
bl _print_int
# 終了ステータスに0を返す
mov w0, #0
ldp x29, x30, sp, #16
add sp, sp, #32
ret
code:libminruby.c
#include <stdio.h>
void print_int(int x) {
printf("%d\n", x);
}
ビルドして実行
code:sh
$ gcc foo.S libminruby.c
$ ./a.out
255
複数ステートメント
code:irb
irb(main):005:0> minruby_parse "p 10; p 20"
=> ["stmts", ["func_call", "p", "lit", 10], ["func_call", "p", "lit", 20]]
code:foo.S
.text
.align 2
.globl _main
_main:
sub sp, sp, #32
stp x29, x30, sp, #16
# p 10
mov w0, #10
bl _print_int
# p 20
mov w0, #20
bl _print_int
# 終了ステータスに0を返す
mov w0, #0
ldp x29, x30, sp, #16
add sp, sp, #32
ret
変数
code:irb
irb(main):001:0> minruby_parse "a = 255; p a"
=> ["stmts", ["var_assign", "a", "lit", 255], ["func_call", "p", "var_ref", "a"]]
code:variable.S
.text
.align 2
.globl _main
_main:
sub sp, sp, #32
stp x29, x30, sp, #16
# a = 255
mov w8, #255
str w8, sp, #8
# print_int(a)
ldr w0, sp, #8
bl _print_int
# 終了ステータスに0を返す
mov w0, #0
ldp x29, x30, sp, #16
add sp, sp, #32
ret
変数その2
code:irb
irb(main):002:0> minruby_parse "a = 10; b = 20; p a + b"
=>
["stmts",
["var_assign", "a", "lit", 10],
["var_assign", "b", "lit", 20],
["func_call", "p", "var_ref", "a", "var_ref", "b"]]
code:variable2.c
// variable2.c
extern void print_int(int x);
int main() {
int a = 10;
int b = 20;
print_int(a + b);
}
code:variable2.S
.text
.align 2
.globl _main
_main:
sub sp, sp, #32
stp x29, x30, sp, #16
# a = 10
mov w8, #10
str w8, sp, #0
# b = 20
mov w8, #20
str w8, sp, #4
# print_int(a + b)
ldr w8, sp, #0
ldr w9, sp, #4
add w8, w8, w9
str w8, sp, #8
ldr w0, sp, #8
bl _print_int
# 終了ステータスに0を返す
mov w0, #0
ldp x29, x30, sp, #16
add sp, sp, #32
ret