package uva.qls.ast.visitor; import java.util.ArrayList; import java.util.List; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.tree.TerminalNode; import uva.qls.ast.type.TypeBoolean; import uva.qls.ast.type.TypeInteger; import uva.qls.ast.type.TypeMoney; import uva.qls.ast.type.TypeString; import uva.qls.ast.*; import uva.qls.ast.component.*; import uva.qls.ast.style.*; import uva.qls.ast.style.availableStyles.AvailableStyles; import uva.qls.ast.style.visitor.StyleTable; import uva.qls.ast.literal.BooleanLiteral; import uva.qls.ast.literal.Identifier; import uva.qls.ast.literal.IntLiteral; import uva.qls.ast.literal.MoneyLiteral; import uva.qls.ast.literal.StringLiteral; import uva.qls.ast.statements.DefaultValue; import uva.qls.ast.statements.Question; import uva.qls.ast.statements.Section; import uva.qls.ast.statements.Statement; import uva.qls.ast.statements.Subsection; import uva.qls.ast.type.Type; import uva.qls.parser.*; import uva.qls.parser.QLSParser.CtxBooleanLiteralContext; import uva.qls.parser.QLSParser.CtxCheckboxContext; import uva.qls.parser.QLSParser.CtxColorContext; import uva.qls.parser.QLSParser.CtxComponentContext; import uva.qls.parser.QLSParser.CtxDropdownContext; import uva.qls.parser.QLSParser.CtxFontContext; import uva.qls.parser.QLSParser.CtxFontsizeContext; import uva.qls.parser.QLSParser.CtxHeightContext; import uva.qls.parser.QLSParser.CtxIntegerContext; import uva.qls.parser.QLSParser.CtxMoneyContext; import uva.qls.parser.QLSParser.CtxQuestionContext; import uva.qls.parser.QLSParser.CtxRadioContext; import uva.qls.parser.QLSParser.CtxSectionContext; import uva.qls.parser.QLSParser.CtxSliderContext; import uva.qls.parser.QLSParser.CtxSpinboxContext; import uva.qls.parser.QLSParser.CtxStyleContext; import uva.qls.parser.QLSParser.CtxSubsectionContext; import uva.qls.parser.QLSParser.CtxTextboxContext; import uva.qls.parser.QLSParser.CtxWidthContext; import uva.qls.parser.QLSParser.PageContext; import uva.qls.parser.QLSParser.ProgContext; import uva.qls.parser.QLSParser.QuestionContext; import uva.qls.parser.QLSParser.SectionContext; import uva.qls.parser.QLSParser.StatementContext; import uva.qls.parser.QLSParser.StyleContext; import uva.qls.parser.QLSParser.StylesheetContext; import uva.qls.parser.QLSParser.SubsectionContext; public class QLSMainVisitor extends QLSBaseVisitor<ASTNode>{ @Override public ASTNode visitProg(ProgContext ctx) { return new Prog(this.visitStylesheet(ctx.stylesheet()), this.getCodeLines(ctx)); } @Override public StyleSheet visitStylesheet(StylesheetContext ctx) { CodeLines codeLines = this.getCodeLines(ctx); return new StyleSheet(this.visitIdentifier(ctx.Identifier(), codeLines), this.visitPages(ctx.pgs), codeLines); } @Override public Page visitPage(PageContext ctx) { CodeLines codeLines = this.getCodeLines(ctx); return new Page(this.visitIdentifier(ctx.Identifier(), codeLines), this.visitStatement(ctx.stms), codeLines); } @Override public Section visitCtxSection(CtxSectionContext ctx) { return this.visitSection(ctx.section()); } @Override public Subsection visitCtxSubsection(CtxSubsectionContext ctx) { return this.visitSubsection(ctx.subsection()); } @Override public Question visitCtxQuestion(CtxQuestionContext ctx) { return this.visitQuestion(ctx.question()); } @Override public DefaultValue visitCtxDefaultComponent(QLSParser.CtxDefaultComponentContext ctx) { CodeLines codeLines = this.getCodeLines(ctx); Type type = (Type)ctx.primitiveType().accept(this); Component component = (Component)ctx.component().accept(this); return new DefaultValue(type, component ,codeLines); } @Override public DefaultValue visitCtxDefaultStatement(QLSParser.CtxDefaultStatementContext ctx) { CodeLines codeLines = this.getCodeLines(ctx); Type type = (Type)ctx.primitiveType().accept(this); return new DefaultValue(type, this.visitStyles(ctx.stms), codeLines); } @Override public Component visitCtxComponent(CtxComponentContext ctx) { return (Component)ctx.component().accept(this); } @Override public Style visitCtxStyle(CtxStyleContext ctx) { return (Style)ctx.style().accept(this); } @Override public Section visitSection(SectionContext ctx) { CodeLines codeLines = this.getCodeLines(ctx); return new Section(this.visitString(ctx.STRING().getText(),codeLines), this.visitStatement(ctx.stms),codeLines); } @Override public Subsection visitSubsection(SubsectionContext ctx) { CodeLines codeLines = this.getCodeLines(ctx); return new Subsection(this.visitString(ctx.STRING().getText(),codeLines),this.visitQuestion(ctx.quest),codeLines); } @Override public Question visitQuestion(QuestionContext ctx) { CodeLines codeLines = this.getCodeLines(ctx); Component comp = null; try{ comp = (Component)ctx.component().accept(this); } catch (Exception e){ System.out.println("Component is null"); } return new Question(this.visitIdentifier(ctx.Identifier(), codeLines), comp ,codeLines); } @Override public Textbox visitCtxTextbox(CtxTextboxContext ctx) { return new Textbox(this.getCodeLines(ctx), this.visitStyles(ctx.stls)); } @Override public Spinbox visitCtxSpinbox(CtxSpinboxContext ctx) { return new Spinbox(this.getCodeLines(ctx), this.visitStyles(ctx.stls)); } @Override public Slider visitCtxSlider(CtxSliderContext ctx) { return new Slider(ctx.v1.getText(), ctx.v2.getText(), this.visitStyles(ctx.stls), this.getCodeLines(ctx)); } @Override public Dropdown visitCtxDropdown(CtxDropdownContext ctx) { return new Dropdown(ctx.v1.getText(), ctx.v2.getText(), this.visitStyles(ctx.stls), this.getCodeLines(ctx)); } @Override public Radio visitCtxRadio(CtxRadioContext ctx) { return new Radio(ctx.v1.getText(), ctx.v2.getText(), this.visitStyles(ctx.stls), this.getCodeLines(ctx)); } @Override public Checkbox visitCtxCheckbox(CtxCheckboxContext ctx) { CodeLines codeLines = this.getCodeLines(ctx); return new Checkbox(this.visitString(ctx.STRING().getText(), codeLines), this.visitStyles(ctx.stls), codeLines); } @Override public Width visitCtxWidth(CtxWidthContext ctx) { CodeLines codeLines = this.getCodeLines(ctx); return new Width(this.visitCtxInteger(ctx.Integer().getText(), codeLines), this.getCodeLines(ctx)); } @Override public Height visitCtxHeight(CtxHeightContext ctx) { CodeLines codeLines = this.getCodeLines(ctx); return new Height(this.visitCtxInteger(ctx.Integer().getText(), codeLines), this.getCodeLines(ctx)); } @Override public FontName visitCtxFont(CtxFontContext ctx) { CodeLines codeLines = this.getCodeLines(ctx); return new FontName(this.visitString(ctx.STRING().getText(), codeLines), codeLines); } @Override public FontSize visitCtxFontsize(CtxFontsizeContext ctx) { CodeLines codeLines = this.getCodeLines(ctx); return new FontSize(this.visitCtxInteger(ctx.Integer().getText(), codeLines), codeLines); } @Override public Color visitCtxColor(CtxColorContext ctx) { return new Color(ctx.v.getText(), this.getCodeLines(ctx)); } @Override public BooleanLiteral visitCtxBooleanLiteral(CtxBooleanLiteralContext ctx) { return new BooleanLiteral(Boolean.valueOf(ctx.getText()), this.getCodeLines(ctx)); } private IntLiteral visitCtxInteger(String ctx, CodeLines codeLines){ return new IntLiteral(Integer.valueOf(ctx), codeLines); } @Override public IntLiteral visitCtxInteger(CtxIntegerContext ctx) { return new IntLiteral(Integer.valueOf(ctx.Integer().getText()), this.getCodeLines(ctx)); } @Override public MoneyLiteral visitCtxMoney(CtxMoneyContext ctx) { return new MoneyLiteral(Integer.valueOf(ctx.getText()), this.getCodeLines(ctx)); } @Override public TypeBoolean visitCtxPrimitiveBoolean(QLSParser.CtxPrimitiveBooleanContext ctx) { return new TypeBoolean(this.getCodeLines(ctx)); } @Override public TypeMoney visitCtxPrimitiveMoney(QLSParser.CtxPrimitiveMoneyContext ctx) { return new TypeMoney(this.getCodeLines(ctx)); } @Override public TypeString visitCtxPrimitiveString(QLSParser.CtxPrimitiveStringContext ctx) { return new TypeString(this.getCodeLines(ctx)); } @Override public TypeInteger visitCtxPrimitiveInteger(QLSParser.CtxPrimitiveIntegerContext ctx) { return new TypeInteger(this.getCodeLines(ctx)); } private List<Page> visitPages(List<PageContext> pgs){ List<Page> pages = new ArrayList<Page>(); for (PageContext page : pgs) pages.add(this.visitPage(page)); return pages; } private List<Statement> visitStatement(List<StatementContext> stms){ List<Statement> statements = new ArrayList<Statement>(); for (StatementContext statement : stms) statements.add((Statement)statement.accept(this)); return statements; } private StyleTable visitStyles(List<StyleContext> stls){ StyleTable table = AvailableStyles.getAvailableStyles(); for (StyleContext s : stls){ Style style = (Style)s.accept(this); table.putValue(style.getClass().getSimpleName(), style); } return table; } private StringLiteral visitString(String _value, CodeLines _codeLines){ return new StringLiteral(_value, _codeLines); } private Identifier visitIdentifier(TerminalNode identifier, CodeLines codeLines){ return new Identifier(identifier.getText(), codeLines); } private CodeLines getCodeLines(ParserRuleContext ctx){ return new CodeLines(ctx.start.getLine(), ctx.stop.getLine()); } }