Beispiel #1
0
        /// <summary>
        /// 启动编译
        /// </summary>
        private async void RunAsync()
        {
            StateSBI.Content = "编译中...";
            if (parserAdapter == null)
            {
                parserAdapter = new ParserAdapter();
            }
            var result = await parserAdapter.Compile(CodeBox.Text,
                                                     Path.RULE_PATH,
                                                     Path.CFG_PATH);

            FirstTableDataGrid.ItemsSource  = result.First;
            FollowTableDataGrid.ItemsSource = result.Follow;
            ASTView.ItemsSource             = new List <Node>()
            {
                result.Root
            };
            ArithResultDataGrid.ItemsSource = result.ArithResult;
            ErrorDataGrid.ItemsSource       = result.Errors;
            CodeBox.popup.ClearTokens();
            foreach (var id in result.IDs)
            {
                int index = CodeBox.popup.tokens.BinarySearch(id);
                if (index < 0)
                {
                    CodeBox.popup.tokens.Insert(~index, id);
                }
            }
            CodeBox.popup.RefreshList();

            var pairDecoration = new CodeBoxControl.Decorations.PairDecoration()
            {
                DecorationType = CodeBoxControl.Decorations.EDecorationType.Underline,
                Brush          = new SolidColorBrush(Color.FromArgb(255, 255, 0, 0)),
            };

            foreach (var error in result.Errors)
            {
                int offset = CodeBox.GetCharacterIndexFromLineIndex(error.Row - 1) + error.Col - 1;
                pairDecoration.Pairs.Add(new CodeBoxControl.Pair(offset, error.WordLength));
            }
            CodeBox.Decorations.Clear();
            CodeBox.Decorations.Add(pairDecoration);
            CodeBox.InvalidateVisual();

            StateSBI.Content = "就绪";
        }