Function output description can be empty

This commit is contained in:
Alexander Luzgarev 2018-03-31 22:09:03 +02:00
parent 869f3490f1
commit 00aae12361
3 changed files with 42 additions and 30 deletions

View File

@ -73,6 +73,7 @@ namespace Parser
private List<Token> Tokens { get; }
private int _index;
private Token CurrentToken => Tokens[_index];
private Token PeekToken(int n) => Tokens[_index + n];
private SyntaxFactory Factory { get; }
public MParser(List<Token> tokens)
@ -144,8 +145,17 @@ namespace Parser
{
if (CurrentToken.Kind == TokenKind.Identifier)
{
var result = EatToken();
return Factory.FunctionOutputDescription(new List<SyntaxNode> { Factory.Token(result) });
if (PeekToken(1).Kind == TokenKind.Assignment)
{
var identifier = EatToken();
var assignmentSign = EatToken(TokenKind.Assignment);
return Factory.FunctionOutputDescription(
new List<SyntaxNode> { Factory.Token(identifier) },
Factory.Token(assignmentSign)
);
}
return null;
} else if (CurrentToken.Kind == TokenKind.OpeningSquareBracket)
{
var leftBracket = EatToken();
@ -154,7 +164,8 @@ namespace Parser
var nodes = new List<SyntaxNode> {Factory.Token(leftBracket)};
nodes.AddRange(outputs);
nodes.Add(Factory.Token(rightBracket));
return Factory.FunctionOutputDescription(nodes);
var assignmentSign = EatToken(TokenKind.Assignment);
return Factory.FunctionOutputDescription(nodes, Factory.Token(assignmentSign));
}
throw new ParsingException($"Unexpected token {CurrentToken.PureToken} during parsing function output descritpion at {CurrentToken.PureToken.Position}.");
}
@ -198,7 +209,6 @@ namespace Parser
{
var functionKeyword = EatIdentifier("function");
var outputDescription = ParseFunctionOutputDescription();
var assignment = EatToken(TokenKind.Assignment);
var name = EatToken(TokenKind.Identifier);
var inputDescription = ParseFunctionInputDescription();
var body = ParseStatements();
@ -213,7 +223,6 @@ namespace Parser
return Factory.FunctionDeclaration(
Factory.Token(functionKeyword),
outputDescription,
Factory.Token(assignment),
Factory.Token(name),
inputDescription,
body,

View File

@ -18,24 +18,22 @@ namespace Parser
}
public FunctionDeclarationNode FunctionDeclaration(
TokenNode token,
TokenNode functionKeyword,
FunctionOutputDescriptionNode outputDescription,
TokenNode equalitySign,
TokenNode name,
FunctionInputDescriptionNode inputDescription,
StatementListNode body,
TokenNode end,
TokenNode semicolonOrComma = null)
{
var children = new List<SyntaxNode>
var children = new List<SyntaxNode> {functionKeyword};
if (outputDescription != null)
{
token,
outputDescription,
equalitySign,
name,
inputDescription,
body
};
children.Add(outputDescription);
}
children.Add(name);
children.Add(inputDescription);
children.Add(body);
if (end != null)
{
children.Add(end);
@ -47,9 +45,8 @@ namespace Parser
var result =
new FunctionDeclarationNode(
children,
token,
functionKeyword,
outputDescription,
equalitySign,
name,
inputDescription,
body,
@ -60,14 +57,18 @@ namespace Parser
}
public FunctionOutputDescriptionNode FunctionOutputDescription(
List<SyntaxNode> nodes)
List<SyntaxNode> nodes,
TokenNode equalitySign)
{
var children = new List<SyntaxNode>(nodes);
nodes.Add(equalitySign);
var result = new FunctionOutputDescriptionNode(
nodes,
nodes
.Where(node => node is TokenNode && ((TokenNode) node).Token.Kind == TokenKind.Identifier)
.Select(node => node as TokenNode)
.ToList()
.ToList(),
equalitySign
);
SetParent(result);
return result;

View File

@ -41,10 +41,15 @@ namespace Parser
public class FunctionOutputDescriptionNode : SyntaxNode
{
public List<TokenNode> Outputs { get; }
public TokenNode EqualitySign { get; }
public FunctionOutputDescriptionNode(List<SyntaxNode> children, List<TokenNode> outputs) : base(children)
public FunctionOutputDescriptionNode(
List<SyntaxNode> children,
List<TokenNode> outputs,
TokenNode equalitySign) : base(children)
{
Outputs = outputs;
EqualitySign = equalitySign;
}
}
@ -69,7 +74,6 @@ namespace Parser
{
public TokenNode Token { get; }
public FunctionOutputDescriptionNode OutputDescription { get; }
public TokenNode EqualitySign { get; }
public TokenNode Name { get; }
public FunctionInputDescriptionNode InputDescription { get; }
public StatementListNode Body { get; }
@ -79,7 +83,6 @@ namespace Parser
List<SyntaxNode> children,
TokenNode token,
FunctionOutputDescriptionNode outputDescription,
TokenNode equalitySign,
TokenNode name,
FunctionInputDescriptionNode inputDescription,
StatementListNode body,
@ -89,7 +92,6 @@ namespace Parser
{
Token = token;
OutputDescription = outputDescription;
EqualitySign = equalitySign;
Name = name;
InputDescription = inputDescription;
Body = body;