haskell-bind: add a cabal file and examples/pgf-shell.hs

* The haskell-bind.cabal file makes it easy to build the haskell binding and
  use it in ghci.
* pgf-shell.hs is a simple example of how to use the haskell binding.
This commit is contained in:
hallgren
2014-01-17 14:02:35 +00:00
parent b0a40d82b9
commit 045eeeb280
2 changed files with 94 additions and 0 deletions

View File

@@ -0,0 +1,62 @@
-- | pgf-shell: A simple shell to illustrate the use of the Haskell binding
-- to the C implementation of the PGF run-time system.
--
-- The shell has 3 commands:
--
-- * parse: p <lang> <text>
-- * linearize: l <lang> <tree>
-- * translate: t <lang> <lang> <text>
import Control.Monad(forever)
import Data.Char(isSpace)
import System.IO(hFlush,stdout)
import System.IO.Error(catchIOError)
import System.Environment
import CRuntimeFFI
import CId
main = getPGF =<< getArgs
getPGF [path] = pgfShell =<< readPGF path
getPGF _ = putStrLn "Usage: pgf-shell <path to pgf>"
pgfShell pgf =
forever $ do putStr "> "; hFlush stdout
execute pgf =<< readLn
execute pgf cmd =
case cmd of
L lang tree -> do c <- getConcr' pgf lang
putStrLn $ linearize c tree
P lang s -> do c <- getConcr' pgf lang
printl $ parse c (startCat pgf) s
T from to s -> do cfrom <- getConcr' pgf from
cto <- getConcr' pgf to
putl [linearize cto t|(t,_)<-parse cfrom (startCat pgf) s]
_ -> putStrLn "Huh?"
`catchIOError` print
getConcr' pgf lang =
maybe (fail $ "Concrete syntax not found: "++show lang) return $
getConcr pgf lang
printl xs = putl $ map show xs
putl = putStr . unlines
-- | Abstracy syntax of shell commands
data Command = P CId String | L CId Tree | T CId CId String deriving Show
-- | Shell command parser
instance Read Command where
readsPrec _ s =
[(P l r2,"") | ("p",r1)<-lex s,
(l,r2) <- reads' r1]
++ [(L l t,"") | ("l",r1)<-lex s,
(l,r2)<- reads' r1,
Just t<-[readExpr r2]]
++ [(T l1 l2 r3,"") | ("t",r1)<-lex s,
(l1,r2)<-reads' r1,
(l2,r3)<-reads' r2]
-- | Workaround for deficiency in instance Read CId
reads' s = reads (dropWhile isSpace s)

View File

@@ -0,0 +1,32 @@
-- Initial haskell-bind.cabal generated by cabal init. For further
-- documentation, see http://haskell.org/cabal/users-guide/
name: haskell-bind
version: 0.1.0.0
-- synopsis:
-- description:
homepage: http://www.grammaticalframework.org
license: LGPL-3
license-file: LICENSE
author: Inari
-- maintainer:
-- copyright:
category: Language
build-type: Simple
extra-source-files: README
cabal-version: >=1.10
library
exposed-modules: CId, CRuntimeFFI
other-modules: Gu, PgfLow
build-depends: base >=4.6 && <4.7, bytestring >=0.10 && <0.11, pretty >=1.1 && <1.2
-- hs-source-dirs:
build-tools: hsc2hs
extra-libraries: gu pgf
default-language: Haskell2010
executable pgf-shell
main-is: pgf-shell.hs
hs-source-dirs: examples
build-depends: base, haskell-bind
default-language: Haskell2010