From e1362fdb833381c44b5a432285be1582d36d2e33 Mon Sep 17 00:00:00 2001 From: "kr.angelov" Date: Wed, 28 Aug 2013 08:51:53 +0000 Subject: [PATCH] fix the error handling in the Java binding --- src/runtime/java/Test.java | 20 ++++++++++++------- src/runtime/java/jpgf.c | 1 + .../org/grammaticalframework/pgf/Concr.java | 4 ++-- .../org/grammaticalframework/pgf/Expr.java | 2 +- .../grammaticalframework/pgf/ParseError.java | 11 ++++++++++ .../org/grammaticalframework/pgf/Parser.java | 20 ++++++++++++++----- 6 files changed, 43 insertions(+), 15 deletions(-) create mode 100644 src/runtime/java/org/grammaticalframework/pgf/ParseError.java diff --git a/src/runtime/java/Test.java b/src/runtime/java/Test.java index c4d7b710c..15a8ff7ff 100644 --- a/src/runtime/java/Test.java +++ b/src/runtime/java/Test.java @@ -6,7 +6,7 @@ public class Test { public static void main(String[] args) { PGF gr = null; try { - gr = PGF.readPGF("/home/krasimir/www.grammaticalframework.org/treebanks/PennTreebank/ParseEngAbs.pgf"); + gr = PGF.readPGF("Phrasebook.pgf"); } catch (FileNotFoundException e) { e.printStackTrace(); return; @@ -14,16 +14,22 @@ public class Test { e.printStackTrace(); return; } - + System.out.println(gr.getAbstractName()); for (Map.Entry entry : gr.getLanguages().entrySet()) { System.out.println(entry.getKey()+" "+entry.getValue()+" "+entry.getValue().getName()); } - - Concr eng = gr.getLanguages().get("ParseEng"); - for (ExprProb ep : eng.parse("Phr", "where are you")) { - System.out.println("["+ep.getProb()+"] "+ep.getExpr()); - System.out.println(eng.linearize(ep.getExpr())); + + Concr eng = gr.getLanguages().get("PhrasebookEng"); + Concr ger = gr.getLanguages().get("PhrasebookGer"); + + try { + for (ExprProb ep : eng.parse(gr.getStartCat(), "where is the conference")) { + System.out.println("["+ep.getProb()+"] "+ep.getExpr()); + System.out.println(ger.linearize(ep.getExpr())); + } + } catch (ParseError e) { + System.out.println("Parsing failed at token \""+e.getToken()+"\""); } } } diff --git a/src/runtime/java/jpgf.c b/src/runtime/java/jpgf.c index f04f32e24..ec68c87a4 100644 --- a/src/runtime/java/jpgf.c +++ b/src/runtime/java/jpgf.c @@ -226,6 +226,7 @@ Java_org_grammaticalframework_pgf_Parser_parse gu_pool_free(pool); gu_pool_free(out_pool); + return NULL; } jclass expiter_class = (*env)->FindClass(env, "org/grammaticalframework/pgf/ExprIterator"); diff --git a/src/runtime/java/org/grammaticalframework/pgf/Concr.java b/src/runtime/java/org/grammaticalframework/pgf/Concr.java index df4d1c54f..6fde4c63f 100644 --- a/src/runtime/java/org/grammaticalframework/pgf/Concr.java +++ b/src/runtime/java/org/grammaticalframework/pgf/Concr.java @@ -6,7 +6,7 @@ public class Concr { public native String getName(); - public Iterable parse(String startCat, String s) { + public Iterable parse(String startCat, String s) throws ParseError { return new Parser(this, startCat, s); } @@ -25,7 +25,7 @@ public class Concr { // private stuff private PGF gr; - public long ref; + private long ref; private Concr(PGF gr, long ref) { this.gr = gr; diff --git a/src/runtime/java/org/grammaticalframework/pgf/Expr.java b/src/runtime/java/org/grammaticalframework/pgf/Expr.java index e129af68d..0dc4d1c4b 100644 --- a/src/runtime/java/org/grammaticalframework/pgf/Expr.java +++ b/src/runtime/java/org/grammaticalframework/pgf/Expr.java @@ -4,7 +4,7 @@ public class Expr { private Pool pool; private long ref; - private Expr(Pool pool, long ref) { + Expr(Pool pool, long ref) { this.pool = pool; this.ref = ref; } diff --git a/src/runtime/java/org/grammaticalframework/pgf/ParseError.java b/src/runtime/java/org/grammaticalframework/pgf/ParseError.java new file mode 100644 index 000000000..a527c8e47 --- /dev/null +++ b/src/runtime/java/org/grammaticalframework/pgf/ParseError.java @@ -0,0 +1,11 @@ +package org.grammaticalframework.pgf; + +public class ParseError extends Exception { + public ParseError(String token) { + super(token); + } + + public String getToken() { + return getMessage(); + } +} diff --git a/src/runtime/java/org/grammaticalframework/pgf/Parser.java b/src/runtime/java/org/grammaticalframework/pgf/Parser.java index 636deb521..8892d423a 100644 --- a/src/runtime/java/org/grammaticalframework/pgf/Parser.java +++ b/src/runtime/java/org/grammaticalframework/pgf/Parser.java @@ -6,20 +6,30 @@ class Parser implements Iterable { private Concr concr; private String s; private String startCat; + private ExprIterator iter; - public Parser(Concr concr, String startCat, String s) { + public Parser(Concr concr, String startCat, String s) throws ParseError { this.concr = concr; this.startCat = startCat; this.s = s; + this.iter = parse(concr, startCat, s); } public Iterator iterator() { - ExprIterator iter = parse(concr, startCat, s); if (iter == null) { - throw new PGFError("The sentence cannot be parsed"); + // If someone has asked for a second iterator over + // the same parse results then we have to parse again. + try { + return parse(concr, startCat, s); + } catch (ParseError e) { + return null; + } + } else { + ExprIterator tmp_iter = iter; + iter = null; + return tmp_iter; } - return iter; } - static native ExprIterator parse(Concr concr, String startCat, String s); + static native ExprIterator parse(Concr concr, String startCat, String s) throws ParseError; }