付録
コード 1に、mimium言語(バージョン0.4.0時点)のシンタックス定義をEBNF記法で示した。
ここでは演算子の優先順位をつけていないが、実際の優先順位は一般的なプログラミング言語の優先順位に準じた上で、@
演算子が一番低い優先順位となっている。
コード 1: mimiumのシンタックスのEBNFによる定義。
::= ?numbers?
number ::= ?all_alnum_and_underscore?
symbol ::= ?double_quote?<symbol>?double_quote?
string
::= <symbol>
rvar ::= <symbol> (":"<type>)?
lvar = <lvar> | <lvar_args> "," <lvar>
lvar_args ::::= "+"|"-"|"*"|"/"|"^"|"=="| "!="|">="|"<="|">"|"<"|"&&"| "||"
binop ::= "-" | "!"
uniop ::= <expr> <binop> <expr> | <uniop> <expr>
infix ::= <expr>"."<symbol>
field ::= <expr>"(" <expr_args> ")"
app ::= "|" <lvar_args> "|" ("->" <type>)? <expr>
lambda
if ::= "if" "("<expr>")" <expr> ("else" <expr>)?
::= "{"<statements>"}"
block ::= "self"|"now"|<number>|<string>|<rvar>| <infix>|<field>|<app>| <lambda>|<if>|<block>
expr ::= <expr> | <expr_args> "," <expr>
expr_args ::= <statement> | <statements> ?linebreak? <statement>
statements ::= <app>|<schedule>|<fndef>| <assign>|<lettuple>|<return>| <typealias>
statement ::= expr "@" expr
schedule ::= "fn" <symbol> "("<lvar_args>")" ("->" <type>)? <block>
fndef ::= <lvar> "=" <expr>
assign ::= <lvar_args> "=" <expr>
lettuple return ::= "return" <expr>
type ::= "void"|"float"|"string"|<symbol>| <tupletype>|<fntype>|<recordtype>
::= <type> | <types>","<type>
types = "()" | "("<types>")"
tupletype ::::= <tupletype>"->"<type>
fntype = "{"<typekeyvals>"}"
recordtype ::::= <typekeyval> | <typekeyvals>","<typekeyval>
typekeyvals ::= <string>":"<type>
typekeyval = "type" <symbol> "=" <type>
typealias ::
= <statements> program ::