public LeftToRight_RightMost_Zero(GrammarRules grammarRules, LRType lrType, Preprocessor preprocessor)
 {
     _grammarRules      = grammarRules;
     _lrType            = lrType;
     _preprocessor      = preprocessor;
     MapperToNumber     = new MapperToNumber(_grammarRules);
     FiniteStateMachine = new FiniteStateMachine(_grammarRules, _preprocessor, lrType == LRType.ClR_One);
     Nodes = new Stack <TreeNode>();
 }
Exemple #2
0
        private void tabLR_0_Enter(object sender, EventArgs e)
        {
            dataGridReportLR.Rows.Clear();
            dgvLR_0.Rows.Clear();
            dgvLR_0.Columns.Clear();

            if (_preprocessor == null)
            {
                TabPreprocess_Enter(null, null);
                if (_preprocessor == null)
                {
                    return;
                }
            }

            LRType lrType = (LRType)cmbGrammarType.SelectedIndex;

            _lrZero = new LeftToRight_RightMost_Zero(_grammarRules, lrType, _preprocessor);
            RestartStopWatch();
            txtLRStates.Text = _lrZero.CalculateStateMachine();
            var grammarTable = _lrZero.FillTable();

            _stopwatch.Stop();
            var tableAndStateMachine = _stopwatch.ElapsedMilliseconds;

            foreach (var keyValuePair in _lrZero.MapperToNumber.MapTerminalToNumber)
            {
                dgvLR_0.Columns.Add(keyValuePair.Key, keyValuePair.Key);
            }
            foreach (var keyValuePair in _lrZero.MapperToNumber.MapVariableToNumber.Skip(1))
            {
                dgvLR_0.Columns.Add(keyValuePair.Key, keyValuePair.Key);
            }
            foreach (var keyValue in _lrZero.FiniteStateMachine.States)
            {
                dgvLR_0.Rows.Add(new DataGridViewRow()
                {
                    HeaderCell = { Value = keyValue.StateId },
                });
            }

            bool valid = true;

            foreach (var state in _lrZero.FiniteStateMachine.States)
            {
                for (int j = 0; j < _lrZero.MapperToNumber.TerminalCount; j++)
                {
                    var parserAction = grammarTable.ActionTable[state.StateId, j];
                    if (parserAction == null)
                    {
                        continue;
                    }
                    dgvLR_0.Rows[state.StateId].Cells[j].Value           = parserAction;
                    dgvLR_0.Rows[state.StateId].Cells[j].Style.BackColor = !parserAction.HasError? Color.LightGreen: Color.Orange;
                    if (parserAction.HasError)
                    {
                        valid = false;
                    }
                }

                int terminalCount = _lrZero.MapperToNumber.TerminalCount;
                for (int j = 0; j < _lrZero.MapperToNumber.VariableCount; j++)
                {
                    if (grammarTable.GoToTable[state.StateId, j] == null)
                    {
                        continue;
                    }
                    dgvLR_0.Rows[state.StateId].Cells[j + terminalCount - 1].Value           = grammarTable.GoToTable[state.StateId, j].StateId;
                    dgvLR_0.Rows[state.StateId].Cells[j + terminalCount - 1].Style.BackColor = Color.LightGreen;
                }
            }
            Progress <ParseReportModel> progress = new Progress <ParseReportModel>();

            progress.ProgressChanged += (o, m) =>
            {
                dataGridReportLR.Rows.Add(m.Stack, m.InputString, m.Output);
            };

            long stackTime = 0;

            if (valid)
            {
                var terminals = GetTerminals();
                if (terminals == null)
                {
                    MessageBox.Show("Terminal is empty!");
                    return;
                }
                RestartStopWatch();
                _lrZero.Parse(terminals, progress);
                _stopwatch.Stop();
                stackTime = _stopwatch.ElapsedMilliseconds;
            }
            lblTime.Text = $"Creating LR Table took {tableAndStateMachine} ms. Stack Calculation took {stackTime} ms.";
        }
 public LRGrammarTable(FiniteStateMachine fsm, MapperToNumber mapperToNumber, LRType lrType)
 {
     _fsm            = fsm;
     _mapperToNumber = mapperToNumber;
     _lrType         = lrType;
 }