Esempio n. 1
0
        public override bool Parse(ParseContext context, IAstNode parent)
        {
            TokenStream <RToken> tokens = context.Tokens;

            Debug.Assert(tokens.CurrentToken.TokenType == RTokenType.OpenSquareBracket ||
                         tokens.CurrentToken.TokenType == RTokenType.OpenDoubleSquareBracket);

            this.LeftBrackets = RParser.ParseToken(context, this);

            RTokenType terminatingTokenType = RParser.GetTerminatingTokenType(this.LeftBrackets.Token.TokenType);

            this.Arguments = new ArgumentList(terminatingTokenType);
            this.Arguments.Parse(context, this);

            if (tokens.CurrentToken.TokenType == terminatingTokenType)
            {
                this.RightBrackets = RParser.ParseToken(context, this);
                return(base.Parse(context, parent));
            }
            else
            {
                context.AddError(new MissingItemParseError(ParseErrorType.CloseSquareBracketExpected, tokens.PreviousToken));
            }


            return(true);
        }
Esempio n. 2
0
        private RTokenType GetMatchingBraceToken(RTokenType tokenType)
        {
            switch (tokenType)
            {
            case RTokenType.OpenBrace:
                return(RTokenType.CloseBrace);

            case RTokenType.CloseBrace:
                return(RTokenType.OpenBrace);

            case RTokenType.OpenSquareBracket:
                return(RTokenType.CloseSquareBracket);

            case RTokenType.CloseSquareBracket:
                return(RTokenType.OpenSquareBracket);

            case RTokenType.OpenDoubleSquareBracket:
                return(RTokenType.CloseDoubleSquareBracket);

            case RTokenType.CloseDoubleSquareBracket:
                return(RTokenType.OpenDoubleSquareBracket);
            }

            Debug.Assert(false, "Unknown brace token");
            return(RTokenType.Unknown);
        }
Esempio n. 3
0
        private void AddToken(RTokenType type, RTokenSubType subType, int start, int length)
        {
            var token = new RToken(type, start, length);

            token.SubType = subType;
            _tokens.Add(token);
        }
Esempio n. 4
0
        private void AddWord(RTokenType type)
        {
            SkipWhitespace();
            var start = _cs.Position;

            SkipWord();
            if (_cs.Position > start)
            {
                AddToken(type, start, _cs.Position - start);
            }
        }
Esempio n. 5
0
        private static bool IsOpenBraceToken(RTokenType tokenType)
        {
            switch (tokenType)
            {
            case RTokenType.OpenBrace:
            case RTokenType.OpenCurlyBrace:
            case RTokenType.OpenSquareBracket:
            case RTokenType.OpenDoubleSquareBracket:
                return(true);
            }

            return(false);
        }
Esempio n. 6
0
        public static bool IsListTerminator(ParseContext context, RTokenType openingTokenType, RToken token)
        {
            RTokenType tokenType = token.TokenType;

            if (tokenType == RTokenType.CloseCurlyBrace ||
                tokenType == RTokenType.Semicolon)
            {
                return(true);
            }

            switch (openingTokenType)
            {
            case RTokenType.OpenBrace:
                if (tokenType == RTokenType.CloseSquareBracket || tokenType == RTokenType.CloseDoubleSquareBracket)
                {
                    return(true);
                }
                break;

            case RTokenType.OpenSquareBracket:
                if (tokenType == RTokenType.CloseBrace || tokenType == RTokenType.CloseDoubleSquareBracket)
                {
                    return(true);
                }
                break;

            case RTokenType.OpenDoubleSquareBracket:
                if (tokenType == RTokenType.CloseBrace || tokenType == RTokenType.CloseSquareBracket)
                {
                    return(true);
                }
                break;
            }

            if (tokenType == RTokenType.Operator && token.IsKeywordText(context.TextProvider, "<-"))
            {
                return(true);
            }

            if (tokenType == RTokenType.Keyword &&
                !token.IsKeywordText(context.TextProvider, "if") &&
                !token.IsKeywordText(context.TextProvider, "function"))
            {
                return(true);
            }

            return(false);
        }
Esempio n. 7
0
        public static RTokenType GetOpeningTokenType(RTokenType closingTokenType)
        {
            switch (closingTokenType)
            {
            case RTokenType.CloseBrace:
                return(RTokenType.OpenBrace);

            case RTokenType.CloseSquareBracket:
                return(RTokenType.OpenSquareBracket);

            case RTokenType.CloseDoubleSquareBracket:
                return(RTokenType.OpenDoubleSquareBracket);

            case RTokenType.CloseCurlyBrace:
                return(RTokenType.OpenCurlyBrace);
            }

            return(RTokenType.Unknown);
        }
