Esempio n. 1
0
        private void LexInvoke()
        {
            bool keep = true;

            while (keep && !_src.EndOfStream)
            {
                switch (_curChar)
                {
                case '(':
                {
                    TokenId tokenId = TokenId.LParen;
                    _stack.Push(tokenId);
                    _tokens.Add(new Token(tokenId, _src.LineIndex, _src.CharacterIndex - 1, 1));
                    _curChar = _src.Read();

                    LexCode(false, ')');
                    break;
                }

                case ')':
                {
                    if (_stack.Count > 0 && _stack.Peek() == TokenId.LParen)
                    {
                        _stack.Pop();
                        TokenId tokenId = TokenId.RParen;
                        _tokens.Add(new Token(tokenId, _src.LineIndex, _src.CharacterIndex - 1, 1));
                        _curChar = _src.Read();
                    }

                    keep = false;
                    break;
                }

                case '[':
                {
                    TokenId tokenId = TokenId.LBracket;
                    _stack.Push(tokenId);
                    _tokens.Add(new Token(tokenId, _src.LineIndex, _src.CharacterIndex - 1, 1));
                    _curChar = _src.Read();

                    if (_curChar == '"')
                    {
                        LexString();
                    }
                    break;
                }

                case ']':
                {
                    if (_stack.Count > 0 && _stack.Peek() == TokenId.LBracket)
                    {
                        _stack.Pop();
                        TokenId tokenId = TokenId.RBracket;
                        _tokens.Add(new Token(tokenId, _src.LineIndex, _src.CharacterIndex - 1, 1));
                        _curChar = _src.Read();
                    }
                    else
                    {
                        keep = false;
                    }

                    break;
                }

                case '.':
                {
                    if (WillBeKeyOrIdent(_src.Peek()))
                    {
                        _tokens.Add(new Token(TokenId.Dot, _src.LineIndex, _src.CharacterIndex - 1, 1));
                        _curChar = _src.Read();
                    }
                    else
                    {
                        keep = false;
                    }

                    break;
                }

                default:
                {
                    if (WillBeKeyOrIdent(_curChar))
                    {
                        _tokens.Add(LexKeyOrIdent());
                    }
                    else
                    {
                        keep = false;
                    }
                    break;
                }
                }
            }

            if (_curChar == ';')
            {
                _curChar = _src.Read();
            }
        }