Parse indirect member access

This commit is contained in:
Alexander Luzgarev 2018-03-31 22:44:51 +02:00
parent 65f4ce2786
commit d781f8a469
4 changed files with 59 additions and 0 deletions

View File

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

View File

@ -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}.");
}

View File

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

View File

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