Esempio n. 8
0
        public static RTokenType GetTerminatingTokenType(RTokenType openingTokenType) {
            switch (openingTokenType) {
                case RTokenType.OpenSquareBracket:
                    return RTokenType.CloseSquareBracket;

                case RTokenType.OpenDoubleSquareBracket:
                    return RTokenType.CloseDoubleSquareBracket;

                case RTokenType.OpenCurlyBrace:
                    return RTokenType.CloseCurlyBrace;

                case RTokenType.OpenBrace:
                    return RTokenType.CloseBrace;

                default:
                    Debug.Assert(false, "Unable to determine closing token type");
                    break;
            }

            return RTokenType.Unknown;
        }
Esempio n. 9
0
        public static RTokenType GetTerminatingTokenType(RTokenType openingTokenType)
        {
            switch (openingTokenType)
            {
            case RTokenType.OpenSquareBracket:
                return(RTokenType.CloseSquareBracket);

            case RTokenType.OpenDoubleSquareBracket:
                return(RTokenType.CloseDoubleSquareBracket);

            case RTokenType.OpenCurlyBrace:
                return(RTokenType.CloseCurlyBrace);

            case RTokenType.OpenBrace:
                return(RTokenType.CloseBrace);

            default:
                Debug.Assert(false, "Unable to determine closing token type");
                break;
            }

            return(RTokenType.Unknown);
        }
Esempio n. 10
0
        public static RTokenType GetOpeningTokenType(RTokenType closingTokenType) {
            switch (closingTokenType) {
                case RTokenType.CloseBrace:
                    return RTokenType.OpenBrace;

                case RTokenType.CloseSquareBracket:
                    return RTokenType.OpenSquareBracket;

                case RTokenType.CloseDoubleSquareBracket:
                    return RTokenType.OpenDoubleSquareBracket;

                case RTokenType.CloseCurlyBrace:
                    return RTokenType.OpenCurlyBrace;
            }

            return RTokenType.Unknown;
        }
Esempio n. 11
0
        private void AddToken(RTokenType type, int start, int length)
        {
            var token = new RToken(type, start, length);

            _tokens.Add(token);
        }
Esempio n. 12
0
 public CommaSeparatedList(RTokenType terminatingTokenType)
 {
     _terminatingTokenType = terminatingTokenType;
 }
Esempio n. 13
0
 public ArgumentList(RTokenType terminatingTokenType) :
     base(terminatingTokenType) {
 }
Esempio n. 14
0
 private void AddToken(RTokenType type, int start, int length)
 => _tokens.Add(new RToken(type, start, length));
Esempio n. 15
0
        public static bool IsListTerminator(ParseContext context, RTokenType openingTokenType, RToken token) {
            RTokenType tokenType = token.TokenType;

            if (tokenType == RTokenType.CloseCurlyBrace ||
                tokenType == RTokenType.Semicolon) {
                return true;
            }

            switch (openingTokenType) {
                case RTokenType.OpenBrace:
                    if (tokenType == RTokenType.CloseSquareBracket || tokenType == RTokenType.CloseDoubleSquareBracket) {
                        return true;
                    }
                    break;

                case RTokenType.OpenSquareBracket:
                    if (tokenType == RTokenType.CloseBrace || tokenType == RTokenType.CloseDoubleSquareBracket) {
                        return true;
                    }
                    break;

                case RTokenType.OpenDoubleSquareBracket:
                    if (tokenType == RTokenType.CloseBrace || tokenType == RTokenType.CloseSquareBracket) {
                        return true;
                    }
                    break;
            }

            if (tokenType == RTokenType.Operator && token.IsKeywordText(context.TextProvider, "<-")) {
                return true;
            }

            if (tokenType == RTokenType.Keyword &&
                !token.IsKeywordText(context.TextProvider, "if") &&
                !token.IsKeywordText(context.TextProvider, "function")) {
                return true;
            }

            return false;
        }
Esempio n. 16
0
 public ArgumentList(RTokenType terminatingTokenType) :
     base(terminatingTokenType)
 {
 }
Esempio n. 17
0
        private RTokenType GetMatchingBraceToken(RTokenType tokenType) {
            switch (tokenType) {
                case RTokenType.OpenBrace:
                    return RTokenType.CloseBrace;

                case RTokenType.CloseBrace:
                    return RTokenType.OpenBrace;

                case RTokenType.OpenSquareBracket:
                    return RTokenType.CloseSquareBracket;

                case RTokenType.CloseSquareBracket:
                    return RTokenType.OpenSquareBracket;

                case RTokenType.OpenDoubleSquareBracket:
                    return RTokenType.CloseDoubleSquareBracket;

                case RTokenType.CloseDoubleSquareBracket:
                    return RTokenType.OpenDoubleSquareBracket;
            }

            Debug.Assert(false, "Unknown brace token");
            return RTokenType.Unknown;
        }
Esempio n. 18
0
        private static bool IsOpenBraceToken(RTokenType tokenType) {
            switch (tokenType) {
                case RTokenType.OpenBrace:
                case RTokenType.OpenCurlyBrace:
                case RTokenType.OpenSquareBracket:
                case RTokenType.OpenDoubleSquareBracket:
                    return true;
            }

            return false;
        }