From 4aadad134578c7f1f450f426c3717bc20adcd8ea Mon Sep 17 00:00:00 2001 From: adam Date: Sat, 2 Sep 2006 05:09:07 -0400 Subject: [PATCH] add experimental Haskell bindings darcs-hash:20060902090907-5007d-04b6e3b347e05486943858ef5cd91b9aaa63cc4e.gz --- Makefile | 62 +++++++++++++++++++++++- src/HaskellDemo.hs | 48 ++++++++++++++++++ src/edu/berkeley/sbp/misc/HaskellHelper.java | 24 +++++++++ src/edu/berkeley/sbp/misc/ParserServlet.java | 11 +++-- src/edu/berkeley/sbp/misc/RegressionTests.java | 4 ++ 5 files changed, 143 insertions(+), 6 deletions(-) create mode 100644 src/HaskellDemo.hs create mode 100644 src/edu/berkeley/sbp/misc/HaskellHelper.java diff --git a/Makefile b/Makefile index cbc38a9..06262e0 100644 --- a/Makefile +++ b/Makefile @@ -83,7 +83,7 @@ boot: edu.berkeley.sbp.jar edu.berkeley.sbp.jar: $(shell find src -name \*.java) mkdir -p bin - javac -cp javax.servlet.jar:tests/ArchSimA3.jar:tests/grappa.jar -d bin -sourcepath src $^ + javac -cp javax.servlet.jar -d bin -sourcepath src $^ cd bin; jar cf ../$@ . #-Xlint:unchecked javadoc: @@ -122,6 +122,7 @@ javadoc: clean: rm -rf doc/api edu.berkeley.sbp.jar bin edu.berkeley.sbp.tar.gz + rm -rf Makefile.bak *.hi *.o *.class *.jar Header_*.hs Class_*.hs *_JVM.hs InterfaceMyClass upload: make clean @@ -130,3 +131,62 @@ upload: echo '' > index.html rsync -are ssh --progress --verbose --delete ./ argus.cs.berkeley.edu:public_html/sbp/ + + +################################################################### +## Experimental Haskell bindings +## +## make runHaskellDemo JAVA_HOME= +## + +prefix := $(shell pwd)/prefix +jvm-bridge-site := umn.dl.sourceforge.net +jvm-bridge-url := http://$(jvm-bridge-site)/sourceforge/jvm-bridge/haskell-jvm-bridge-0.3.tar.gz +link := -L$(prefix)/lib/ \ + -L$(JAVA_HOME)/jre/lib/i386/ \ + -L$(JAVA_HOME)/jre/lib/i386/client/ \ + -lstdc++ -lJVMBridge -lJVMInvocation -lHaskellJVMBridge -ljava -ljvm -lverify +packages := -package haskell98 -package base -package rts -package concurrent -package lang +ghc := ghc -fglasgow-exts $(packages) $(link) -i$(prefix)/imports/ +bin := $(prefix)/bin/ + +.jvm-bridge: + mkdir -p $(prefix)/src + cd $(prefix)/src; curl $(jvm-bridge-url) | tar -xvzf - + + cd $(prefix)/src/haskell-jvm-bridge-*/Native; ./configure --prefix=$(prefix) --with-jvmdir=$(JAVA_HOME) + cd $(prefix)/src/haskell-jvm-bridge-*/Native; make + cd $(prefix)/src/haskell-jvm-bridge-*/Native; make install + + cd $(prefix)/src/haskell-jvm-bridge-*/Haskell; ./configure --prefix=$(prefix) --with-jvmdir=$(JAVA_HOME) + cd $(prefix)/src/haskell-jvm-bridge-*/Haskell; make + cd $(prefix)/src/haskell-jvm-bridge-*/Haskell; make install + + touch $@ + +runHaskellDemo: + mkdir -p bin + make bin/HaskellDemo + LD_LIBRARY_PATH=$$LD_LIBRARY_PATH:/usr/lib/:$(JAVA_HOME)/jre/lib/i386/:$(JAVA_HOME)/jre/lib/i386/client bin/HaskellDemo + +bin/Header_%.o: edu.berkeley.sbp.jar + cd bin; $(bin)/MakeHeaderModule -module Header_$* -jar ../edu.berkeley.sbp.jar + cd bin; $(ghc) -c Header_$*.hs + +bin/Class_%.o: bin/Header_%.o + cd bin; $(bin)/MakeClassModule -import Header_Java -import Header_$* -cp ../edu.berkeley.sbp.jar `echo $* | sed s/_/./g` + cd bin; $(ghc) -c Class_$*.hs + +bin/JVM_%.o: bin/Class_%.o + cd bin; echo -e $($*_list) | $(bin)/MakeJVMModule JVM_$* + cd bin; $(ghc) -c JVM_$*.hs + +edu_berkeley_sbp_misc_HaskellHelper_list = "edu.berkeley.sbp.misc.HaskellHelper\njava.lang.String\nedu.berkeley.sbp.Tree\njava.lang.Object" + +bin/HaskellDemo: src/HaskellDemo.hs \ + bin/Class_java_lang_Object.o \ + bin/Class_java_lang_String.o \ + bin/Class_edu_berkeley_sbp_Tree.o \ + bin/JVM_edu_berkeley_sbp_misc_HaskellHelper.o + cd bin; $(ghc) -c ../src/HaskellDemo.hs -o HaskellDemo.o + cd bin; $(ghc) -o HaskellDemo *.o diff --git a/src/HaskellDemo.hs b/src/HaskellDemo.hs new file mode 100644 index 0000000..7b545e6 --- /dev/null +++ b/src/HaskellDemo.hs @@ -0,0 +1,48 @@ +-- This is written in Haskell. +{-- +JVM-Bridge -- bridge from FP languages and others to the Java VM +Copyright (C) 2001 Ashley Yakeley + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +--} + +module Main where + { + import Header_Java; + import Class_edu_berkeley_sbp_misc_HaskellHelper; + import Class_java_lang_Object; + import Class_java_lang_Class; + import Class_java_lang_String; + + import Class_edu_berkeley_sbp_Tree; + + import JVM_edu_berkeley_sbp_misc_HaskellHelper; + import TypedString; + import JVMBridge; + import JavaText; + + main :: IO (); + main = runWithClasspath ["edu.berkeley.sbp.jar"] + ((do + class_JHaskellHelper + s1 <- new_JString_ArrayJchar $ toJavaString "tests/meta.g" + s2 <- new_JString_ArrayJchar $ toJavaString "tests/testcase.g" + tree <- main_JHaskellHelper_JString_JString (s1, s2) + strx <- toString_JObject ((castTLRef tree) :: Jjava_lang_Object) () + str <- getStringUTF strx + callIO $ putStrLn $ showUTF8 str + return () + ) :: JVM ()) + } diff --git a/src/edu/berkeley/sbp/misc/HaskellHelper.java b/src/edu/berkeley/sbp/misc/HaskellHelper.java new file mode 100644 index 0000000..b8a6006 --- /dev/null +++ b/src/edu/berkeley/sbp/misc/HaskellHelper.java @@ -0,0 +1,24 @@ +// Copyright 2006 all rights reserved; see LICENSE file for BSD-style license + +package edu.berkeley.sbp.misc; + +import edu.berkeley.sbp.*; +import edu.berkeley.sbp.misc.*; +import edu.berkeley.sbp.meta.*; +import edu.berkeley.sbp.chr.*; +import java.io.*; + +public class HaskellHelper { + + public static Tree main(String grammarFile, String targetFile) throws Exception { + + System.err.println("parsing " + grammarFile); + Tree res = new CharParser(MetaGrammar.newInstance()).parse(new FileInputStream(grammarFile)).expand1(); + Union meta = Grammar.create(res, "s", new MetaGrammarBindings()); + + System.err.println("parsing " + targetFile); + return new CharParser(meta).parse(new FileInputStream(targetFile)).expand1(); + + } + +} diff --git a/src/edu/berkeley/sbp/misc/ParserServlet.java b/src/edu/berkeley/sbp/misc/ParserServlet.java index 39097bf..44b3f84 100644 --- a/src/edu/berkeley/sbp/misc/ParserServlet.java +++ b/src/edu/berkeley/sbp/misc/ParserServlet.java @@ -6,18 +6,19 @@ import edu.berkeley.sbp.*; import edu.berkeley.sbp.chr.*; import java.util.*; import java.io.*; -import javax.servlet.*; -import javax.servlet.http.*; +//import javax.servlet.*; +//import javax.servlet.http.*; import java.io.*; import java.net.*; import java.util.*; -public class ParserServlet extends HttpServlet { - +public class ParserServlet /*extends HttpServlet*/ { + /* public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException { doPost(req, resp); } public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException { + */ /* try { try { @@ -73,6 +74,6 @@ public class ParserServlet extends HttpServlet { throw new ServletException(e); } */ - } + //} } diff --git a/src/edu/berkeley/sbp/misc/RegressionTests.java b/src/edu/berkeley/sbp/misc/RegressionTests.java index 33c015d..677f7dd 100644 --- a/src/edu/berkeley/sbp/misc/RegressionTests.java +++ b/src/edu/berkeley/sbp/misc/RegressionTests.java @@ -17,6 +17,10 @@ public class RegressionTests { public static boolean yes = false; public static boolean graph = false; + public static void main() throws Exception { + main(new String[] { "tests/meta.g", "tests/testcase.g", "tests/regression.tc" }); + } + public static void main(String[] s) throws Exception { try { boolean profile = false; -- 1.7.10.4