Parse indirect member access
This commit is contained in:
parent
65f4ce2786
commit
d781f8a469
@ -213,5 +213,17 @@ namespace Parser.Tests
|
|||||||
var a = (CellArrayLiteralExpressionNode) actual;
|
var a = (CellArrayLiteralExpressionNode) actual;
|
||||||
Assert.AreEqual(3, a.Elements.Elements.Count);
|
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)
|
if (CurrentToken.Kind == TokenKind.Identifier)
|
||||||
{
|
{
|
||||||
return Factory.IdentifierName(EatToken());
|
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}.");
|
throw new ParsingException($"Unexpected token {CurrentToken.PureToken} at {CurrentToken.PureToken.Position}.");
|
||||||
}
|
}
|
||||||
|
@ -503,5 +503,25 @@ namespace Parser
|
|||||||
SetParent(result);
|
SetParent(result);
|
||||||
return 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;
|
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