高機能電卓です。
- 値
- 整数値
- 浮動小数点数
- 真偽値
- 関数
- 2項演算子
- 四則演算
- 整数用:
+
・-
・*
・/
・>
・<
- 小数用:
+.
・-.
・*.
・/.
・>.
・<.
- 真偽値用:
&&
・||
- 整数用:
- 四則演算
- 関数
sin: float -> float
cos: float -> float
float: int -> float
int: float -> int
- 条件分岐
if true then 5 else 6
のように使う- 条件部分などに式を入れることも可能
if 2 < (3 + 6) then sin 6.4 else 2.1
if true || false then sin 6.4 else 2.1
- 変数・関数定義
- OCaml likeな構文である
let x = e1 in e2
という形で定義する- 関数の場合は
let f x y = x + y in e2
のように引数を取ればよい fun x1 x2 .. xlast = x1 + x2 in e2
のように無名関数を定義することができる
- 関数適用
- 部分適用ができる
let f x y = x + y in let g y = f 2 in g 3
詳しくはtestフォルダ以下に様々な構文の例が書かれているため、それを参照してほしい。
cargo run -- --type text "let x = 5 in x"
のように、文字列を与えることで結果を得ることができる。
cargo run -- --type file "path/to/file"
のようにすることで、ファイルに書かれたコードを評価して結果を得ることができる。
Rustとそのパッケージマネージャを要求する。Rustの最低バージョンは1.64.0
である。
cargo build
でビルドができる。
cargo test
でテストができる。
src/lexer.rs
において実装されている。
先頭から一文字ずつ読み、用意されているパターンの先頭にマッチした場合に追加で読み進め、値を生成するようになっている。
src/parser.rs
において実装されている。
LL(1)の構文解析器である。
このコードはllmaker
という自作のパーサージェネレータを用いて、src/parser.mkr
から自動で生成されたのちに、parser.patch
ファイルを適用して若干の修正が施されている。
parser.mkrファイルは、BNF likeな構文定義文と、抽象構文木を作成するためのRustコードからなっている。
src/eval.rs
において実装されている。
eval_exp
関数で、再帰的に評価を行っている。
事前に用意されている関数や二項演算子はdef_primitive
で定義されている。
2022年度 GB27001 ソフトウェアサイエンス特別講義Aの課題として拡張・修正しました。
(c) Naoki Kaneko MIT Licnese