public override Result VisitMnemonic_inst([NotNull] testParser.Mnemonic_instContext context) { // 命令語 var instRet = Visit(context.inst()); if (!instRet.Success) { return(instRet); } //オペランド var operands = new List <IOperand>(); foreach (var item in context.operand()) { var ret = Visit(item); if (!ret.Success) { return(ret); } operands.Add(ret.Tag as IOperand); } var inst = instRet.Tag as Instruction; //まずは入力検証 { //命令後に対する引数の数 if (inst.Attribute.AcceptArgNum != operands.Count) { return(Result.CreateError("引数の数が不正")); } //デバイスの種別(これは仕様がよくわからない) //オペランドの種類 } //命令後実行 { if (inst.Attribute.Dir == Direction.In) { _plc.PushInputState(inst.Attribute.Func(_plc, operands)); } if (inst.Attribute.Dir == Direction.Out) { if (_plc.CanOutput()) { inst.Attribute.Func(_plc, operands); } _plc.ClearInputState(); } } return(Result.CreateSuccess(null)); }
/// <summary> /// Exit a parse tree produced by the <c>mnemonic_inst</c> /// labeled alternative in <see cref="testParser.mnemonic"/>. /// <para>The default implementation does nothing.</para> /// </summary> /// <param name="context">The parse tree.</param> public virtual void ExitMnemonic_inst([NotNull] testParser.Mnemonic_instContext context) { }
/// <summary> /// Visit a parse tree produced by the <c>mnemonic_inst</c> /// labeled alternative in <see cref="testParser.mnemonic"/>. /// <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 VisitMnemonic_inst([NotNull] testParser.Mnemonic_instContext context) { return(VisitChildren(context)); }