Parse compound names in function handles
This commit is contained in:
parent
b033cb6f7d
commit
e5d0b0fe2e
@ -358,7 +358,20 @@ namespace Parser.Tests
|
|||||||
var actual = sut.ParseExpression();
|
var actual = sut.ParseExpression();
|
||||||
Assert.IsInstanceOf<NamedFunctionHandleNode>(actual);
|
Assert.IsInstanceOf<NamedFunctionHandleNode>(actual);
|
||||||
var f = (NamedFunctionHandleNode) actual;
|
var f = (NamedFunctionHandleNode) actual;
|
||||||
Assert.AreEqual("sqrt", f.IdentifierName.Token.PureToken.LiteralText);
|
Assert.AreEqual(1, f.FunctionName.Names.Count);
|
||||||
|
Assert.AreEqual("sqrt", f.FunctionName.Names[0].Token.PureToken.LiteralText);
|
||||||
|
Assert.AreEqual(text, actual.FullText);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void ParseFunctionHandleWithCompoundName()
|
||||||
|
{
|
||||||
|
var text = "@a.b.c";
|
||||||
|
var sut = CreateParser(text);
|
||||||
|
var actual = sut.ParseExpression();
|
||||||
|
Assert.IsInstanceOf<NamedFunctionHandleNode>(actual);
|
||||||
|
var f = (NamedFunctionHandleNode) actual;
|
||||||
|
Assert.AreEqual(3, f.FunctionName.Names.Count);
|
||||||
Assert.AreEqual(text, actual.FullText);
|
Assert.AreEqual(text, actual.FullText);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -554,15 +554,32 @@ namespace Parser
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private CompoundNameNode ParseCompoundName()
|
||||||
|
{
|
||||||
|
var lastToken = EatToken(TokenKind.Identifier);
|
||||||
|
var firstName = Factory.IdentifierName(lastToken);
|
||||||
|
var nodes = new List<SyntaxNode> {firstName};
|
||||||
|
while (CurrentToken.Kind == TokenKind.Dot
|
||||||
|
&& !lastToken.TrailingTrivia.Any())
|
||||||
|
{
|
||||||
|
var dot = Factory.Token(EatToken());
|
||||||
|
nodes.Add(dot);
|
||||||
|
lastToken = EatToken(TokenKind.Identifier);
|
||||||
|
nodes.Add(Factory.IdentifierName(lastToken));
|
||||||
|
}
|
||||||
|
|
||||||
|
return Factory.CompoundName(nodes);
|
||||||
|
}
|
||||||
|
|
||||||
private FunctionHandleNode ParseFunctionHandle()
|
private FunctionHandleNode ParseFunctionHandle()
|
||||||
{
|
{
|
||||||
var atSign = EatToken();
|
var atSign = EatToken();
|
||||||
if (CurrentToken.Kind == TokenKind.Identifier)
|
if (CurrentToken.Kind == TokenKind.Identifier)
|
||||||
{
|
{
|
||||||
var identifierName = EatToken(TokenKind.Identifier);
|
var compoundName = ParseCompoundName();
|
||||||
return Factory.NamedFunctionHandle(
|
return Factory.NamedFunctionHandle(
|
||||||
Factory.Token(atSign),
|
Factory.Token(atSign),
|
||||||
Factory.IdentifierName(identifierName));
|
compoundName);
|
||||||
} else if (CurrentToken.Kind == TokenKind.OpeningBracket)
|
} else if (CurrentToken.Kind == TokenKind.OpeningBracket)
|
||||||
{
|
{
|
||||||
var inputs = ParseFunctionInputDescription();
|
var inputs = ParseFunctionInputDescription();
|
||||||
|
@ -323,6 +323,17 @@ namespace Parser
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public CompoundNameNode CompoundName(List<SyntaxNode> nodes)
|
||||||
|
{
|
||||||
|
var result = new CompoundNameNode(
|
||||||
|
nodes,
|
||||||
|
nodes
|
||||||
|
.OfType<IdentifierNameNode>()
|
||||||
|
.ToList());
|
||||||
|
SetParent(result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
public ArrayLiteralExpressionNode ArrayLiteralExpression(
|
public ArrayLiteralExpressionNode ArrayLiteralExpression(
|
||||||
TokenNode openingSquareBracket,
|
TokenNode openingSquareBracket,
|
||||||
ArrayElementListNode elements,
|
ArrayElementListNode elements,
|
||||||
@ -544,17 +555,17 @@ namespace Parser
|
|||||||
|
|
||||||
public NamedFunctionHandleNode NamedFunctionHandle(
|
public NamedFunctionHandleNode NamedFunctionHandle(
|
||||||
TokenNode atSign,
|
TokenNode atSign,
|
||||||
IdentifierNameNode identifierName)
|
CompoundNameNode functionName)
|
||||||
{
|
{
|
||||||
var children = new List<SyntaxNode>
|
var children = new List<SyntaxNode>
|
||||||
{
|
{
|
||||||
atSign,
|
atSign,
|
||||||
identifierName
|
functionName
|
||||||
};
|
};
|
||||||
var result = new NamedFunctionHandleNode(
|
var result = new NamedFunctionHandleNode(
|
||||||
children,
|
children,
|
||||||
atSign,
|
atSign,
|
||||||
identifierName);
|
functionName);
|
||||||
SetParent(result);
|
SetParent(result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -451,6 +451,19 @@ namespace Parser
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class CompoundNameNode : ExpressionNode
|
||||||
|
{
|
||||||
|
public List<IdentifierNameNode> Names;
|
||||||
|
|
||||||
|
public CompoundNameNode(
|
||||||
|
List<SyntaxNode> children,
|
||||||
|
List<IdentifierNameNode> names
|
||||||
|
) : base(children)
|
||||||
|
{
|
||||||
|
Names = names;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public class MemberAccessNode : ExpressionNode
|
public class MemberAccessNode : ExpressionNode
|
||||||
{
|
{
|
||||||
public SyntaxNode LeftOperand { get; }
|
public SyntaxNode LeftOperand { get; }
|
||||||
@ -598,15 +611,15 @@ namespace Parser
|
|||||||
public class NamedFunctionHandleNode : FunctionHandleNode
|
public class NamedFunctionHandleNode : FunctionHandleNode
|
||||||
{
|
{
|
||||||
public TokenNode AtSign { get; }
|
public TokenNode AtSign { get; }
|
||||||
public IdentifierNameNode IdentifierName { get; }
|
public CompoundNameNode FunctionName { get; }
|
||||||
|
|
||||||
public NamedFunctionHandleNode(
|
public NamedFunctionHandleNode(
|
||||||
List<SyntaxNode> children,
|
List<SyntaxNode> children,
|
||||||
TokenNode atSign,
|
TokenNode atSign,
|
||||||
IdentifierNameNode identifierName) : base(children)
|
CompoundNameNode functionName) : base(children)
|
||||||
{
|
{
|
||||||
AtSign = atSign;
|
AtSign = atSign;
|
||||||
IdentifierName = identifierName;
|
FunctionName = functionName;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ namespace ProjectConsole
|
|||||||
class Program
|
class Program
|
||||||
{
|
{
|
||||||
//private const string BaseDirectory = @"C:\Program Files\MATLAB\R2018a\toolbox\matlab\";
|
//private const string BaseDirectory = @"C:\Program Files\MATLAB\R2018a\toolbox\matlab\";
|
||||||
private const string BaseDirectory = @"/Applications/MATLAB_R2017b.app/toolbox/matlab/guide/";
|
private const string BaseDirectory = @"/Applications/MATLAB_R2017b.app/toolbox/matlab/";
|
||||||
|
|
||||||
private static HashSet<string> skipFiles = new HashSet<string>
|
private static HashSet<string> skipFiles = new HashSet<string>
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user