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()); } })); }