/// <summary>
 /// state :
 ///     STATE StateNameDefinition comment?
 ///     (ON (ENTER STATE | EXIT STATE | ENTER AND EXIT STATE) execute)*
 ///     on_event_statement*
 ///     ;
 /// </summary>
 /// <param name="context"></param>
 /// <returns></returns>
 public override object VisitState([NotNull] WorkflowParser.StateContext context)
 {
     return(base.VisitState(context));
 }
 /// <summary>
 /// Visit a parse tree produced by <see cref="WorkflowParser.state"/>.
 /// <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 VisitState([NotNull] WorkflowParser.StateContext context)
 {
     return(VisitChildren(context));
 }
Пример #3
0
        /// <summary>
        /// state :
        ///     STATE key comment?
        ///     (ON (ENTER STATE | EXIT STATE | ENTER AND EXIT STATE) execute)*
        ///     on_event_statement*
        ///     ;
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public override object VisitState([NotNull] WorkflowParser.StateContext context)
        {
            string comment = string.Empty;
            var    c       = context.comment();

            if (c != null)
            {
                comment = (string)Visit(c);
            }

            StateConfig state = new StateConfig()
            {
                Name  = (string)VisitKey(context.key()),
                Label = comment,
            };

            var executes = context.execute();

            if (executes != null)
            {
                foreach (var execute in executes)
                {
                    var e = ((bool, bool, ResultRuleConfig))VisitExecute(execute);

                    if (e.Item1)
                    {
                        state.IncomingRules.Add(e.Item3);
                    }

                    if (e.Item2)
                    {
                        state.OutcomingRules.Add(e.Item3);
                    }
                }
            }


            var on_event_statements = context.on_event_statement();

            if (on_event_statements != null)
            {
                foreach (var on_event_statement in on_event_statements)
                {
                    var e = ((IncomingEventConfig, List <(string, ResultRuleConfig)>))VisitOn_event_statement(on_event_statement);
                    if (state.Events.TryGetValue(e.Item1.Name, out IncomingEventConfig ic))
                    {
                        throw new Exceptions.DuplicatedArgumentNameMethodReferenceException($"event name {e.Item1.Name} in {state.Name}");
                    }
                    state.Events.Add(e.Item1.Name, e.Item1);

                    foreach (var item in e.Item2)
                    {
                        switch (item.Item1)
                        {
                        case "in":
                            state.IncomingRules.Add(item.Item2);
                            break;

                        case "out":
                            state.OutcomingRules.Add(item.Item2);
                            break;

                        default:
                            break;
                        }
                    }
                }
            }

            return(state);
        }