java/ch/wlkl/wsm/AbstractCompiler.java
package ch.wlkl.wsm;
import java.util.regex.Pattern;
public abstract class AbstractCompiler extends Parser {
final ExFactory factory;
public static final Pattern resWords = Pattern.compile("catch|handle|do|end|.*End|then|else|elif");
public AbstractCompiler() {
this(new ExFactory());
}
public AbstractCompiler(ExFactory f) {
super("");
factory = f;
}
public Ex compile(String src) {
reset(src);
Ex res = seq();
if (! end())
fail("compile stop before end of source");
/* say("seq ==>\n" + res.format()); */
return res;
}
abstract Ex seq();
Ex checkName(Ex val, String nmA) {
name(nmA);
return val;
}
Ex checkLit(Ex val, String litA) {
if (! lit(litA))
fail(litA + " expected");
return val;
}
ExConst exConst() {
skip();
if (next(string))
return factory.cnst(xUnquote(tok));
else if(next(number))
return factory.cnst(Integer.parseInt(tok));
else
return null;
}
}