view core/src/luan/impl/LuanCompiler.java @ 503:92c3d22745b8

make _ENV optional
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 20 May 2015 23:24:46 -0600
parents b48cfa14ba60
children 60c549d43988
line wrap: on
line source

package luan.impl;

import luan.LuanFunction;
import luan.LuanState;
import luan.LuanException;
import luan.LuanSource;
import luan.LuanElement;
import luan.LuanTable;
import luan.modules.JavaLuan;
import luan.modules.PackageLuan;
import java.util.Map;


public final class LuanCompiler {
	private LuanCompiler() {}  // never

	public static LuanFunction compile(LuanState luan,LuanSource src,LuanTable env,boolean allowExpr) throws LuanException {
		LuanParser parser = new LuanParser(src,env);
		parser.addVar( "java", JavaLuan.javaFn );
		parser.addVar( "require", PackageLuan.requireFn );
		FnDef fnDef = parse(luan,parser,allowExpr);
		final LuanStateImpl luanImpl = (LuanStateImpl)luan;
		return new Closure(luanImpl,fnDef);
	}

	private static FnDef parse(LuanState luan,LuanParser parser,boolean allowExpr) throws LuanException {
		try {
			if( allowExpr ) {
				FnDef fnDef = parser.Expression();
				if( fnDef != null )
					return fnDef;
			}
			return parser.RequiredModule();
		} catch(ParseException e) {
//e.printStackTrace();
			throw luan.exception( e.getFancyMessage() );
		}
	}

	public static LuanState newLuanState() {
		return new LuanStateImpl();
	}
}