Ejemplo n.º 1
0
        private static bool TryParse
            (Tokenizer.State state, Func <Tokenizer.State, Token> parser, out Token token)
        {
            state.Save();
            Tokenizer.State stateCopy = new Tokenizer.State(state);

            token = parser(state);

            if (state.IsErrorOccured())
            {
                state.Drop();
                return(true);
            }
            else if (token != null)
            {
                token.Index    = stateCopy.Index;
                token.Line     = stateCopy.Line;
                token.Position = stateCopy.Position;

                state.Drop();
                return(true);
            }

            state.Restore();
            return(false);
        }
        public static Token Parse(Tokenizer.State state)
        {
            if (state.CurrentCharacter == '/')
            {
                int begin = state.Index;

                bool inline = false;

                state.Index += 1;
                if (state.CurrentCharacter == '/')
                {
                    state.Index += 1;
                    ParseInlineCommentary(state);
                    inline = true;
                }
                else if (state.CurrentCharacter == '*')
                {
                    state.Index += 1;
                    ParseMultilineCommentary(state);
                }
                else
                {
                    return(null);
                }

                if (state.IsErrorOccured())
                {
                    state.Index = begin + 2;
                }

                return(new Token(
                           value: state.Code.Substring(begin, state.Index - begin),

                           type: TokenType.Commentary,
                           subType: inline
                        ? TokenSubType.InlineCommentary
                        : TokenSubType.MultilineCommentary
                           ));
            }

            return(null);
        }
        public static Token Parse(Tokenizer.State state)
        {
            if (state.CurrentCharacter == '`')
            {
                var begin = state.Index;
                state.Index += 1;

                ParseInlineCommentary(state);

                if (state.IsErrorOccured())
                {
                    state.Index = begin + 2;
                }

                return(new Token(
                           value: state.Code.Substring(begin, state.Index - begin),

                           type: TokenType.Commentary,
                           subType: TokenSubType.InlineCommentary
                           ));
            }

            return(null);
        }