package it.xsemantics.example.fj.typesystem.fj.rules; import it.xtypes.runtime.*; public class TProgramTypeRule extends FJTypeSystemRule { protected Variable<it.xsemantics.example.fj.fj.Type> var_mainType = new Variable<it.xsemantics.example.fj.fj.Type>( createEClassifierType(basicPackage.getType())); protected Variable<it.xsemantics.example.fj.fj.Program> var_p = new Variable<it.xsemantics.example.fj.fj.Program>( createEClassifierType(basicPackage.getProgram())); protected Variable<String> right_var; protected TypingJudgmentEnvironment env_G = new TypingJudgmentEnvironment(); public TProgramTypeRule() { this("TProgram", "|-", ":"); } public TProgramTypeRule(String ruleName, String typeJudgmentSymbol, String typeStatementRelation) { super(ruleName, typeJudgmentSymbol, typeStatementRelation); } @Override public Variable<it.xsemantics.example.fj.fj.Program> getLeft() { return var_p; } @Override public Variable<String> getRight() { if (right_var == null) right_var = new Variable<String>(createBasicType("String"), "OK"); return right_var; } @Override public TypingJudgmentEnvironment getEnvironment() { return env_G; } @Override public void setEnvironment(TypingJudgmentEnvironment environment) { if (environment != null) env_G = environment; } @Override public RuntimeRule newInstance() { return new TProgramTypeRule("TProgram", "|-", ":"); } @Override public void applyImpl() throws RuleFailedException { boolean or_temp_1 = false; // first or branch try { equals(var_p.getValue().getMain(), null); or_temp_1 = true; } catch (Throwable e) { registerFailure(e); // go on with other branches } // last or branch if (!or_temp_1) { try { var_mainType = new Variable<it.xsemantics.example.fj.fj.Type>( createEClassifierType(basicPackage.getType()), null); applyTypeRule(env_G, var_p.getValue().getMain(), var_mainType); } catch (Throwable e) { registerFailure(e); throw new RuleFailedException("main expression " + stringRep(var_p.getValue().getMain()) + " is not welltyped"); } } } @Override protected String failMessage() { return "cannot type"; } }