From 3d31b2c04bcc88f75613f3b9d046b41939750eb1 Mon Sep 17 00:00:00 2001 From: Alexander Luzgarev Date: Thu, 5 Apr 2018 09:32:53 +0200 Subject: [PATCH] Parse command-line syntax --- Parser/MParser.cs | 15 +++++++++++++++ Parser/SyntaxFactory.cs | 23 +++++++++++++++++++++++ Parser/SyntaxNode.cs | 16 ++++++++++++++++ 3 files changed, 54 insertions(+) diff --git a/Parser/MParser.cs b/Parser/MParser.cs index 6650842..2521a32 100644 --- a/Parser/MParser.cs +++ b/Parser/MParser.cs @@ -347,6 +347,21 @@ namespace Parser var operation = Factory.Token(EatToken()); expression = Factory.UnaryPostfixOperationExpression(expression, operation); break; + case TokenKind.UnquotedStringLiteral: + if (expression is IdentifierNameNode idNameNode) + { + var arguments = new List(); + while (CurrentToken.Kind == TokenKind.UnquotedStringLiteral) + { + arguments.Add(Factory.UnquotedStringLiteral(EatToken())); + } + + return Factory.CommandExpression(idNameNode, arguments); + } + else + { + throw new ParsingException($"Unexpected token \"{CurrentToken.PureToken.LiteralText}\" during parsing expression \"{expression.FullText}\" at {CurrentToken.PureToken.Position}."); + } default: return expression; } diff --git a/Parser/SyntaxFactory.cs b/Parser/SyntaxFactory.cs index ea65f14..c494a05 100644 --- a/Parser/SyntaxFactory.cs +++ b/Parser/SyntaxFactory.cs @@ -256,6 +256,12 @@ namespace Parser return new DoubleQuotedStringLiteralNode(stringLiteral); } + public UnquotedStringLiteralNode UnquotedStringLiteral( + Token stringLiteral) + { + return new UnquotedStringLiteralNode(stringLiteral); + } + public ExpressionStatementNode ExpressionStatement(ExpressionNode expression) { var children = new List {expression}; @@ -648,5 +654,22 @@ namespace Parser SetParent(result); return result; } + + public CommandExpressionNode CommandExpression( + IdentifierNameNode identifierName, + List arguments) + { + var children = new List + { + identifierName + }; + children.AddRange(arguments); + var result = new CommandExpressionNode( + children, + identifierName, + arguments); + SetParent(result); + return result; + } } } \ No newline at end of file diff --git a/Parser/SyntaxNode.cs b/Parser/SyntaxNode.cs index 1a3810c..1be5789 100644 --- a/Parser/SyntaxNode.cs +++ b/Parser/SyntaxNode.cs @@ -704,4 +704,20 @@ namespace Parser EndKeyword = endKeyword; } } + + public class CommandExpressionNode : ExpressionNode + { + public IdentifierNameNode CommandName { get; } + public List Arguments { get; } + + public CommandExpressionNode( + List children, + IdentifierNameNode commandName, + List arguments + ) : base(children) + { + CommandName = commandName; + Arguments = arguments; + } + } } \ No newline at end of file