Пример #1
0
        /// <summary>
        /// Adds a new event to the state machine.
        /// </summary>
        /// <param name="eventname"></param>
        /// <returns></returns>
        public Event AddEvent(string eventname)
        {
            Event e;
            if (!_events.TryGetValue(eventname, out e))
            {
                _events[eventname] = e = new Event(eventname);
            }

            return e;
        }
Пример #2
0
        /// <summary>
        /// Emits code for a single event handler.
        /// </summary>
        /// <param name="e"></param>
        private void EmitEventHandler(Event e)
        {
            BeginHandler(e);

            PrepareTransitionSet(e);

            // use gate converter to schedule condition evaluation
            ConvertConditions(e);

            // stage 0: preconditions and LEAVE handlers
            _guards.AddLeaveEffects(_effectsbefore);
            _guards.AddEnterEffects(_effectsafter);
            AddTriggerEffects(e.Triggers);

            foreach(var t in e.Triggers)
            {
                var c = _gc.ConvertToGate(0, t.PreCondition);
                _gc.Schedule(c);
            }

            _effectsbefore.Schedule(_gc);
            _effectsafter.Schedule(_gc);

            // code output: precondition labels
            EmitCodeLabels(0);

            // pre-effects
            if (!_effectsbefore.IsEmpty)
            {
                Writer.AppendComment();
                Writer.AppendComment("state exit handler effects");

                EmitEffects(_effectsbefore.GetEffectConditions());
            }

            // emit state transition code
            EmitTriggerStateChange(_writer, e.Triggers);

            // stage 1: postconditions and other handlers.
            _gc.SetNextStage();

            // code output: postcondition labels
            EmitCodeLabels(1);

            // post-effects
            if (!_effectsafter.IsEmpty)
            {
                Writer.AppendComment();
                Writer.AppendComment("state entry handler effects");

                EmitEffects(_effectsafter.GetEffectConditions());
            }

            EndHandler();
        }
Пример #3
0
        private void PrepareTransitionSet(Event e)
        {
            // next state inference ...
            _tset = new TransitionSet();
            _tset.AddRange(e.Triggers
                .SelectMany(t => t.Transitions)
                );

            // set of modified variable indexes
            _modified = e.Triggers
                .SelectMany(t => t.ModifiedVariables)
                .Distinct()
                .Select(z => z.Index).ToList();
        }
Пример #4
0
        private void BeginHandler(Event e)
        {
            // code generation start here
            EmitHandlerHeader(e.Name);
            EmitEnterBlock();

            _gc = new GateConverter();

            // process labels before they are added ...
            _gc.OnBeforeAddLabel = EvaluateCodeLabelBefore;

            _guards = new GuardCollection();
            _effectsbefore = new EffectsCollection();
            _effectsafter = new EffectsCollection();
        }
Пример #5
0
        private void ConvertConditions(Event e)
        {
            var c = new TriggerTermCollection<bool>(true);

            foreach (var t in e.Triggers)
            {
                c.Add(t);
            }

            foreach (var t in e.Triggers)
            {
                foreach (var g in t.Guards)
                {
                    _guards.AddGuard(t, g);
                }
            }
        }
Пример #6
0
 protected abstract void EmitSwitchCaseLabel(Event e);
Пример #7
0
 protected abstract void EmitHandlerInvocation(Event e);
Пример #8
0
 protected override void EmitSwitchCaseLabel(Event e)
 {
     var caselabel = Parameters.EventTypeName + "." + e.Name;
     Writer.AppendLine("case " + caselabel + ":");
 }
Пример #9
0
 protected override void EmitHandlerInvocation(Event e)
 {
     Writer.AppendLine(e.Name + "_Handler();");
     Writer.AppendLine("break;");
     Writer.AppendLine();
 }
Пример #10
0
 public Trigger(Event e, ICondition c)
     : base(e.Name, c)
 {
     Event = e;
 }