示例#1
0
        public static Lexer Create(StreamReader reader, ErrorList errors)
        {
            Lexer lex = new Lexer(reader, errors);
            lex.MoveNext();

            return lex;
        }
        private Symbol ParseLValue(Lexer lvalLexer)
        {
            if (lvalLexer.CurrentToken != Token.Identifier)
            {
                AddLValueError();
                return null;
            }

            Symbol symbol = _context.SymbolTable.Lookup(lvalLexer.GetLexeme());
            if (symbol == null)
            {
                AddLValueError();
                return null;
            }

            IrisType lhs = symbol.Type;
            lvalLexer.MoveNext();
            if (lhs.IsArray)
            {
                // We should have an open bracket (We don't support changing the array value itself)
                if (lvalLexer.CurrentToken != Token.ChrOpenBracket)
                {
                    AddLValueError();
                    return null;
                }

                EmitLoadSymbol(symbol, SymbolLoadMode.Raw);

                lvalLexer.MoveNext();
                if (lvalLexer.CurrentToken != Token.Number)
                {
                    AddLValueError();
                    return null;
                }

                int index = lvalLexer.ParseInteger();
                MethodGenerator.PushIntConst(index);
                lvalLexer.MoveNext();
                if (lvalLexer.CurrentToken != Token.ChrCloseBracket)
                {
                    AddLValueError();
                    return null;
                }
            }
            else if (lhs.IsByRef)
            {
                EmitLoadSymbol(symbol, SymbolLoadMode.Raw);
            }

            return symbol;
        }