aboutsummaryrefslogtreecommitdiff
path: root/Tools/PirahaPeg
diff options
context:
space:
mode:
authorIan Hinder <ian.hinder@aei.mpg.de>2012-01-29 23:01:16 -0600
committerIan Hinder <ian.hinder@aei.mpg.de>2012-01-29 23:01:16 -0600
commit7c967ee25f2a2fb814dd07acccf38ecccd052c6d (patch)
tree6f053f4a7f23025946b376ca213216447cf81b33 /Tools/PirahaPeg
parent84f1b6ad6bd053a593a087f551ced3c15ad1d933 (diff)
Move Piraha interface into separate source file
Diffstat (limited to 'Tools/PirahaPeg')
-rw-r--r--Tools/PirahaPeg/Piraha.m71
1 files changed, 71 insertions, 0 deletions
diff --git a/Tools/PirahaPeg/Piraha.m b/Tools/PirahaPeg/Piraha.m
new file mode 100644
index 0000000..695fcb5
--- /dev/null
+++ b/Tools/PirahaPeg/Piraha.m
@@ -0,0 +1,71 @@
+
+(* Copyright 2012 Ian Hinder
+
+ This file is part of Kranc.
+
+ Kranc is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ Kranc 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Kranc; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*)
+
+BeginPackage["Piraha`", {"Errors`", "Helpers`", "JLink`", "Kranc`"}];
+
+Parse::usage = "Parse[grammarfile, pattern, inputfile] parses a file named inputfile using a grammar stored in a file named grammarfile using pattern as the root pattern. The parse tree is returned as Symbolic XML.";
+
+Begin["`Private`"];
+
+InstallJava[];
+
+(* The JRE does not share a current directory with the Mathematica
+ kernel, so relative paths have to be converted to absolute paths.
+ It is not possible to change the JRE working directory. *)
+
+absPath[s_String] :=
+ If[StringTake[s,1] === $PathnameSeparator, s, FileNameJoin[{Directory[],s}]];
+
+fullKrancDir = absPath[KrancDirectory];
+
+AddToClassPath[
+ FileNameJoin[{fullKrancDir, "Tools","PirahaPEG","piraha.jar"}]];
+
+DefFn[
+ Parse[grammarFileName_String, pattern_String, inputFileName_String] :=
+ Module[
+ {gf,g,m,c,sw,dout,xmlString,xml},
+
+ If[FileExistsQ[grammarFileName],
+ gf = grammarFileName,
+ If[FileExistsQ[FileNameJoin[{fullKrancDir, "Auxiliary", "Grammars", grammarFileName}]],
+ gf=FileNameJoin[{fullKrancDir, "Auxiliary", "Grammars", grammarFileName}],
+ ThrowError[StringForm["Cannot find grammar '`1`'", grammarFileName]]]];
+
+ g = JavaNew["edu.lsu.cct.piraha.Grammar"];
+ g@compileFile[JavaNew["java.io.File", gf]];
+
+ c = Grammar`readContents[JavaNew["java.io.File", absPath@inputFileName]];
+
+ m = g@matcher[pattern, c];
+
+ If[!m@match[0], ThrowError["Failed to parse input file: ",m@near[]@toString[]]];
+
+ sw = JavaNew["java.io.StringWriter"];
+ dout = JavaNew["edu.lsu.cct.piraha.DebugOutput", JavaNew["java.io.PrintWriter", sw]];
+ m@dumpMatchesXML[dout];
+ dout@flush[];
+ xmlString = sw@toString[];
+ xml = ImportString[xmlString, "XML"];
+ xml]];
+
+End[];
+
+EndPackage[];