mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-09 04:59:31 -06:00
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:
62
src/runtime/haskell-bind/examples/pgf-shell.hs
Normal file
62
src/runtime/haskell-bind/examples/pgf-shell.hs
Normal 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)
|
||||
32
src/runtime/haskell-bind/haskell-bind.cabal
Normal file
32
src/runtime/haskell-bind/haskell-bind.cabal
Normal 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
|
||||
Reference in New Issue
Block a user