1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Qiita全国学生対抗戦Advent Calendar 2024

Day 21

Scratchで簡単な計算機を作ったら地獄だった

Posted at

何を思ったのかScratchでプログラミング言語を作ろうと思ったけど、難しすぎて計算機で挫折しました。(普段は主にC++でプログラミング言語を作っています)

インタプリタの仕組み

プログラム

字句解析器(Lexer)

字句解析器は、式をTokenと呼ばれる最も小さな要素に分割します。(日本語の文章を単語で分けるイメージ)

スクリーンショット 2024-11-19 7.26.30.png

構文解析

構文解析器は、字句解析器で生成したtokenの列につながりを持たせます。

そして、演算子の順番を考慮するために、それぞれの優先度ごとに関数を作ります。優先度の低い演算子の関数(例えば = の関数)からはそれよりも優先度の高い演算子の関数を呼びます(例えば +,- の関数)。そして、最も優先度の高い演算子の関数は、要素(例えば 3,a,(3 + 5) など)を表す関数(factor)を呼びます。
この計算機だと、演算子の順位は下の表のようになります。

演算子の名前 演算子
冪乗 ^
掛け算・割り算・余り *, /, %
足し算・引き算 +, -
比較演算子 ==, !=, >, <
論理演算子 &, |, !
代入演算子 =

要素(factor)スクリーンショット 2024-11-23 15.55.25.png

冪乗

スクリーンショット 2024-11-20 17.55.56.png

四則演算 余り

スクリーンショット 2024-11-20 17.56.33.png

比較演算子・論理演算子・代入

四則演算と同じような感じで定義しました

インタプリタ

インタプリタは、構文木を上から辿っていくことで計算していきます。

スクリーンショット 2024-11-23 11.59.26.png
演算子の処理定義が無限に続きます。。。

困った点・工夫した点

関数の戻り値

構文解析は基本再帰で行うのですが、Scratchの関数(どちらかというとサブルーチン)は戻り値を返すことができないので、苦労しました。結局、実際の機械語の関数呼び出しの仕組みを参考にして、戻り値を格納するリストを作り、そこでPushとPopを繰り返すことで実現しました。
スクリーンショット 2024-11-23 15.56.59.png

オブジェクト

Scratchはオブジェクト指向言語では(多分)ないので、こちらも要素を表すためにメモリーという名前のリストを作り、オブジェクトを表すときはその番号を示すことで実現しました。
スクリーンショット 2024-11-23 15.56.43.png

結論

Scratchはめんどくさい!
少なくともプログラミング言語を作るときはScratchではない言語で作った方がいいと思います。
ただ、関数やオブジェクトもがんばれがスクラッチで作れることがわかりました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?