diff --git a/Parser.Tests/MParserShould.cs b/Parser.Tests/MParserShould.cs index ad5ef5d..ff46ebd 100644 --- a/Parser.Tests/MParserShould.cs +++ b/Parser.Tests/MParserShould.cs @@ -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(actual); + var f = (FunctionHandleNode) actual; + Assert.AreEqual("sqrt", f.IdentifierName.Token.PureToken.LiteralText); + } } } \ No newline at end of file diff --git a/Parser/MParser.cs b/Parser/MParser.cs index 1891dc8..e2d1f92 100644 --- a/Parser/MParser.cs +++ b/Parser/MParser.cs @@ -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); diff --git a/Parser/SyntaxFactory.cs b/Parser/SyntaxFactory.cs index 478d1ba..933b812 100644 --- a/Parser/SyntaxFactory.cs +++ b/Parser/SyntaxFactory.cs @@ -541,5 +541,23 @@ namespace Parser SetParent(result); return result; } + + public FunctionHandleNode FunctionHandle( + TokenNode atSign, + IdentifierNameNode identifierName) + { + var children = new List + { + atSign, + identifierName + }; + var result = new FunctionHandleNode( + children, + atSign, + identifierName); + SetParent(result); + return result; + } + } } \ No newline at end of file diff --git a/Parser/SyntaxNode.cs b/Parser/SyntaxNode.cs index 57a7fdb..2859ad7 100644 --- a/Parser/SyntaxNode.cs +++ b/Parser/SyntaxNode.cs @@ -586,4 +586,21 @@ namespace Parser ClosingBracket = closingBracket; } } + + public class FunctionHandleNode : ExpressionNode + { + public TokenNode AtSign { get; } + public IdentifierNameNode IdentifierName { get; } + + public FunctionHandleNode( + List children, + TokenNode atSign, + IdentifierNameNode identifierName) : base(children) + { + AtSign = atSign; + IdentifierName = identifierName; + } + } + + } \ No newline at end of file