From: Andre P. <at...@us...> - 2004-05-14 15:34:40
|
Update of /cvsroot/hoc/hoc/Samples/ExpressionParser In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24809/ExpressionParser Added Files: EPController.hs ExpressionParser.hs Main.hs Makefile Selectors.hs Log Message: Added ExpressionParser sample --- NEW FILE: EPController.hs --- {-# OPTIONS -fglasgow-exts #-} module EPController where import Cocoa hiding (parse, info_evaluate, ImpType_evaluate) import ExpressionParser import Selectors import Text.ParserCombinators.Parsec (parse) $(declareClass "EPController" "NSObject") $(exportClass "EPController" "ep_" [ Outlet "expressionEntry" [t| NSTextField () |] , Outlet "evaluation" [t| NSTextField () |] , InstanceMethod Selectors.info_evaluate ] ) obj #. var = obj # getIVar var ep_evaluate _ self = do expressionTextField <- (self #. _expressionEntry) expression <- expressionTextField # stringValue >>= haskellString evaluation <- self #. _evaluation case (parse expr "" expression) of Left err -> self #. _evaluation >>= setStringValue (toNSString "(error)") Right answer -> self #. _evaluation >>= setStringValue (toNSString $ show answer) --- NEW FILE: ExpressionParser.hs --- module ExpressionParser where import Text.ParserCombinators.Parsec import Text.ParserCombinators.Parsec.Expr expr :: Parser Integer expr = buildExpressionParser table factor <?> "expression" table = [ [op "*" (*) AssocLeft, op "/" div AssocLeft] , [op "+" (+) AssocLeft, op "-" (-) AssocLeft] ] where op s f assoc = Infix (do { string s; return f }) assoc factor = do { char '('; x <- expr; char ')'; return x } <|> number <?> "simple expression" number :: Parser Integer number = do { ds <- many1 digit; return (read ds) } <?> "number" --- NEW FILE: Selectors.hs --- {-# OPTIONS -fglasgow-exts #-} module Selectors where import AppKit.NSButton $(declareSelector "evaluate:" [t| forall a. NSButton a -> IO () |]) --- NEW FILE: Makefile --- include ../../config.mk all: ExpressionParser.app ExpressionParser.app: ExpressionParser hocwrap ExpressionParser ExpressionParser: *.hs mkdir -p build ghc --make Main.hs -odir build -hidir build -O -o $@ interpret: mkdir -p build hocwrap -i -- Main.hs -odir build -hidir build zerolink: nolink interpret nolink: mkdir -p build ghc --make Main.hs -odir build -hidir build -O -pgml true clean: rm -rf build/ ExpressionParser ExpressionParser.app/ 'Interpreted Haskell Application.app/' --- NEW FILE: Main.hs --- module Main where import EPController import AppKit.NSApplication(nsApplicationMain_) main = do initializeClass_EPController nsApplicationMain_ |