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;
    }
}