###実現したいこと
前置記法により記述された計算式を,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使用
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。