package org.nlamah.QLS.Builders; import java.util.ArrayList; import java.util.BitSet; import java.util.List; 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.SyntaxError; import org.nlamah.QBase.Tools.AntlrTools; import org.nlamah.QBase.Tools.SourceCodeTools; import org.nlamah.QL.Model.Form.Form; import org.nlamah.QLS.Model.StylesheetBlock.Stylesheet; import org.nlamah.QLS.TypeChecker.QLSTypeChecker; public class QLSInterpreter implements ANTLRErrorListener { private List<QBaseError> errors; public QLSInterpreter() { errors = new ArrayList<QBaseError>(); } public Stylesheet interprete(String qlsFileName, Form form) throws QBaseException { String qlsSourceCode; qlsSourceCode = SourceCodeTools.sourceCode(qlsFileName); ParseTree tree = AntlrTools.createStylesheetTreeFromSourceCode(qlsSourceCode, this); if (errors.size() > 0) { throw new QBaseException(errors); } RawStylesheetBuilder rawStylesheetBuilder = new RawStylesheetBuilder(); Stylesheet stylesheet = rawStylesheetBuilder.build(tree); errors.addAll(rawStylesheetBuilder.errors()); if (errors.size() > 0) { throw new QBaseException(errors); } QLSTypeChecker qlsTypeChecker = new QLSTypeChecker(); try { qlsTypeChecker.check(form, stylesheet); } catch (QBaseException e) { throw new QBaseException(qlsTypeChecker.errors()); } new QuestionStyleCombiner(form, stylesheet).build(); return stylesheet; } @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)); } }