示例#1
0
        public IEnumerable <BQueryToken> GetTokens()
        {
            while (!this.textSource.IsEnded)
            {
                char c = this.textSource.Current;

                if (c == '.')
                {
                    yield return(new BQueryToken(BQueryTokenKind.Dot, ".", this.textSource.GetPosition()));
                }
                else if (c == '[')
                {
                    yield return(new BQueryToken(BQueryTokenKind.LBracket, "[", this.textSource.GetPosition()));
                }
                else if (c == ']')
                {
                    yield return(new BQueryToken(BQueryTokenKind.RBracket, "]", this.textSource.GetPosition()));
                }
                else
                {
                    if (char.IsLetter(c))
                    {
                        var(ident, offset) = LexerHelper.GetAnyName(this.textSource.Slice());
                        yield return(new BQueryToken(BQueryTokenKind.Id, ident, this.textSource.GetPosition()));

                        this.textSource.AdvanceChar(offset);
                    }
                    else if (char.IsDigit(c))
                    {
                        var(numberString, offset) = LexerHelper.GetNumber(this.textSource.Slice());

                        yield return(new BQueryToken(BQueryTokenKind.Number, numberString, this.textSource.GetPosition()));

                        this.textSource.AdvanceChar(offset);
                    }
                    else if (c == '\'')
                    {
                        var(str, offset) = LexerHelper.GetSingleQuoteString(this.textSource.Slice());
                        yield return(new BQueryToken(BQueryTokenKind.String, str, this.textSource.GetPosition()));

                        this.textSource.AdvanceChar(offset);
                    }
                    else if (c == '\"')
                    {
                        var(str, offset) = LexerHelper.GetDoubleQuoteString(this.textSource.Slice());
                        yield return(new BQueryToken(BQueryTokenKind.String, str, this.textSource.GetPosition()));

                        this.textSource.AdvanceChar(offset);
                    }
                }

                this.textSource.AdvanceChar();
            }
        }
示例#2
0
        public IEnumerable <LispToken> GetTokens()
        {
            HashSet <char> charsSymbols = new HashSet <char>()
            {
                '+', '*', '/', //math
                '=', '<', '>'  //boolean
            };

            while (!this.textSource.IsEnded)
            {
                var c = this.textSource.Current;
                if (c == ';')
                {
                    //comment ignore until new line
                    do
                    {
                        this.textSource.AdvanceChar();
                    } while (!this.textSource.IsEnded && this.textSource.Current != '\n');
                }
                else if (c == '(')
                {
                    yield return(new LispToken(LispTokenKind.LParen, "(", this.textSource.GetPosition()));
                }
                else if (c == ')')
                {
                    yield return(new LispToken(LispTokenKind.RParen, ")", this.textSource.GetPosition()));
                }
                else if (c == '\'')
                {
                    yield return(new LispToken(LispTokenKind.Quote, "'", this.textSource.GetPosition()));
                }
                else if (charsSymbols.Contains(c))
                {
                    yield return(new LispToken(LispTokenKind.Symbol, c.ToString(), this.textSource.GetPosition()));
                }
                else if (c == '-')
                {
                    if (char.IsDigit(this.textSource.Next))
                    {
                        this.textSource.AdvanceChar(); // for the '-' symbol
                        var(numberString, offset) = LexerHelper.GetNumber(this.textSource.Slice());
                        yield return(new LispToken(LispTokenKind.Number, '-' + numberString, this.textSource.GetPosition()));

                        this.textSource.AdvanceChar(offset);
                    }
                    else
                    {
                        yield return(new LispToken(LispTokenKind.Symbol, "-", this.textSource.GetPosition()));
                    }
                }
                else
                {
                    if (char.IsLetter(c))
                    {
                        var match = Regex.Match(this.textSource.Slice().ToString(), @"[\w!_]+", RegexOptions.Compiled);
                        yield return(new LispToken(LispTokenKind.Symbol, match.Value, this.textSource.GetPosition()));

                        this.textSource.AdvanceChar(match.Length - 1);
                    }
                    else if (char.IsDigit(c))
                    {
                        var(numberString, offset) = LexerHelper.GetNumber(this.textSource.Slice());
                        yield return(new LispToken(LispTokenKind.Number, numberString, this.textSource.GetPosition()));

                        this.textSource.AdvanceChar(offset);
                    }
                    else if (c == '\"')
                    {
                        var(str, offset) = LexerHelper.GetDoubleQuoteString(this.textSource.Slice());
                        yield return(new LispToken(LispTokenKind.String, str, this.textSource.GetPosition()));

                        this.textSource.AdvanceChar(offset);
                    }
                }

                this.textSource.AdvanceChar();
            }
        }
