Programming Language "Duskul" Version 1.1.0

このメモでの記法
  x ::= y  xはyと定義する
  { x }    xの０回以上の繰り返し
  x | y    xまたはyのどちらか
  [ x ]    xはあっても、なくてもよい
  ( x )    xと同じ。まとまりを表すための記法。
  'aaa'    記号として aaa と書く
  ...      常識的な意味での中略
　例。
	{ 'a' | 'b' }    'a' または 'b' の０回以上の繰り返し。
	{ 'a' | ( 'b' 'c' ) }    'a' または「'b' 'c'」の０回以上の繰り返し。
	[ 'a' | 'b' ]    'a' または 'b' または何もない。


識別子 ::= alpha { alpha | digit }
符号なし整数定数 ::= digit { digit }
alpha ::= 'a' | 'b' | ... | 'z' | 'A' | 'B' | ... | 'Z'
digit ::= '0' | '1' | ... | '9'

整数定数 ::= [ '+' | '-' ] 符号なし整数定数

文字列 ::= '"' { 文字列要素 } '"'
文字列要素 ::= ASCII文字のうち、0x20, 0x21, 0x23から0x5b、0x5dから0x7e
文字列要素 ::= ASCII文字を含まないUTF-8エンコードのUnicode文字
文字列要素 ::= ( '\' '"' | '\' '\' | '\' 'n' | '\' 't' | '\' 'r' )

プログラム ::= トップレベル宣言 { トップレベル宣言 }
トップレベル宣言 ::= サブルーチン | 前方宣言 | グローバル変数宣言

サブルーチンヘッダ ::= 関数ヘッダ | 手続きヘッダ
関数ヘッダ ::= 'func' 識別子 仮引数列
手続きヘッダ ::= 'proc' 識別子 仮引数列
サブルーチン ::= サブルーチンヘッダ 文列 'end'

仮引数列 ::= '(' [ 仮引数宣言 ] ')'
仮引数宣言 ::= 識別子 { ',' 識別子 }

前方宣言 ::= 'declare' サブルーチンヘッダ

グローバル変数宣言 ::= 'var' 識別子 '=' 整数定数

文列 ::= { 実行文 } [ 分岐文 ]

実行文 ::= 代入文 | IF文 | WHILE文 | FOR文 | CALL文 | PRINT文 | INPUT文

代入文 ::= [ 'var' ] 変数 = 式
変数 ::= 識別子

分岐文 ::= RETURN文 | BREAK文
RETURN文 ::= 'return' [ 式 ]
BREAK文 ::= 'break'

IF文 ::= 'if' 式 条件処理
条件処理 ::= THEN構文 'end'
条件処理 ::= 分岐文
THEN構文 ::= 'then' 文列 [ ELSE構文 | ELSIF構文 ]
ELSE構文 ::= 'else' 文列
ELSIF構文 ::= 'elsif' 式 THEN構文

CALL文 ::= 'call' 手続き呼出
手続き呼出 ::= サブルーチン呼出
関数呼出 ::= サブルーチン呼出
サブルーチン呼出 ::= 識別子 '(' [ 実引数列 ] ')'
実引数列 ::= 式 { ',' 式 }


WHILE文 ::= 'while' 式 'do' 文列 'end'

FOR文 ::= 'for' [ 'var' ] 変数名 = 式 'to' 式 [ STEP部 ] 'do' 文列 'end'
STEP部 ::= 'step' 式

PRINT文 ::= 'print' PRINT引数
PRINT文 ::= 'println' PRINT引数
PRINT引数 ::= '(' [ PRINT引数列 ] ')'
PRINT引数列 ::= PRINT実引数 { ',' PRINT実引数 }
PRINT実引数 ::= 式 | 文字列

INPUT文 ::= 'input' '(' 変数列 ')'
変数列 ::= 識別子 { ',' 識別子 }

式 ::= 項 { 二項演算子 項 }
項 ::= [ 前置演算子 ] 因子
項 ::= 整数定数
因子 ::= 識別子 | 関数呼出 
因子 ::= '(' 式 ')'

二項演算子 ::= 'and' | 'or' | '==' | '<>' | '>' | '>=' | '<' | '<='
二項演算子 ::= '+' | '-' | '*' | '/' | '%'

前置演算子 ::= '+' | '-' | 'not'
