Malbolge20用制御付き疑似命令列

このページは malbolge20_creator リポジトリの compiler/ternary(制御付き疑似命令列 .mg から 低級アセンブリ言語 .mc へのコンパイラ)の入力言語であり, そのソース(parser.yy / scanner.ll / define.h / CodeBlock.cc) を一次情報として記述している.C風高級言語のコンパイラ (compiler/highlevel)が出力する言語でもある.

文法

program ::= global_decl* prototype* routine*
global_decl ::= var_decl | FLAG flag_name = ( TRUE | FALSE )
prototype ::= PROTO routine_name
routine ::= DEF routine_name (改行) var_decl* statement* END
var_decl ::= VAR var_name = num
statement ::= OPR variable | ROT variable | IND_OPR variable |
OUTPUT | INPUT | SET flag_name | RESET flag_name | FLIP flag_name |
IF flag_name statement* ELSE statement* END |
REPEAT ( num | INF ) statement* END | BREAK num? |
SWITCH variable ( CASE0 statement* )? ( CASE1 statement* )? ( CASE2 statement* )? END |
CALL routine_name | RETURN
variable ::= var_name | var_name @ routine_name | CON0 | CON1 | CON2 | BASE | RETURN_ADDR

※num は10進の非負整数,または3進数(t を末尾に付ける.例: 01201201200120120120t)のいずれか.var_name/routine_name/flag_name は英字から始まり英数字とアンダースコアが続く任意の文字列.CON0 CON1 CON2 BASE RETURN_ADDR は変数名として使える予約語(下記参照).


サンプルプログラム

hello.mg — compiler/highlevel/sample/hello.c を compiler/highlevel/parser でコンパイルして得られた実例(VAR/PROTO/ DEF/ROT/OPR/OUTPUT/END を含む)


詳細

入力プログラムの全体像は以下の通り.

------------------------------
 グローバル変数・フラグ宣言(VAR / FLAG)

 ルーチンの前方宣言(PROTO)

 DEF ルーチン1
 ...
 END
 DEF ルーチン2
 ...
 END
 ...
------------------------------

コメントは # から改行までとなり無視される.キーワード(VAR FLAG DEF END ROT OPR 等)は大文字小文字を区別しない.

  • 変数・フラグの宣言
  • 命令の意味
  • C風高級言語との対応
  • 戻る