示例#3
0
文件: Lexer.cs 项目: soltys/Melange
        public IEnumerable <CmdToken> GetTokens()
        {
            while (!this.textSource.IsEnded)
            {
                var currentChar = this.textSource.Current;
                if (currentChar == '=')
                {
                    var nextChar = this.textSource.Next;
                    if (nextChar == '=')
                    {
                        yield return(new CmdToken(CmdTokenKind.CompareEqual, "=="));

                        this.textSource.AdvanceChar();
                    }
                    else
                    {
                        yield return(new CmdToken(CmdTokenKind.EqualSign, "="));
                    }
                }

                else if (currentChar == '<')
                {
                    var nextChar = this.textSource.Next;
                    if (nextChar == '=')
                    {
                        yield return(new CmdToken(CmdTokenKind.LessThanEqual, "<="));

                        this.textSource.AdvanceChar();
                    }
                    else
                    {
                        yield return(new CmdToken(CmdTokenKind.LessThan, "<"));
                    }
                }
                else if (currentChar == '>')
                {
                    var nextChar = this.textSource.Next;
                    if (nextChar == '=')
                    {
                        yield return(new CmdToken(CmdTokenKind.GreaterThanEqual, ">="));

                        this.textSource.AdvanceChar();
                    }
                    else
                    {
                        yield return(new CmdToken(CmdTokenKind.GreaterThan, ">"));
                    }
                }

                else if (currentChar == '+')
                {
                    yield return(new CmdToken(CmdTokenKind.Plus, "+"));
                }
                else if (currentChar == '-')
                {
                    yield return(new CmdToken(CmdTokenKind.Minus, "-"));
                }
                else if (currentChar == '/')
                {
                    yield return(new CmdToken(CmdTokenKind.Slash, "/"));
                }
                else if (currentChar == '*')
                {
                    yield return(new CmdToken(CmdTokenKind.Star, "*"));
                }
                else if (currentChar == '(')
                {
                    yield return(new CmdToken(CmdTokenKind.LParen, "("));
                }
                else if (currentChar == ')')
                {
                    yield return(new CmdToken(CmdTokenKind.RParen, ")"));
                }
                else if (currentChar == ',')
                {
                    yield return(new CmdToken(CmdTokenKind.Comma, ","));
                }
                else if (currentChar == '.')
                {
                    yield return(new CmdToken(CmdTokenKind.Dot, "."));
                }
                else if (currentChar == '!')
                {
                    var nextChar = this.textSource.Next;
                    if (nextChar == '=')
                    {
                        yield return(new CmdToken(CmdTokenKind.CompareNotEqual, "!="));

                        this.textSource.AdvanceChar();
                    }
                }
                else
                {
                    if (char.IsLetter(currentChar))
                    {
                        var(ident, offset) = LexerHelper.GetAnyName(this.textSource.Slice());
                        yield return(MakeToken(ident));

                        this.textSource.AdvanceChar(offset);
                    }
                    else if (char.IsDigit(currentChar))
                    {
                        var(numberString, offset) = LexerHelper.GetNumber(this.textSource.Slice());
                        yield return(new CmdToken(CmdTokenKind.Number, numberString));

                        this.textSource.AdvanceChar(offset);
                    }
                    else if (currentChar == '\'')
                    {
                        var(str, offset) = LexerHelper.GetSingleQuoteString(this.textSource.Slice());
                        yield return(new CmdToken(CmdTokenKind.String, str));

                        this.textSource.AdvanceChar(offset);
                    }
                    else if (currentChar == '\"')
                    {
                        var(str, offset) = LexerHelper.GetDoubleQuoteString(this.textSource.Slice());
                        yield return(new CmdToken(CmdTokenKind.String, str));

                        this.textSource.AdvanceChar(offset);
                    }
                }

                this.textSource.AdvanceChar();
            }
        }