/* Előre kimentjük az if-else if-else blokk ágainak sorszámát. * Ez később az unused code hibaüzenetekhez fontos (vizsgáljuk az * olyan ágakat, amelyekre a kód nem fut rá sohasem) * * If blokkon megyünk végig * Ha a feltétel igaz, akkor az if blokk-ba megyünk bele. * Ha nem akkor végignézzük az else if-eken. * Ha azok közül sem igaz egyik sem, akkor az else blokk kerül végrehajtásra. * Ezek közben mentjük a ténylegesen használt ágak sorszámát. * * Egy új scope-ot hozunk létre, ha nem teljesül egyik if feltétel sem, akkor ez a felesleges scope egyből poppol. */ public override object VisitIf_statement([NotNull] DDD_layout_scriptParser.If_statementContext context) { //////////// PRESCAN ////////////// everyIfElseLineNums.Push(context.Start.Line); // if ág sorszáma foreach (var elseif in context.else_if_statement()) { everyIfElseLineNums.Push(elseif.Start.Line); // else if ágak sorszáma } var elseContext = context.else_statement(); if (elseContext != null) { everyIfElseLineNums.Push(elseContext.Start.Line); // else ágak sorszáma } /////////////////////////////////// currentScope = new Scope(); symbolTable.Push(currentScope); var condition = context.if_condition(); if ((bool)VisitIf_condition(condition) != true) { foreach (var elseif in context.else_if_statement()) { if ((bool)VisitElse_if_statement(elseif) == true) { usedIfElseLineNums.Push(elseif.Start.Line); return(null); } } if (elseContext != null) { usedIfElseLineNums.Push(elseContext.Start.Line); VisitElse_statement(context.else_statement()); } } else { usedIfElseLineNums.Push(context.Start.Line); foreach (var content in context.if_content()) { VisitIf_content(content); } } #if RELEASE symbolTable.Pop(); currentScope = symbolTable.Peek(); #endif return(null); }
/// <summary> /// Exit a parse tree produced by <see cref="DDD_layout_scriptParser.if_statement"/>. /// <para>The default implementation does nothing.</para> /// </summary> /// <param name="context">The parse tree.</param> public virtual void ExitIf_statement([NotNull] DDD_layout_scriptParser.If_statementContext context) { }
/// <summary> /// Visit a parse tree produced by <see cref="DDD_layout_scriptParser.if_statement"/>. /// <para> /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/> /// on <paramref name="context"/>. /// </para> /// </summary> /// <param name="context">The parse tree.</param> /// <return>The visitor result.</return> public virtual Result VisitIf_statement([NotNull] DDD_layout_scriptParser.If_statementContext context) { return(VisitChildren(context)); }