-
Notifications
You must be signed in to change notification settings - Fork 4
Release 0.2.0
らいパン粉 edited this page Sep 30, 2018
·
24 revisions
int32型、関数ポインタに限定した、関数定義をできるように。
型推論があるので関数の型は自動推論されます。
main = print 5;
5が出力される
main = scan 0;
入力された数値を返す、0は使われない数値
main = (4+5)*2;
add x y = x + y;
必ずmain関数を定義しなければコンパイルエラーになります。
main = print (add 4 5);
+は1回以上
{}は0回以上を表す
?は0 or 1回を表す
<program> := {<stmt>} <skip_many>
<stmt> := <skip_many> ( <infix> | <def_func>) <skip_many> ';'
<def_func> := <id> {<skip_many> <id>} <skip_many> '=' <skip_many> <expr>
<id> := [a-z]{ [a-z] | [0-9] | '_' }
<expr> := <expr_app> <skip_many> { <op> <skip_many> <expr_app> <skip_many> }
<expr_app> := <term> {<skip_many> <term> }
<infix> := ('infixr' | 'infixl') <space>+ <num> <space>+ <op>
<op> := '+' | '-' | '/' | '*'
<term> := <num> | <id> | <paren>
<paren> := '(' <skip_many> <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
//文脈
ctx := φ //空文脈
ctx ∪ 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
//括弧
(tt1)=>(tt1') (tt1=>tt1')
(v1) =>v1
//型
T := i32
T->T
//型つけ---------------------------
//変数
x:T (x:T ∈ ctx)
//関数適応
t1 t2 :T12 (t1:T11->T12 かつ t2:T11)
//数値
n:i32
//演算子
tt1 op tt2 :i32 (tt1:i32 , tt2:i32)
//括弧
(tt1) :T (tt1 :T)