Scyphus Draft — C言語で作るプログラミング言語

インタープリタの一実装を使って, プログラミング言語の作り方を簡単に解説できればと思います.


文法

まずは,簡単のため変数,整数リテラルとその四則演算, 制御構文として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

実装

  1. プログラムローダー: ソースコードからプログラムを読み込む
  2. トークナイザー: ソースコードを文法解析しやすいようにトークンごとに分割する
  3. パーサー: トークンから文法解析する
  4. 評価器(仮想マシン): 文法解析したプログラムを実行する