Parse indirect member access
This commit is contained in:
parent
65f4ce2786
commit
d781f8a469
@ -213,5 +213,17 @@ namespace Parser.Tests
|
||||
var a = (CellArrayLiteralExpressionNode) actual;
|
||||
Assert.AreEqual(3, a.Elements.Elements.Count);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ParseIndirectMemberAccess()
|
||||
{
|
||||
var text = "abc.(def)";
|
||||
var sut = CreateParser(text);
|
||||
var actual = sut.ParseExpression();
|
||||
Assert.IsInstanceOf<MemberAccessNode>(actual);
|
||||
var a = (MemberAccessNode) actual;
|
||||
Assert.IsInstanceOf<IdentifierNameNode>(a.LeftOperand);
|
||||
Assert.IsInstanceOf<IndirectMemberAccessNode>(a.RightOperand);
|
||||
}
|
||||
}
|
||||
}
|
@ -255,6 +255,15 @@ namespace Parser
|
||||
if (CurrentToken.Kind == TokenKind.Identifier)
|
||||
{
|
||||
return Factory.IdentifierName(EatToken());
|
||||
} else if (CurrentToken.Kind == TokenKind.OpeningBracket)
|
||||
{
|
||||
var openingBracket = EatToken();
|
||||
var indirectMember = ParseExpression();
|
||||
var closingBracket = EatToken(TokenKind.ClosingBracket);
|
||||
return Factory.IndirectMemberAccess(
|
||||
Factory.Token(openingBracket),
|
||||
indirectMember,
|
||||
Factory.Token(closingBracket));
|
||||
}
|
||||
throw new ParsingException($"Unexpected token {CurrentToken.PureToken} at {CurrentToken.PureToken.Position}.");
|
||||
}
|
||||
|
@ -503,5 +503,25 @@ namespace Parser
|
||||
SetParent(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
public IndirectMemberAccessNode IndirectMemberAccess(
|
||||
TokenNode openingBracket,
|
||||
ExpressionNode indirectMemberName,
|
||||
TokenNode closingBracket)
|
||||
{
|
||||
var children = new List<SyntaxNode>
|
||||
{
|
||||
openingBracket,
|
||||
indirectMemberName,
|
||||
closingBracket
|
||||
};
|
||||
var result = new IndirectMemberAccessNode(
|
||||
children,
|
||||
openingBracket,
|
||||
indirectMemberName,
|
||||
closingBracket);
|
||||
SetParent(result);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
@ -512,4 +512,22 @@ namespace Parser
|
||||
EndKeyword = endKeyword;
|
||||
}
|
||||
}
|
||||
|
||||
public class IndirectMemberAccessNode : ExpressionNode
|
||||
{
|
||||
public TokenNode OpeningBracket { get; }
|
||||
public ExpressionNode IndirectMemberName { get; }
|
||||
public TokenNode ClosingBracket { get; }
|
||||
|
||||
public IndirectMemberAccessNode(
|
||||
List<SyntaxNode> children,
|
||||
TokenNode openingBracket,
|
||||
ExpressionNode indirectMemberName,
|
||||
TokenNode closingBracket) : base(children)
|
||||
{
|
||||
OpeningBracket = openingBracket;
|
||||
IndirectMemberName = indirectMemberName;
|
||||
ClosingBracket = closingBracket;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user