文法
まずは,簡単のため変数,整数リテラルとその四則演算, 制御構文としてprint文(とデバッグ用のdump文)のみを サポートすることとします.
# # Premises # bindigit ::= "0" | "1" octdigit ::= "0"..."7" digit ::= "0"..."9" nonzerodigit ::= "1"..."9" hexdigit ::= "0"..."9" | "a"..."f" | "A"..."F" letter ::= lowercase | uppercase lowercase ::= "a"..."z" uppercase ::= "A"..."Z" whitespace ::= "\t" | "\n" | "\v" | "\f" | "\r" | " " # # ** Identifier ** # identifier ::= (letter | "_") (letter | digit | "_")* # # ** Literals ** # literal ::= binint | octint | decint | hexint # # Integer literals # # Binary integer binint ::= 0 b bindigit+ # Octal integer octint ::= 0 octdigit+ # Decimal integer decint ::= nonzerodigit digit* # Hexdecimal integer hexint ::= 0 x hexdigit+ # # ** Expressions ** # # Atomic expression atom ::= literal # Unary expression u_expr ::= atom | "-" u_expr | "+" u_expr # Multiplication or division md_expr ::= u_expr ( ("*" | "/") u_expr )* # Addition or substraction as_expr ::= md_expr ( ("+" | "-") md_expr )* # Expression expression ::= as_expr # # ** Statements ** # statement ::= expression_stmt ";" | print_stmt ";" | dump_stmt ";" expression_stmt ::= expression print_stmt ::= "print" expression dump_stmt ::= "dump" expression
実装
- プログラムローダー: ソースコードからプログラムを読み込む
- トークナイザー: ソースコードを文法解析しやすいようにトークンごとに分割する
- パーサー: トークンから文法解析する
- 評価器(仮想マシン): 文法解析したプログラムを実行する