public override IEnumerable <Statement> Parse(Scanner scanner)
        {
            Token source = scanner.ReadTo(GetSignalKeyword(scanner)).Trim();

            Token signalKeyword = scanner.ReadSignal();

            yield return
                (!source.IsEmpty()
                    ? new EnsureParticipantStatement(source)
                    : (Statement) new MissingArgumentStatement(signalKeyword, source));

            Token target = scanner.ReadTo(ColonKeyowrd).Trim();

            yield return
                (!target.IsEmpty()
                    ? new EnsureParticipantStatement(target)
                    : (Statement) new MissingArgumentStatement(signalKeyword, target));

            if (source.IsEmpty() || target.IsEmpty())
            {
                yield break;
            }

            scanner.SkipWhile(ch => !char.IsLetterOrDigit(ch));
            Token signalName = scanner.ReadToEnd().Trim();

            switch (signalKeyword.Value)
            {
            case CallKeyword:
                yield return(new CallSignalStatement(signalKeyword, source, target, signalName));

                break;

            case BackCallKeyword:
                yield return(new CallSignalStatement(signalKeyword, target, source, signalName));

                break;

            case ReturnKeyword:
                yield return(new ReturnSignalStatement(signalKeyword, source, target, signalName));

                break;

            case BackReturnKeyword:
                yield return(new ReturnSignalStatement(signalKeyword, target, source, signalName));

                break;

            case CreateKeyword1:
            case CreateKeyword2:
                yield return(new CreateSignalStatement(signalKeyword, source, target, signalName));

                break;

            default:
                yield return(new UnknownStatement(signalKeyword));

                break;
            }
        }
        //participant A
        //participant Long Name as A
        public override IEnumerable <Statement> Parse(Scanner scanner)
        {
            Token keywordToken = scanner.ReadWord();

            scanner.SkipWhiteSpaces();
            Token nameToken = scanner.ReadTo(AsKeyword);

            if (nameToken.IsEmpty())
            {
                yield return(new MissingArgumentStatement(keywordToken, nameToken));

                yield break;
            }
            if (scanner.Eol)
            {
                yield return(new SimpleParticipantStatement(keywordToken, nameToken));

                yield break;
            }

            scanner.ReadWord();
            scanner.SkipWhiteSpaces();
            Token idToken = scanner.ReadToEnd();

            if (idToken.Length == 0)
            {
                yield return(new MissingArgumentStatement(keywordToken, idToken));

                yield break;
            }

            yield return(new ParticipantStatement(keywordToken, idToken, nameToken));
        }