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;
}