文法
まずは,簡単のため変数,整数リテラルとその四則演算, 制御構文として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
実装
- プログラムローダー: ソースコードからプログラムを読み込む
- トークナイザー: ソースコードを文法解析しやすいようにトークンごとに分割する
- パーサー: トークンから文法解析する
- 評価器(仮想マシン): 文法解析したプログラムを実行する