public OptionLink(YarnSpinnerV1Parser.OptionLinkContext context) : this() { this.Context = context; this.Conditions = new List <(YarnSpinnerV1Parser.ExpressionContext expression, bool requiredTruthValue)>(); }
/// <summary> /// Exit a parse tree produced by the <c>OptionLink</c> /// labeled alternative in <see cref="YarnSpinnerV1Parser.option_statement"/>. /// <para>The default implementation does nothing.</para> /// </summary> /// <param name="context">The parse tree.</param> public virtual void ExitOptionLink([NotNull] YarnSpinnerV1Parser.OptionLinkContext context) { }
public override int VisitOptionLink([NotNull] YarnSpinnerV1Parser.OptionLinkContext context) { var link = new OptionLink(context); // Walk up the tree until we hit a NodeContext, looking for // if-clauses, else-if clauses, and end-if clauses. var parent = context.Parent; while (parent != null && parent is YarnSpinnerV1Parser.NodeContext == false) { if (parent is YarnSpinnerV1Parser.If_clauseContext ifClause) { // The option is inside an 'if' clause. The // expression must evaluate to true in order for // this option to run. link.Conditions.Add((ifClause.expression(), true)); } else if (parent is YarnSpinnerV1Parser.Else_if_clauseContext elseIfContext) { // The option is inside an 'else if' clause. The // expression must evaluate to true, and all of the // preceding if and else-if clauses in this if // statement must evaluate to false, in order for // this option to run. link.Conditions.Add((elseIfContext.expression(), true)); var parentIfClause = elseIfContext.Parent as YarnSpinnerV1Parser.If_statementContext; foreach (var siblingClause in parentIfClause.children) { // Stop if we've reached ourself if (siblingClause == elseIfContext) { break; } switch (siblingClause) { case YarnSpinnerV1Parser.If_clauseContext siblingIfClause: link.Conditions.Add((siblingIfClause.expression(), false)); break; case YarnSpinnerV1Parser.Else_if_clauseContext siblingElseIfClause: link.Conditions.Add((siblingElseIfClause.expression(), false)); break; } } } else if (parent is YarnSpinnerV1Parser.Else_clauseContext elseContext) { // The option is inside an 'else' clause. All of the // preceding if and else-if clauses in this if // statement must evaluate to false, in order for // this option to run. var parentIfClause = elseContext.Parent as YarnSpinnerV1Parser.If_statementContext; foreach (var siblingClause in parentIfClause.children) { // Stop if we've hit ourself (probably not an // issue since an else statement occurs at the // end anyway, but good to check imo) if (siblingClause == elseContext) { break; } switch (siblingClause) { case YarnSpinnerV1Parser.If_clauseContext siblingIfClause: link.Conditions.Add((siblingIfClause.expression(), false)); break; case YarnSpinnerV1Parser.Else_if_clauseContext siblingElseIfClause: link.Conditions.Add((siblingElseIfClause.expression(), false)); break; } } } // Step up the tree parent = parent.Parent; } this.currentNodeOptionLinks.Add(link); return(base.VisitOptionLink(context)); }
/// <summary> /// Visit a parse tree produced by the <c>OptionLink</c> /// labeled alternative in <see cref="YarnSpinnerV1Parser.option_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 VisitOptionLink([NotNull] YarnSpinnerV1Parser.OptionLinkContext context) { return(VisitChildren(context)); }