package com.sap.runlet.expressionpad;
import generated.ClassLexer;
import generated.ClassParser;
import org.antlr.runtime.ANTLRStringStream;
import org.antlr.runtime.RecognitionException;
import org.antlr.runtime.TokenRewriteStream;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.omg.ocl.expressions.VariableDeclaration;
import behavioral.actions.ActionsFactory;
import behavioral.actions.Block;
import behavioral.actions.Statement;
import com.sap.ap.cts.monet.parser.ClassParserFactory;
import com.sap.mi.textual.grammar.impl.ObservableInjectingParser;
import com.sap.runlet.abstractexpressionpad.Evaluator;
import com.sap.runlet.abstractinterpreter.StackFrame;
import com.sap.runlet.abstractinterpreter.repository.Repository;
import com.sap.runlet.interpreter.Activator;
import com.sap.runlet.interpreter.RunletInterpreter;
import com.sap.runlet.interpreter.RunletStackFrame;
import com.sap.runlet.interpreter.repository.simpleimpl.RunletInMemoryRepository;
import com.sap.tc.moin.repository.Connection;
import data.classes.Association;
import data.classes.AssociationEnd;
import data.classes.ClassTypeDefinition;
import data.classes.NativeImpl;
import data.classes.SapClass;
import data.classes.SignatureImplementation;
import data.classes.TypeDefinition;
import dataaccess.expressions.Expression;
/**
* Evaluator for Runlet Programming Language.
*
* Takes an expression or a statement in a concrete textual syntax as specified by Expressions.tcs
* and parses it into a transient set of model elements. If parsing went through correctly, the
* resulting {@link Expression} or {@link Statement} is handed to the
* {@link RunletInterpreter interpreter} for evaluation. The results are then displayed.
* <p>
*
* For statement execution, an instance of this class maintains a {@link StackFrame} to which
* variables can be added, e.g., by a {@link VariableDeclaration} statement.
*
* @author Jan Karstens (D046040)
*/
public class RunletEvaluator
extends Evaluator<
SapClass,
TypeDefinition,
ClassTypeDefinition,
Association,
AssociationEnd,
Statement,
Expression,
SignatureImplementation,
RunletStackFrame,
NativeImpl,
RunletInterpreter,
Block> {
public RunletEvaluator(String projectName) {
super(projectName);
}
public RunletEvaluator(String projectName, Repository<Association, AssociationEnd, SapClass, TypeDefinition, ClassTypeDefinition> repository) {
super(projectName, repository);
}
public RunletEvaluator(ResourceSet resourceSet, Repository<Association, AssociationEnd, SapClass, TypeDefinition, ClassTypeDefinition> repository) {
super(resourceSet, repository);
}
@Override
protected Repository<Association, AssociationEnd, SapClass, TypeDefinition, ClassTypeDefinition> createRepository() {
return new RunletInMemoryRepository(Activator.getDefault().getModelAdapter());
}
@Override
protected ObservableInjectingParser createParser(String statementString) {
ClassParserFactory factory = new ClassParserFactory();
ClassLexer lexer = factory.createLexer(new ANTLRStringStream(statementString));
return factory.createParser(new TokenRewriteStream(lexer), getConnection());
}
@Override
protected void initLocalFields(Connection connection, Repository<Association, AssociationEnd, SapClass, TypeDefinition, ClassTypeDefinition> repository) {
setStackFrame(new RunletStackFrame());
Block contextBlock = ActionsFactory.eINSTANCE.createBlock();
contextBlock.assign___PartitionIncludingChildren(connection.getOrCreateTransientPartition("RunletConsoleObjects"));
setContextBlock(contextBlock);
setInterpreter(new RunletInterpreter(connection, repository));
}
@Override
protected void addToBlock(Statement statement, Block contextBlock) {
contextBlock.getStatements().add(statement);
}
@Override
protected int getStatementSeperatorBit() {
return ClassParser.SEMICOLON;
}
@Override
protected Expression parseExpression(ObservableInjectingParser parser) throws RecognitionException {
return (Expression) ((ClassParser) parser).dataaccess_expressions_expression();
}
@Override
protected Statement parseStatement(ObservableInjectingParser parser) throws RecognitionException {
return (Statement) ((ClassParser)parser).behavioral_actions_statement();
}
}