Function output description can be empty
This commit is contained in:
parent
869f3490f1
commit
00aae12361
@ -73,6 +73,7 @@ namespace Parser
|
|||||||
private List<Token> Tokens { get; }
|
private List<Token> Tokens { get; }
|
||||||
private int _index;
|
private int _index;
|
||||||
private Token CurrentToken => Tokens[_index];
|
private Token CurrentToken => Tokens[_index];
|
||||||
|
private Token PeekToken(int n) => Tokens[_index + n];
|
||||||
private SyntaxFactory Factory { get; }
|
private SyntaxFactory Factory { get; }
|
||||||
|
|
||||||
public MParser(List<Token> tokens)
|
public MParser(List<Token> tokens)
|
||||||
@ -144,8 +145,17 @@ namespace Parser
|
|||||||
{
|
{
|
||||||
if (CurrentToken.Kind == TokenKind.Identifier)
|
if (CurrentToken.Kind == TokenKind.Identifier)
|
||||||
{
|
{
|
||||||
var result = EatToken();
|
if (PeekToken(1).Kind == TokenKind.Assignment)
|
||||||
return Factory.FunctionOutputDescription(new List<SyntaxNode> { Factory.Token(result) });
|
{
|
||||||
|
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)
|
} else if (CurrentToken.Kind == TokenKind.OpeningSquareBracket)
|
||||||
{
|
{
|
||||||
var leftBracket = EatToken();
|
var leftBracket = EatToken();
|
||||||
@ -154,7 +164,8 @@ namespace Parser
|
|||||||
var nodes = new List<SyntaxNode> {Factory.Token(leftBracket)};
|
var nodes = new List<SyntaxNode> {Factory.Token(leftBracket)};
|
||||||
nodes.AddRange(outputs);
|
nodes.AddRange(outputs);
|
||||||
nodes.Add(Factory.Token(rightBracket));
|
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}.");
|
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 functionKeyword = EatIdentifier("function");
|
||||||
var outputDescription = ParseFunctionOutputDescription();
|
var outputDescription = ParseFunctionOutputDescription();
|
||||||
var assignment = EatToken(TokenKind.Assignment);
|
|
||||||
var name = EatToken(TokenKind.Identifier);
|
var name = EatToken(TokenKind.Identifier);
|
||||||
var inputDescription = ParseFunctionInputDescription();
|
var inputDescription = ParseFunctionInputDescription();
|
||||||
var body = ParseStatements();
|
var body = ParseStatements();
|
||||||
@ -213,7 +223,6 @@ namespace Parser
|
|||||||
return Factory.FunctionDeclaration(
|
return Factory.FunctionDeclaration(
|
||||||
Factory.Token(functionKeyword),
|
Factory.Token(functionKeyword),
|
||||||
outputDescription,
|
outputDescription,
|
||||||
Factory.Token(assignment),
|
|
||||||
Factory.Token(name),
|
Factory.Token(name),
|
||||||
inputDescription,
|
inputDescription,
|
||||||
body,
|
body,
|
||||||
|
@ -18,24 +18,22 @@ namespace Parser
|
|||||||
}
|
}
|
||||||
|
|
||||||
public FunctionDeclarationNode FunctionDeclaration(
|
public FunctionDeclarationNode FunctionDeclaration(
|
||||||
TokenNode token,
|
TokenNode functionKeyword,
|
||||||
FunctionOutputDescriptionNode outputDescription,
|
FunctionOutputDescriptionNode outputDescription,
|
||||||
TokenNode equalitySign,
|
|
||||||
TokenNode name,
|
TokenNode name,
|
||||||
FunctionInputDescriptionNode inputDescription,
|
FunctionInputDescriptionNode inputDescription,
|
||||||
StatementListNode body,
|
StatementListNode body,
|
||||||
TokenNode end,
|
TokenNode end,
|
||||||
TokenNode semicolonOrComma = null)
|
TokenNode semicolonOrComma = null)
|
||||||
{
|
{
|
||||||
var children = new List<SyntaxNode>
|
var children = new List<SyntaxNode> {functionKeyword};
|
||||||
|
if (outputDescription != null)
|
||||||
{
|
{
|
||||||
token,
|
children.Add(outputDescription);
|
||||||
outputDescription,
|
}
|
||||||
equalitySign,
|
children.Add(name);
|
||||||
name,
|
children.Add(inputDescription);
|
||||||
inputDescription,
|
children.Add(body);
|
||||||
body
|
|
||||||
};
|
|
||||||
if (end != null)
|
if (end != null)
|
||||||
{
|
{
|
||||||
children.Add(end);
|
children.Add(end);
|
||||||
@ -46,28 +44,31 @@ namespace Parser
|
|||||||
}
|
}
|
||||||
var result =
|
var result =
|
||||||
new FunctionDeclarationNode(
|
new FunctionDeclarationNode(
|
||||||
children,
|
children,
|
||||||
token,
|
functionKeyword,
|
||||||
outputDescription,
|
outputDescription,
|
||||||
equalitySign,
|
name,
|
||||||
name,
|
inputDescription,
|
||||||
inputDescription,
|
body,
|
||||||
body,
|
end,
|
||||||
end,
|
semicolonOrComma);
|
||||||
semicolonOrComma);
|
|
||||||
SetParent(result);
|
SetParent(result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public FunctionOutputDescriptionNode FunctionOutputDescription(
|
public FunctionOutputDescriptionNode FunctionOutputDescription(
|
||||||
List<SyntaxNode> nodes)
|
List<SyntaxNode> nodes,
|
||||||
|
TokenNode equalitySign)
|
||||||
{
|
{
|
||||||
|
var children = new List<SyntaxNode>(nodes);
|
||||||
|
nodes.Add(equalitySign);
|
||||||
var result = new FunctionOutputDescriptionNode(
|
var result = new FunctionOutputDescriptionNode(
|
||||||
nodes,
|
nodes,
|
||||||
nodes
|
nodes
|
||||||
.Where(node => node is TokenNode && ((TokenNode) node).Token.Kind == TokenKind.Identifier)
|
.Where(node => node is TokenNode && ((TokenNode) node).Token.Kind == TokenKind.Identifier)
|
||||||
.Select(node => node as TokenNode)
|
.Select(node => node as TokenNode)
|
||||||
.ToList()
|
.ToList(),
|
||||||
|
equalitySign
|
||||||
);
|
);
|
||||||
SetParent(result);
|
SetParent(result);
|
||||||
return result;
|
return result;
|
||||||
|
@ -41,10 +41,15 @@ namespace Parser
|
|||||||
public class FunctionOutputDescriptionNode : SyntaxNode
|
public class FunctionOutputDescriptionNode : SyntaxNode
|
||||||
{
|
{
|
||||||
public List<TokenNode> Outputs { get; }
|
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;
|
Outputs = outputs;
|
||||||
|
EqualitySign = equalitySign;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,7 +74,6 @@ namespace Parser
|
|||||||
{
|
{
|
||||||
public TokenNode Token { get; }
|
public TokenNode Token { get; }
|
||||||
public FunctionOutputDescriptionNode OutputDescription { get; }
|
public FunctionOutputDescriptionNode OutputDescription { get; }
|
||||||
public TokenNode EqualitySign { get; }
|
|
||||||
public TokenNode Name { get; }
|
public TokenNode Name { get; }
|
||||||
public FunctionInputDescriptionNode InputDescription { get; }
|
public FunctionInputDescriptionNode InputDescription { get; }
|
||||||
public StatementListNode Body { get; }
|
public StatementListNode Body { get; }
|
||||||
@ -79,7 +83,6 @@ namespace Parser
|
|||||||
List<SyntaxNode> children,
|
List<SyntaxNode> children,
|
||||||
TokenNode token,
|
TokenNode token,
|
||||||
FunctionOutputDescriptionNode outputDescription,
|
FunctionOutputDescriptionNode outputDescription,
|
||||||
TokenNode equalitySign,
|
|
||||||
TokenNode name,
|
TokenNode name,
|
||||||
FunctionInputDescriptionNode inputDescription,
|
FunctionInputDescriptionNode inputDescription,
|
||||||
StatementListNode body,
|
StatementListNode body,
|
||||||
@ -89,7 +92,6 @@ namespace Parser
|
|||||||
{
|
{
|
||||||
Token = token;
|
Token = token;
|
||||||
OutputDescription = outputDescription;
|
OutputDescription = outputDescription;
|
||||||
EqualitySign = equalitySign;
|
|
||||||
Name = name;
|
Name = name;
|
||||||
InputDescription = inputDescription;
|
InputDescription = inputDescription;
|
||||||
Body = body;
|
Body = body;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user