Skip to content

Release 0.2.0

らいパン粉 edited this page Sep 30, 2018 · 24 revisions

Release 0.2.0

int32型、関数ポインタに限定した、関数定義をできるように。

組み込みのprint関数

print 5

5が出力される

組み込みのscan関数

scan 0

入力された数値を返す、0は使われない数値

()で優先順位の調整ができるように

(4+5)*2

関数定義の例

add x y = x + y

使用例

print (add 4 5)

BNF

+は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)

Clone this wiki locally