質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SML

SML(Standard ML) は関数型言語であるMLの標準規格です。 Standard ML で書かれたプログラムの大部分は、値を計算すべき式で構成されています。

Q&A

解決済

1回答

2630閲覧

SMLによる前置記法で記述された式の計算

退会済みユーザー

退会済みユーザー

総合スコア0

SML

SML(Standard ML) は関数型言語であるMLの標準規格です。 Standard ML で書かれたプログラムの大部分は、値を計算すべき式で構成されています。

0グッド

0クリップ

投稿2017/01/19 05:25

###実現したいこと
前置記法により記述された計算式を,SMLを用いて計算したいです.
前置記法ではかっこを用いなくても曖昧さなしに計算ができますが,今回は読みやすさのためにかっこを含む式を計算したいと思っています.
例えば,"( + (* 10 2) (* 2 3 ) )"のような数式を計算したいです.

###定義
かっこを含まない数式を以下のように定義します.

<EXP> ::= 非負整数 | <COMP> <COMP> ::= "+"<EXP><EXP> | "-"<EXP><EXP> | "*"<EXP><EXP> | "/"<EXP><EXP> |

また,かっこを含む数式を以下のように定義します.

<EXP> ::= 非負整数 | <COMP> <COMP> ::= "(""+"<EXP><EXP>")" | "(""-"<EXP><EXP>")" | "(""*"<EXP><EXP>")" | "(""/"<EXP><EXP>")" |

###ソースコード
かっこを含まない式は,以下のようなソースコードで実現することができました.
関数の名前をcalとしています.
__toInt__は文字列を数値に変更する関数,__separate__は"+ 10 20"のように空白を含む式を,["+","10","20"]のように意味のある部分に区切る関数です.

fun cal s = let fun EXP nil = raise SyntaxError | EXP (h::t) = if isInt h then (toInt h, t) else if h = "+" then COMP (h::t) else if h = "-" then COMP (h::t) else if h = "*" then COMP (h::t) else if h = "/" then COMP (h::t) else raise SyntaxError and COMP nil = raise SyntaxError | COMP (h::t) = if h = "+" then let val (v1,t1) = EXP t val (v2,t2) = EXP t1 in (v1 + v2, t2) end else if h = "-" then let val (v1,t1) = EXP t val (v2,t2) = EXP t1 in (v1 - v2, t2) end else if h = "*" then let val (v1,t1) = EXP t val (v2,t2) = EXP t1 in (v1 * v2, t2) end else if h = "/" then let val (v1,t1) = EXP t val (v2,t2) = EXP t1 in (v1 div v2, t2) end else raise SyntaxError in let val (result,rest) = EXP (separate s) in if rest = nil then result else raise SyntaxError end end;

このソースコードをどのように変更すればかっこにも対応するか分かりません.
よろしくお願いします.

###補足情報
SML
Standard ML of New Jersey使用

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ご質問の括弧つき前置記法は、LISPという言語を思わせます。Standard MLによるLISPの実装もあるようですので、探してみてはいかがでしょうか。

投稿2017/01/22 05:31

編集2017/01/22 06:53
ikedas

総合スコア4335

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問