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