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 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,

View File

@ -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;

View File

@ -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;