-
Notifications
You must be signed in to change notification settings - Fork 4
Release 0.2.0
らいパン粉 edited this page Sep 16, 2018
·
24 revisions
int32型に限定した、関数定義をできるように。
print 5
5が出力される
;を使って分を区切れる。
print 4;
4+5+1+1; print 888
(4+5)*2
add x y = x + y
print (add 4 5)
+は1回以上
{}は0回以上を表す
?は0 or 1回を表す
<program> := {<stmt>}
<stmt> := <skip_many> ( <infix> | <expr_app> | <def_func>) <skip_many> ';'
<def_func> := <id> {<skip_many> <id>} <skip_many> '=' <skip_many> <expr_app>
<id> := [a-z]{ [a-z] | [0-9] | '_' }
<expr_app> := <expr> { <expr> }
<expr> := <term> <skip_many> { <op> <skip_many> <term> <skip_many> }
<infix> := ('infixr' | 'infixl') <space>+ <num> <space>+ <op>
<op> := '+' | '-' | '/' | '*'
<term> := <num> | <id> | <paren>
<paren> := '(' <expr_app> ')'
<num> := [0-9]+
<skip> := '\n' | <space>
<skip_many>:= {<skip>}
<space> := ' ' | '\t'
//構文------------------------
op := +や/などの記号
t :=
n //数値
x //変数
λx.t //ラムダ抽象
t t //関数適応
(tt)
tt :=
t
tt op tt
v := n
x
λx.t
//評価---------------------------
//演算子適応
tt1 op tt2 => tt1 op tt2' (tt2=>tt2')
tt1 op v2 => tt1' op v2 (tt1=>tt1')
v1 op v2 => v3
//関数適応
t1 t2 => t1' t2 (t1 => t1')
(λx.t12) t2 =>[x->t2]t12
//括弧
(tt)=>(tt') (tt=>tt')
(v) =>v