private void Grammar_MenuItem_Click( object sender, EventArgs e ) { if( this.parser.IsParsing ) return; //TODO: ask user? using( var dlg = new GrammarForm() ) { dlg.Text = "Nyelvtan szerkesztő"; dlg.Grammar = this.ext_grammar != null ? this.ext_grammar.RestrictedGrammar.BaseGrammar : null; if( dlg.ShowDialog(this) == System.Windows.Forms.DialogResult.OK ) { try { var grammar = dlg.Grammar; var rst_grammar = new RestrictedStartSymbolGrammar(grammar); this.ext_grammar = new ExtendedGrammar(rst_grammar); this.canonical_sets = SyntacticAnalysis.LR.LR0CanonicalSets.Build(rst_grammar); this.epsilon_grammaticals = EpsilonGrammaticals.Build(grammar); this.follow_sets = FollowSets.Build(this.ext_grammar, this.epsilon_grammaticals); this.parser_table = SyntacticAnalysis.LR.SLR1ParserTableBuilder.Build( this.ext_grammar, this.canonical_sets, this.follow_sets); } catch( Exception ex ) { MessageBox.Show(this, ex.Message, "A Nyelvtant nem tudom használni", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); this.ext_grammar = null; this.canonical_sets = null; this.epsilon_grammaticals = null; this.follow_sets = null; this.parser_table = null; } // Update controls if( this.ext_grammar != null ) { this.ParserStart_ToolButton.Enabled = true; this.ParserView.ClearInputHistory(); this.ParserTable.SetTable(this.ext_grammar, this.parser_table); this.DfsmView.SetCanonicalSets(this.ext_grammar.RestrictedGrammar.BaseGrammar, this.canonical_sets); this.DfsmView.Invalidate(); this.SyntacticTreeView.ClearNodes(); } else { this.ParserStart_ToolButton.Enabled = false; } } } }
public void SetCanonicalSets( SyntacticAnalysis.Grammar grammar, SyntacticAnalysis.LR.LR0CanonicalSets canonical_sets ) { this.grammar = grammar; this.canonical_sets = canonical_sets; this.marked_nodes.Clear(); this.marked_edges.Clear(); this.RebuildGraph(); this.FlagUpdate(true); }