public override MurMurVariable VisitMenuBlock([NotNull] MurMurParser.MenuBlockContext context) { if (lastChoice == -1) // never visited this menu { script.CurrentLine = new MurMurLine() { Type = MurMurLineType.menu, Text = "" }; var expression = context.menuCommand().expression(); if (expression != null) { script.CurrentLine.Text = Visit(expression).Text; } List <string> options = new List <string>(); availableOptions = new List <MurMurParser.MenuSubBlockContext>(); foreach (var item in context.menuSubBlock()) { var expressions = item.menuOptionCommand().expression(); bool shouldIncludeOption; if (expressions.Length > 1) // Option has a condition { var condition = expressions[1]; shouldIncludeOption = (condition == null || Visit(condition).Boolean); } else // This option is always true { shouldIncludeOption = true; } options.Add(Visit(item.menuOptionCommand().expression()[0]).Text); availableOptions.Add(item); } script.CurrentLine.OptionsText = options.ToArray(); currentStack.Push(context); return(new MurMurVariable() { Halt = context }); } else // We've been here before, let's run a submenu block { var block = availableOptions[lastChoice]; availableOptions = null; lastChoice = -1; if (block.block() != null) { return(Visit(block.block())); } else // Empty menu subblock, let's skip ahead { script.CurrentLine = new MurMurLine() { Type = MurMurLineType.empty, }; return(new MurMurVariable()); } } }
/// <summary> /// Visit a parse tree produced by <see cref="MurMurParser.menuBlock"/>. /// <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 VisitMenuBlock([NotNull] MurMurParser.MenuBlockContext context) { return(VisitChildren(context)); }
/// <summary> /// Exit a parse tree produced by <see cref="MurMurParser.menuBlock"/>. /// <para>The default implementation does nothing.</para> /// </summary> /// <param name="context">The parse tree.</param> public virtual void ExitMenuBlock([NotNull] MurMurParser.MenuBlockContext context) { }