2017-10-02 7 views
0

こんにちはを解析し、私はこのようなコードだ:Haskellは表現

data Digit = Zero | One | Two | Three | Four | Five | Six | Seven | Eight | 
      Nine 
      deriving (Eq, Show) 

data Number = Single Digit | Many Digit Number deriving (Eq, Show) 

data Expr = Lit Number 
      | Sub Expr 
      | Sum Expr Expr 
      | Mul Expr Expr 
      deriving (Eq, Show) 

だから、このコードのアイデアは* + 2 3 * 2 + 6 - 2のように、文字列を持つことである、((2 + 3) * (2 * (6 - 2)))として表現され、その後、部品を置くためにこれを使用しますそこにある文字列のタイプ。もちろん、最終的に結果を見つけます。この場合は40です。問題は、構文解析についてあまりよく分からないため、このような式をどのように解析できるかわかりません。私は、文字列が人や何かのような型に解析されている単純な構文解析を見てきました。しかし、私はこれが少し複雑だと思う。誰かが何か提案があれば、本当に興味があります。

+0

あなたは必ずご入力は* + 2 '3 * 2であることを想定されていないされていますか?これは接頭辞ポーランド表記のように見えます。 – Alec

+0

ええ、私は間違ったコードを掲示しました、それは "Sub Expr Expr"ではなく、 "Sub Expr Expr"であると思われます、ごめんなさい – iIllumination

+1

https://stackoverflow.com/q/46516500/625403と比較してください - どこかでこれを練習として割り当てます。この場合、 '-'はバイナリ減算ではなく、単項否定であると考えられます。 – amalloy

答えて

6

Haskell用の洗練された解析ライブラリが存在し、このタスクには最適ですが、入力フォーマットは簡単です。入力を消費し、解析された式と文字列の残りの部分を解析し続けます。ここではそれがどのように見えるかのスケルトンの

は: - 6 2`

parse :: String -> (String, Expr) 
parse (' ':more) = parse more 
parse ('-':more) = let (remainder, e) = parse more 
        in (remainder, Sub e) 
parse ('+':more) = undefined -- TODO 
parse ('*':more) = undefined -- TODO 
parse [email protected](num:more) | isDigit num = parseNumber s 
parse s = error ("unexpected input: " ++ s) 

parseNumber :: String -> (String, Expr) 
parseNumber s = undefined 
+2

モナド解析の概念についての素晴らしい紹介は、[Functional Pearls Paper](http://www.cs.nott.ac.uk/~pszgmh/pearl.pdf)です。 – mschmidt

+0

おかげで、とても助かりました!あなたが興味を持っていれば、私はページの上部にある私のほぼ完了したコードを入れました。たぶん、私はコードを改善する方法についていくつかの示唆を与えることはできません:P – iIllumination

+0

@iIllumination:しないでください。質問だけのための質問のポストを保つ;あなたが解決策(部分的なものでさえ)を持っているなら、その答えを投稿してください。私はあなたの編集をロールバックしました。 –