[英]Haskell parsing prefix evaluation
我正在努力處理這段代碼。
import Data.Char (isDigit)
data Ast = V Int | Neg Ast | A Ast Ast | M Ast Ast deriving (Show,Eq)
parseE ("+":xs) = let (e1,r1) = parseE xs; (e2,r2) = parseE r1 in (A e1 e2, r2)
parseE ("*":xs) = let (e1,r1) = parseE xs; (e2,r2) = parseE r1 in (M e1 e2, r2)
parseE ("-":xs) = let (a,r) = parseE r in (N a, r)
parseE ("(":xs) = let (a,")":r) = parseE r in (a,r)
parseE (x:xs) = (V (read x :: Int), xs)
eval xs = parseE xs
當我的輸入類似於: * + 1 2 * 3 + 7 - 2
我希望輸出為: ((1+2)*3)*(3*(7-2))
應該顯示45
當我在 haskell 中加載我的文件時,出現此錯誤:
:load "newf.hs"
[1 of 1] Compiling Main ( newf.hs, interpreted )
newf.hs:6:44: error: Data constructor not in scope: N :: Ast -> Ast
|
6 | parseE ("-":xs) = let (a,r) = parseE r in (N a, r)
| ^
Failed, 0 modules loaded.
錯誤消息說數據構造函數N
不在范圍內。 數據構造函數是data
語句右側的東西。 在您的示例中, V
、 Neg
、 A
和M
是數據構造函數。 “不在范圍內”的意思是“未定義在何處使用”。
看起來你在你打算寫Neg
地方寫了N
,反之亦然。 修復您的data
語句以閱讀:
data Ast = V Int | N Ast | A Ast Ast | M Ast Ast deriving (Show,Eq)
允許程序編譯。
程序中仍然存在一些錯誤。 例如,以下代碼陷入循環:
> parseE (words "* + 1 2 * 3 + 7 - 2")
(M (A (V 1) (V 2)) (M (V 3) (A (V 7) (N -- freezes
因為聲明:
let (a,r) = parseE r in (N a, r)
這引入了一個意外的遞歸定義——您將r
定義為調用parseE r
的結果,這會導致無限循環。 在嘗試處理括號的情況下,您會遇到類似的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.