private TokenEvaluatorResult EvaluateFunctionDeclaration(string text, string[] splittedText, EvaluatorArgument evaluatorArgument)
        {
            var identifierArrayPattern = string.Format("^{0}$", IdentifierArrayPattern);
            var isAsync    = false;
            var identifier = splittedText[3];
            var arguments  = splittedText[4].Split(',');
            var i          = 0;

            if (text.StartsWith("ASYNC FUNCTION ") || text.StartsWith("FONCTION ASYNC "))
            {
                isAsync    = true;
                identifier = splittedText[4];
                arguments  = splittedText[5].Split(',');
            }

            arguments = arguments.Where(arg => !string.IsNullOrWhiteSpace(arg)).ToArray();

            var parameters = new AlgorithmParameterDeclaration[arguments.Length];

            while (i < arguments.Length)
            {
                var argument = arguments[i].Trim(' ');

                if (argument.Contains(" "))
                {
                    throw new SyntaxErrorException(evaluatorArgument, "Cannot resolve this symbol.");
                }
                if (!Regex.IsMatch(argument, identifierArrayPattern))
                {
                    throw new SyntaxErrorException(evaluatorArgument, "Cannot resolve this symbol.");
                }

                var isArray = argument.EndsWith("[]");
                argument = argument.Replace("[]", string.Empty);

                parameters[i] = new AlgorithmParameterDeclaration(argument, isArray);

                i++;
            }

            _inMethod = true;

            if (identifier.ToLower() == "main")
            {
                if (isAsync)
                {
                    throw new SyntaxErrorException(evaluatorArgument, "The entry point method cannot be asynchronous.");
                }
                if (parameters.Length > 0)
                {
                    throw new SyntaxErrorException(evaluatorArgument, "The entry point method cannot take any argument.");
                }

                return(new TokenEvaluatorResult(SyntaxTreeTokenType.BeginMethod, TokenType.StatementSeparator, new AlgorithmEntryPointMethod()));
            }

            if (identifier == ClassConstructorName)
            {
                if (isAsync)
                {
                    throw new SyntaxErrorException(evaluatorArgument, "A model constructor cannot be asynchronous.");
                }

                return(new TokenEvaluatorResult(SyntaxTreeTokenType.BeginMethod, TokenType.StatementSeparator, new AlgorithmClassConstructorDeclaration(parameters)));
            }

            return(new TokenEvaluatorResult(SyntaxTreeTokenType.BeginMethod, TokenType.StatementSeparator, new AlgorithmClassMethodDeclaration(identifier, isAsync, parameters)));
        }
 internal SyntaxErrorException(EvaluatorArgument evaluatorArgument, string message)
     : this(evaluatorArgument.DocumentName, evaluatorArgument.LineNumber, evaluatorArgument.LinePosition, message)
 {
 }
        private TokenEvaluatorResult EvaluateVariableDeclaration(string text, string[] splittedText, EvaluatorArgument evaluatorArgument)
        {
            var variableName = splittedText[2];
            var isArray      = variableName.EndsWith("[]");

            variableName = variableName.Replace("[]", string.Empty);

            // TODO : block
            if (!_inMethod && _inClass)
            {
                var propertyDeclaration = new AlgorithmClassPropertyDeclaration(variableName, isArray);
                if (isArray)
                {
                    propertyDeclaration.DefaultValue = new AlgorithmPrimitiveExpression(new List <object>());
                }
                return(new TokenEvaluatorResult(SyntaxTreeTokenType.PropertyDeclaration, TokenType.StatementSeparator, propertyDeclaration));
            }
            if (_inMethod || _inProgram)
            {
                var variableDeclaration = new AlgorithmVariableDeclaration(variableName, isArray);
                if (isArray)
                {
                    variableDeclaration.DefaultValue = new AlgorithmPrimitiveExpression(new List <object>());
                }
                return(new TokenEvaluatorResult(SyntaxTreeTokenType.VariableDeclaration, TokenType.StatementSeparator, variableDeclaration));
            }
            throw new ValidationException();
        }
 private TokenEvaluatorResult EvaluateAdditionOperator(string text, string[] splittedText, EvaluatorArgument evaluatorArgument)
 {
     return(null);
 }
        private TokenEvaluatorResult EvaluateEndBlock(string text, string[] splittedText, EvaluatorArgument evaluatorArgument)
        {
            var currentToken = SyntaxTreeTokenType.Unknow;
            var keyword      = splittedText[2];

            switch (keyword)
            {
            case "FUNCTION":
            case "FONCTION":
                _inMethod    = false;
                currentToken = SyntaxTreeTokenType.EndMethod;
                break;

            case "MODEL":
            case "MODELE":
                _inClass          = false;
                _currentClassName = string.Empty;
                currentToken      = SyntaxTreeTokenType.EndClass;
                break;

            case "PROGRAM":
            case "PROGRAMME":
                _inProgram   = false;
                currentToken = SyntaxTreeTokenType.EndProgram;
                break;
            }
            return(new TokenEvaluatorResult(currentToken, TokenType.StatementSeparator));
        }
        private TokenEvaluatorResult EvaluateStartBlock(string text, string[] splittedText, EvaluatorArgument evaluatorArgument)
        {
            AlgorithmObject     algorithmObject;
            SyntaxTreeTokenType currentToken;
            var keyword = splittedText[2];

            switch (keyword)
            {
            case "MODEL":
            case "MODELE":
                _inClass          = true;
                _currentClassName = splittedText[3];
                currentToken      = SyntaxTreeTokenType.BeginClass;
                algorithmObject   = new AlgorithmClassDeclaration(_currentClassName);
                break;

            case "PROGRAM":
            case "PROGRAMME":
                _inProgram      = true;
                currentToken    = SyntaxTreeTokenType.BeginProgram;
                algorithmObject = new AlgorithmProgram(splittedText[3]);
                break;

            default:
                if (text.StartsWith("ASYNC FUNCTION ") || text.StartsWith("FONCTION ASYNC ") || text.StartsWith("FUNCTION ") || text.StartsWith("FONCTION "))
                {
                    return(EvaluateFunctionDeclaration(text, splittedText, evaluatorArgument));
                }
                throw new SyntaxErrorException(evaluatorArgument, "Cannot resolve this symbol.");
            }
            return(new TokenEvaluatorResult(currentToken, TokenType.StatementSeparator, algorithmObject));
        }
Exemple #7
0
 private TokenEvaluatorResult EvaluateEndBlock(string text, string[] splittedText, EvaluatorArgument evaluatorArgument)
 {
     return(null);
 }