protected IrisType ParseBaseExpression()

in Iris/IrisCompiler/FrontEnd/Translator.cs [789:843]


        protected IrisType ParseBaseExpression(SymbolLoadMode mode)
        {
            FilePosition fp = _lastParsedPosition;
            if (Accept(Token.Identifier))
            {
                Symbol symbol = LookupSymbol(fp, _lexeme);

                if (Accept(Token.ChrOpenBracket))
                    return ProcessArrayAccess(fp, symbol, mode == SymbolLoadMode.Address ? SymbolLoadMode.ElementAddress : SymbolLoadMode.Element);
                if (Accept(Token.ChrOpenParen))
                    return ProcessCall(fp, symbol, skipArgList: false);
                
                IrisType type = symbol.Type;
                if (type.IsMethod)
                    return ProcessCall(fp, symbol, skipArgList: true);
                if (type != IrisType.Invalid)
                    EmitLoadSymbol(symbol, mode);

                if (mode == SymbolLoadMode.Address && !type.IsByRef)
                    return type.MakeByRefType();
                else if (mode == SymbolLoadMode.Dereference)
                    return DerefType(type);
                else
                    return type;
            }
            else if (Accept(Token.KwTrue))
            {
                MethodGenerator.PushIntConst(1);
                return IrisType.Boolean;
            }
            else if (Accept(Token.KwFalse))
            {
                MethodGenerator.PushIntConst(0);
                return IrisType.Boolean;
            }
            else if (Accept(Token.Number))
            {
                MethodGenerator.PushIntConst(_lastIntegerLexeme);
                return IrisType.Integer;
            }
            else if (Accept(Token.String))
            {
                MethodGenerator.PushString(_lexeme);
                return IrisType.String;
            }
            else if (Accept(Token.ChrOpenParen))
            {
                IrisType type = ParseExpression(mode);
                Expect(Token.ChrCloseParen);
                return type;
            }

            AddError(fp, "Expecting expression.");
            return IrisType.Invalid;
        }