付録

コード 1に、mimium言語(バージョン0.4.0時点)のシンタックス定義をEBNF記法で示した。 ここでは演算子の優先順位をつけていないが、実際の優先順位は一般的なプログラミング言語の優先順位に準じた上で、@演算子が一番低い優先順位となっている。

コード 1: mimiumのシンタックスのEBNFによる定義。

  number ::= ?numbers?
  symbol ::= ?all_alnum_and_underscore?
  string ::= ?double_quote?<symbol>?double_quote?

  rvar ::= <symbol>
  lvar ::= <symbol> (":"<type>)?
  lvar_args ::= <lvar> | <lvar_args> "," <lvar> 
  binop ::= "+"|"-"|"*"|"/"|"^"|"=="| "!="|">="|"<="|">"|"<"|"&&"| "||"
  uniop ::= "-" | "!" 
  infix ::= <expr> <binop> <expr> | <uniop> <expr>
  field ::= <expr>"."<symbol>
  app ::= <expr>"(" <expr_args> ")"
  lambda ::= "|" <lvar_args> "|" ("->" <type>)? <expr>

  if ::=  "if" "("<expr>")" <expr> ("else" <expr>)?
  block ::= "{"<statements>"}"
  expr ::= "self"|"now"|<number>|<string>|<rvar>| <infix>|<field>|<app>| <lambda>|<if>|<block>
  expr_args ::= <expr> | <expr_args> "," <expr>
  statements ::= <statement> | <statements> ?linebreak? <statement>
  statement ::= <app>|<schedule>|<fndef>| <assign>|<lettuple>|<return>| <typealias>
  schedule ::= expr "@" expr
  fndef ::=  "fn" <symbol> "("<lvar_args>")" ("->" <type>)? <block>
  assign ::= <lvar> "=" <expr>
  lettuple ::= <lvar_args> "=" <expr>
  return ::= "return" <expr>

  type ::= "void"|"float"|"string"|<symbol>| <tupletype>|<fntype>|<recordtype>
  types ::= <type> | <types>","<type>
  tupletype ::= "()" | "("<types>")"
  fntype ::= <tupletype>"->"<type>
  recordtype ::= "{"<typekeyvals>"}"
  typekeyvals ::= <typekeyval> | <typekeyvals>","<typekeyval>
  typekeyval ::= <string>":"<type>
  typealias ::= "type" <symbol> "=" <type>

  program ::= <statements>