10
超超超超 超超超超超超超超超超超超超 slank( 超超超超 )

数式処理をするプログラムを設計

Embed Size (px)

Citation preview

Page 1: 数式処理をするプログラムを設計

超簡単な数式処理プログラム設計の話

slank(すらんく )

Page 2: 数式処理をするプログラムを設計

最小構成の数式処理プログラムを設計する

プログラムの仕様•一行入力の式を計算するプログラム•式のエラーチェックはしない•計算過程のアセンブラを生成する•式の計算結果は eaxレジスタに保存する

超簡単でシンプルな数式処理をするだけ!!!!

Page 3: 数式処理をするプログラムを設計

実行例

一行の式を入力して、その結果を出力するような感じにしたい。(pythonににせました )

今回は計算の仕組みのみの設計で。結果は eaxに格納します。

Page 4: 数式処理をするプログラムを設計

プログラムの動作手順1. 字句解析 (トークン生成 )

2. 構文解析 (抽象構文木生成 )

3. 実行コード生成

最適化などを行わない簡単なコンパイラの処理を参考にしています。

Page 5: 数式処理をするプログラムを設計

字句解析入力された一行の式をグループ分けをする。入力を“数値”と“演算子”に分ける。字句の判断は正規表現を用いて実装する。

2*(1+3)+2

<num,2><mult><lparen><num,1><plus><num,3><rparen><plus><num,2>

数式を字句ごとにトークン分けをする

Page 6: 数式処理をするプログラムを設計

構文解析字句解析で生成されたトークンから構文木を生成する。

字句解析してできたトークン要素を逆ポーランド記法に変換して、構文木を生成。

Page 7: 数式処理をするプログラムを設計

実行コード生成構文木の内容を上から順にスタックに pushして、上から順に読んでアセンブラを生成する。演算子を見つけながらアセンブラを生成。

1

2

*

4

+

3

+

この作業のアセンブラを生成

Page 8: 数式処理をするプログラムを設計

実行コード生成スタック上を演算子を見つけながらアセンブラを生成。*はmult,+は add, –は sub, /は divを使ったアセンブラで表現

mov 4, eaxadd 3, eaxmult 2, eaxadd 1, eax

あとは、 eaxの内容を出力できれば完了

Page 9: 数式処理をするプログラムを設計

今後の課題•まず実装する。。•変数を使えるようにする• if文、 for文 ,while文

Page 10: 数式処理をするプログラムを設計

今度実装してみます