package org.nlamah.QL.Builders; import java.util.ArrayList; import java.util.List; import java.util.BitSet; import org.antlr.v4.runtime.ANTLRErrorListener; import org.antlr.v4.runtime.Parser; import org.antlr.v4.runtime.RecognitionException; import org.antlr.v4.runtime.Recognizer; import org.antlr.v4.runtime.atn.ATNConfigSet; import org.antlr.v4.runtime.dfa.DFA; import org.antlr.v4.runtime.tree.ParseTree; import org.nlamah.QBase.Error.AmbiguityError; import org.nlamah.QBase.Error.AttemptingFullContextError; import org.nlamah.QBase.Error.ContextSensitivityError; import org.nlamah.QBase.Error.QBaseError; import org.nlamah.QBase.Error.QBaseException; import org.nlamah.QBase.Error.QBaseWarning; import org.nlamah.QBase.Error.SyntaxError; import org.nlamah.QBase.Tools.AntlrTools; import org.nlamah.QBase.Tools.SourceCodeTools; import org.nlamah.QL.Model.Form.Form; import org.nlamah.QL.TypeChecker.QLTypeChecker; public class QLInterpreter implements ANTLRErrorListener { private Form form; private boolean skipTypeChecking; private List<QBaseWarning> warnings; private List<QBaseError> errors; public QLInterpreter() { warnings = new ArrayList<QBaseWarning>(); errors = new ArrayList<QBaseError>(); } public Form interprete(String sourceCodePath) throws QBaseException { try { String sourceCode = SourceCodeTools.sourceCode(sourceCodePath); ParseTree tree = AntlrTools.createFormTreeFromSourceCode(sourceCode, this); RawFormBuilder rawFormBuilder = new RawFormBuilder(); form = rawFormBuilder.buildForm(tree); errors.addAll(rawFormBuilder.errors()); if (errors.size() > 0) { throw new QBaseException(errors); } if(!skipTypeChecking) { QLTypeChecker typeChecker = new QLTypeChecker(); typeChecker.check(form); warnings.addAll(typeChecker.warnings()); } return form; } catch (QBaseException exception) { throw new QBaseException(exception.warnings(), exception.errors()); } } public void skipTypeChecking() { skipTypeChecking = true; } public List<QBaseWarning> warnings() { return warnings; } @Override public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) { errors.add(new SyntaxError(line, charPositionInLine, msg)); } @Override public void reportAmbiguity(Parser recognizer, DFA dfa, int startIndex, int stopIndex, boolean exact, BitSet ambigAlts, ATNConfigSet configs) { errors.add(new AmbiguityError(startIndex, stopIndex)); } @Override public void reportAttemptingFullContext(Parser recognizer, DFA dfa, int startIndex, int stopIndex, BitSet conflictingAlts, ATNConfigSet configs) { errors.add(new AttemptingFullContextError(startIndex, stopIndex)); } @Override public void reportContextSensitivity(Parser recognizer, DFA dfa, int startIndex, int stopIndex, int prediction, ATNConfigSet configs) { errors.add(new ContextSensitivityError(startIndex, stopIndex)); } }