puripuri2100 / ralcu

高機能電卓

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

ralcu

高機能電卓です。

実装されている機能

    • 整数値
    • 浮動小数点数
    • 真偽値
    • 関数
  • 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"

のようにすることで、ファイルに書かれたコードを評価して結果を得ることができる。

build・test方法

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

About

高機能電卓

License:MIT License


Languages

Language:Rust 98.9%Language:Makefile 1.1%