Пример #1
0
        public Task ParseAsync(IReadOnlyList <CodeDocument> codes, IReadOnlyList <object> windows)
        {
            return(Task.Run(() =>
            {
                AlgorithmProgram = null;
                Error = null;

                _syntaxTreeBuilder = new SyntaxTreeBuilder();
                try
                {
                    foreach (var code in codes)
                    {
                        _languageParser.Reset();
                        _syntaxTreeBuilder.Reset();
                        _lexer.Initialize(code.DocumentName, code.Code);

                        var nextExpectedToken = TokenType.Unknow;
                        var previousLineNumber = 1;
                        var previousLinePosition = 0;

                        while (_lexer.Next())
                        {
                            if (nextExpectedToken != TokenType.Unknow && _lexer.CurrentTokenDefinition.Token != nextExpectedToken)
                            {
                                throw new SyntaxErrorException(code.DocumentName, _lexer.CurrentLineNumber, _lexer.CurrentLinePosition, $"A {nextExpectedToken.GetDescription()} is expected.");
                            }

                            nextExpectedToken = TokenType.Unknow;
                            if (_lexer.CurrentTokenDefinition.Evaluator != null)
                            {
                                var evaluatorResult = _lexer.CurrentTokenDefinition.Evaluator(_lexer.CurrentTokenContents, _lexer.CurrentSplittedTokenContents, new EvaluatorArgument(code.DocumentName, previousLineNumber, previousLinePosition));
                                if (evaluatorResult != null)
                                {
                                    nextExpectedToken = evaluatorResult.NextExpectedToken;
                                    _syntaxTreeBuilder.BuildSyntaxTree(new SyntaxTreeBuilderArgument(code.DocumentName, previousLineNumber, previousLinePosition, evaluatorResult));
                                }
                            }
                            previousLineNumber = _lexer.CurrentLineNumber;
                            previousLinePosition = _lexer.CurrentLinePosition;
                        }
                    }
                    AlgorithmProgram = _syntaxTreeBuilder.AlgorithmProgram;
                }
                catch (SyntaxErrorException syntaxErrorException)
                {
                    AlgorithmProgram = null;
                    Error = syntaxErrorException;
                }

                _syntaxTreeBuilder.Dispose();
                _syntaxTreeBuilder = null;

                if (ParsingCompleted != null)
                {
                    ParsingCompleted(this, new EventArgs());
                }
            }));
        }