blob: 711c6d96064b20aa3b6be9b00cb1b71796992151 [file] [log] [blame]
package jp.ac.kobe_u.cs.prolog.lang;
import java.util.StringTokenizer;
/**
* Prolog Cafe launcher.
* The <code>PrologMain</code> class launchs the Prolog Cafe system.<br>
* The usage is as follows, where
* <code>package</code> is a package name, and
* <code>predicate</code> is a predicate name (only atom).
* <pre>
* % java -cp $PLCAFEDIR/plcafe.jar jp.ac.kobe_u.cs.prolog.lang.PrologMain package:predicate
* % java -cp $PLCAFEDIR/plcafe.jar jp.ac.kobe_u.cs.prolog.lang.PrologMain predicate
* </pre>
* Let us show a sample session for launching a small Prolog interpreter:
* <code>jp.ac.kobe_u.cs.prolog.builtin:cafeteria/0</code>.<br>
* <pre>
* % java -cp $PLCAFEDIR/plcafe.jar:$CLASSPATH jp.ac.kobe_u.cs.prolog.lang.PrologMain jp.ac.kobe_u.cs.prolog.builtin:cafeteria
* Prolog Cafe X.X.X (YYY)
* Copyright(C) 1997-200X M.Banbara and N.Tamura
* | ?-
* </pre>
*
* @author Mutsunori Banbara (banbara@kobe-u.ac.jp)
* @author Naoyuki Tamura (tamura@kobe-u.ac.jp)
* @version 1.0
*/
public class PrologMain {
/** Version information */
public static String VERSION = "Prolog Cafe 1.2.5 (mantis)";
/** Copyright information */
public static String COPYRIGHT = "Copyright(C) 1997-2009 M.Banbara and N.Tamura";
public static void main(String argv[]) {
PrologControl p;
Predicate code;
String goal;
Class clazz;
try {
System.err.println("\n" + VERSION);
System.err.println(COPYRIGHT);
if (argv.length != 1) {
usage();
System.exit(999);
}
clazz = (new PrologClassLoader()).loadPredicateClass("jp.ac.kobe_u.cs.prolog.builtin",
"initialization",
2,
true);
Term arg1 = Prolog.Nil;
arg1 = new ListTerm(SymbolTerm.makeSymbol("user"), arg1);
arg1 = new ListTerm(SymbolTerm.makeSymbol("jp.ac.kobe_u.cs.prolog.builtin"), arg1);
// arg1 = new ListTerm(SymbolTerm.makeSymbol("jp.ac.kobe_u.cs.prolog.compiler.pl2am"), arg1);
// arg1 = new ListTerm(SymbolTerm.makeSymbol("jp.ac.kobe_u.cs.prolog.compiler.am2j"), arg1);
Term arg2 = parseAtomicGoal(argv[0]);
if (arg2 == null) {
usage();
System.exit(1);
}
Term[] args = {arg1, arg2};
code = (Predicate)(clazz.newInstance());
p = new PrologControl();
p.setPredicate(code, args);
for (boolean r = p.call(); r; r = p.redo()) {}
System.exit(0);
} catch (Exception e){
e.printStackTrace();
System.exit(1);
}
}
/** Returns a term for given string representation of atom goal, or
* <code>null</code> if parsing fails.
* @param s a string representation of initial goal (ex. foge:main).
* @return a term which corresponds to a given string,
* or <code>null</code> if parsing fails.
*/
protected static Term parseAtomicGoal(String s) {
StringTokenizer st = new StringTokenizer(s, ":");
int i = st.countTokens();
if (i == 1) {
Term[] args = {SymbolTerm.makeSymbol("user"),
SymbolTerm.makeSymbol(st.nextToken())};
return new StructureTerm(SymbolTerm.makeSymbol(":", 2), args);
} else if (i == 2) {
Term[] args = {SymbolTerm.makeSymbol(st.nextToken()),
SymbolTerm.makeSymbol(st.nextToken())};
return new StructureTerm(SymbolTerm.makeSymbol(":", 2), args);
} else {
return null;
}
}
/** Shows usage */
protected static void usage() {
String s = "Usage:\n";
s += "java -cp $PLCAFEDIR/plcafe.jar";
s += " jp.ac.kobe_u.cs.prolog.lang.PrologMain package:predicate\n";
s += "java -cp $PLCAFEDIR/plcafe.jar";
s += " jp.ac.kobe_u.cs.prolog.lang.PrologMain predicate\n";
s += " package: package name\n";
s += " predicate: predicate name (only atom)";
System.out.println(s);
}
/*
public static Term makeList(int n){
Term t = SymbolTerm.makeSymbol("[]");
for (int i=n; i>0; i--){
t = new ListTerm(new IntegerTerm(i), t);
}
return t;
}
*/
}