/// <summary> /// Adds a push state transition. /// </summary> /// <param name="eventIdentifier">Token</param> /// <param name="eventIdentifierTokens">Tokens</param> /// <param name="stateIdentifiers">Token list</param> /// <returns>Boolean</returns> internal bool AddPushStateTransition(Token eventIdentifier, List<Token> eventIdentifierTokens, List<Token> stateIdentifiers) { if (this.Machine.IsMonitor) { return false; } if (this.GotoStateTransitions.ContainsKey(eventIdentifier) || this.PushStateTransitions.ContainsKey(eventIdentifier) || this.ActionBindings.ContainsKey(eventIdentifier)) { return false; } this.PushStateTransitions.Add(eventIdentifier, stateIdentifiers); this.ResolvedEventIdentifierTokens[eventIdentifier] = Tuple.Create( eventIdentifierTokens, this.ResolvedEventIdentifierTokens.Count); return true; }
/// <summary> /// Returns the resolved event handler name that corresponds to the /// specified event identifier. /// </summary> /// <param name="eventIdentifier">Token</param> /// <returns>Name</returns> internal string GetResolvedEventHandlerName(Token eventIdentifier) { var resolvedEvent = this.ResolvedEventIdentifierTokens[eventIdentifier]; var eventIdentifierTokens = resolvedEvent.Item1.TakeWhile( tok => tok.Type != TokenType.LeftAngleBracket); string qualifiedEventIdentifier = ""; foreach (var tok in eventIdentifierTokens.Where(tok => tok.Type != TokenType.Dot)) { qualifiedEventIdentifier += $"_{tok.TextUnit.Text}"; } string typeId = ""; if (eventIdentifierTokens.Count() != resolvedEvent.Item1.Count) { typeId += "_type_" + this.ResolvedEventIdentifierTokens[eventIdentifier].Item2; } return qualifiedEventIdentifier + typeId; }
/// <summary> /// Adds a goto state transition. /// </summary> /// <param name="eventIdentifier">Token</param> /// <param name="eventIdentifierTokens">Tokens</param> /// <param name="stateIdentifiers">Token list</param> /// <param name="stmtBlock">Statement block</param> /// <returns>Boolean</returns> internal bool AddGotoStateTransition(Token eventIdentifier, List<Token> eventIdentifierTokens, List<Token> stateIdentifiers, BlockSyntax stmtBlock = null) { if (this.GotoStateTransitions.ContainsKey(eventIdentifier) || this.PushStateTransitions.ContainsKey(eventIdentifier) || this.ActionBindings.ContainsKey(eventIdentifier)) { return false; } this.GotoStateTransitions.Add(eventIdentifier, stateIdentifiers); if (stmtBlock != null) { this.TransitionsOnExitActions.Add(eventIdentifier, stmtBlock); } this.ResolvedEventIdentifierTokens[eventIdentifier] = Tuple.Create( eventIdentifierTokens, this.ResolvedEventIdentifierTokens.Count); return true; }
/// <summary> /// Adds an ignored event. /// </summary> /// <param name="eventIdentifier">Token</param> /// <param name="eventIdentifierTokens">Tokens</param> /// <returns>Boolean</returns> internal bool AddIgnoredEvent(Token eventIdentifier, List<Token> eventIdentifierTokens) { if (this.DeferredEvents.Contains(eventIdentifier) || this.IgnoredEvents.Contains(eventIdentifier)) { return false; } this.IgnoredEvents.Add(eventIdentifier); this.ResolvedEventIdentifierTokens[eventIdentifier] = Tuple.Create( eventIdentifierTokens, this.ResolvedEventIdentifierTokens.Count); return true; }
/// <summary> /// Adds an action binding. /// </summary> /// <param name="eventIdentifier">Token</param> /// <param name="eventIdentifierTokens">Tokens</param> /// <param name="stmtBlock">BlockSyntax</param> /// <returns>Boolean</returns> internal bool AddActionBinding(Token eventIdentifier, List<Token> eventIdentifierTokens, BlockSyntax stmtBlock) { if (this.GotoStateTransitions.ContainsKey(eventIdentifier) || this.PushStateTransitions.ContainsKey(eventIdentifier) || this.ActionBindings.ContainsKey(eventIdentifier)) { return false; } this.ActionBindings.Add(eventIdentifier, null); this.ActionHandlers.Add(eventIdentifier, stmtBlock); this.ResolvedEventIdentifierTokens[eventIdentifier] = Tuple.Create( eventIdentifierTokens, this.ResolvedEventIdentifierTokens.Count); return true; }
/// <summary> /// Adds an action binding. /// </summary> /// <param name="eventIdentifier">Token</param> /// <param name="eventIdentifierTokens">Tokens</param> /// <param name="actionIdentifier">Token</param> /// <returns>Boolean</returns> internal bool AddActionBinding(Token eventIdentifier, List<Token> eventIdentifierTokens, Token actionIdentifier) { if (this.GotoStateTransitions.ContainsKey(eventIdentifier) || this.PushStateTransitions.ContainsKey(eventIdentifier) || this.ActionBindings.ContainsKey(eventIdentifier)) { return false; } this.ActionBindings.Add(eventIdentifier, actionIdentifier); this.ResolvedEventIdentifierTokens[eventIdentifier] = Tuple.Create( eventIdentifierTokens, this.ResolvedEventIdentifierTokens.Count); return true; }
/// <summary> /// Adds an ignored event. /// </summary> /// <param name="eventIdentifier">Token</param> /// <returns>Boolean value</returns> internal bool AddIgnoredEvent(Token eventIdentifier) { if (this.DeferredEvents.Contains(eventIdentifier) || this.IgnoredEvents.Contains(eventIdentifier)) { return false; } this.IgnoredEvents.Add(eventIdentifier); return true; }
/// <summary> /// Adds a push state transition. /// </summary> /// <param name="eventIdentifier">Token</param> /// <param name="stateIdentifier">Token</param> /// <returns>Boolean value</returns> internal bool AddPushStateTransition(Token eventIdentifier, Token stateIdentifier) { if (this.Machine.IsMonitor) { return false; } if (this.GotoStateTransitions.ContainsKey(eventIdentifier) || this.PushStateTransitions.ContainsKey(eventIdentifier) || this.ActionBindings.ContainsKey(eventIdentifier)) { return false; } this.PushStateTransitions.Add(eventIdentifier, stateIdentifier); return true; }
/// <summary> /// Adds a goto state transition. /// </summary> /// <param name="eventIdentifier">Token</param> /// <param name="stateIdentifier">Token</param> /// <param name="stmtBlock">Statement block</param> /// <returns>Boolean value</returns> internal bool AddGotoStateTransition(Token eventIdentifier, Token stateIdentifier, BlockSyntax stmtBlock = null) { if (this.GotoStateTransitions.ContainsKey(eventIdentifier) || this.PushStateTransitions.ContainsKey(eventIdentifier) || this.ActionBindings.ContainsKey(eventIdentifier)) { return false; } this.GotoStateTransitions.Add(eventIdentifier, stateIdentifier); if (stmtBlock != null) { this.TransitionsOnExitActions.Add(eventIdentifier, stmtBlock); } return true; }
/// <summary> /// Adds an action binding. /// </summary> /// <param name="eventIdentifier">Token</param> /// <param name="actionIdentifier">Token</param> /// <returns>Boolean value</returns> internal bool AddActionBinding(Token eventIdentifier, Token actionIdentifier) { if (this.GotoStateTransitions.ContainsKey(eventIdentifier) || this.PushStateTransitions.ContainsKey(eventIdentifier) || this.ActionBindings.ContainsKey(eventIdentifier)) { return false; } this.ActionBindings.Add(eventIdentifier, actionIdentifier); return true; }
/// <summary> /// Adds an action binding. /// </summary> /// <param name="eventIdentifier">Token</param> /// <param name="stateIdentifier">Token</param> /// <returns>Boolean value</returns> internal bool AddActionBinding(Token eventIdentifier, BlockSyntax stmtBlock) { if (this.GotoStateTransitions.ContainsKey(eventIdentifier) || this.PushStateTransitions.ContainsKey(eventIdentifier) || this.ActionBindings.ContainsKey(eventIdentifier)) { return false; } this.ActionBindings.Add(eventIdentifier, null); this.ActionHandlers.Add(eventIdentifier, stmtBlock); return true; }
/// <summary> /// Returns true if the given token is of the expected token type /// </summary> /// <returns></returns> private bool IsExpectedTokenType(Token token, List<TokenType> expectedTokenTypes) { if (token.Type == TokenType.WhiteSpace || token.Type == TokenType.NewLine || token.Type == TokenType.Comment || token.Type == TokenType.CommentLine || token.Type == TokenType.CommentStart || token.Type == TokenType.CommentEnd || expectedTokenTypes.Contains(token.Type)) { return true; } return false; }
/// <summary> /// Swaps the current token with the new token. Does nothing if the stream is /// empty. /// </summary> public void Swap(Token token) { if (this.Index == this.Tokens.Count) { return; } this.Tokens[this.Index] = token; }