Parse function handles
This commit is contained in:
parent
01dda0cf6f
commit
a550b4f96c
@ -350,5 +350,15 @@ namespace Parser.Tests
|
||||
Assert.AreEqual(text, actual.FullText);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ParseFunctionHandle()
|
||||
{
|
||||
var text = "@sqrt";
|
||||
var sut = CreateParser(text);
|
||||
var actual = sut.ParseExpression();
|
||||
Assert.IsInstanceOf<FunctionHandleNode>(actual);
|
||||
var f = (FunctionHandleNode) actual;
|
||||
Assert.AreEqual("sqrt", f.IdentifierName.Token.PureToken.LiteralText);
|
||||
}
|
||||
}
|
||||
}
|
@ -549,6 +549,15 @@ namespace Parser
|
||||
throw new ArgumentException(nameof(kind));
|
||||
}
|
||||
}
|
||||
|
||||
private FunctionHandleNode ParseFunctionHandle()
|
||||
{
|
||||
var atSign = EatToken();
|
||||
var identifierName = EatToken(TokenKind.Identifier);
|
||||
return Factory.FunctionHandle(
|
||||
Factory.Token(atSign),
|
||||
Factory.IdentifierName(identifierName));
|
||||
}
|
||||
|
||||
private ExpressionNode ParseSubExpression(ParseOptions options, Precedence precedence)
|
||||
{
|
||||
@ -561,6 +570,10 @@ namespace Parser
|
||||
var operand = ParseSubExpression(options, newPrecedence);
|
||||
lhs = Factory.UnaryPrefixOperationExpression(Factory.Token(operation), operand);
|
||||
}
|
||||
else if (CurrentToken.Kind == TokenKind.At)
|
||||
{
|
||||
return ParseFunctionHandle();
|
||||
}
|
||||
else
|
||||
{
|
||||
lhs = ParseTerm(options);
|
||||
|
@ -541,5 +541,23 @@ namespace Parser
|
||||
SetParent(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
public FunctionHandleNode FunctionHandle(
|
||||
TokenNode atSign,
|
||||
IdentifierNameNode identifierName)
|
||||
{
|
||||
var children = new List<SyntaxNode>
|
||||
{
|
||||
atSign,
|
||||
identifierName
|
||||
};
|
||||
var result = new FunctionHandleNode(
|
||||
children,
|
||||
atSign,
|
||||
identifierName);
|
||||
SetParent(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -586,4 +586,21 @@ namespace Parser
|
||||
ClosingBracket = closingBracket;
|
||||
}
|
||||
}
|
||||
|
||||
public class FunctionHandleNode : ExpressionNode
|
||||
{
|
||||
public TokenNode AtSign { get; }
|
||||
public IdentifierNameNode IdentifierName { get; }
|
||||
|
||||
public FunctionHandleNode(
|
||||
List<SyntaxNode> children,
|
||||
TokenNode atSign,
|
||||
IdentifierNameNode identifierName) : base(children)
|
||||
{
|
||||
AtSign = atSign;
|
||||
IdentifierName = identifierName;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user