static EmptyGrammar() { BaseGrammar = Grammar.EmptyGrammar; RestrictedGrammar = new RestrictedStartSymbolGrammar(BaseGrammar); ExtendedGrammar = new ExtendedGrammar(RestrictedGrammar); EpsilonGrammaticals = new HashSet<GrammaticalSymbol>(); EpsilonGrammaticals.Add(BaseGrammar.StartSymbol); FirstSets = new Dictionary<GrammaticalSymbol, ISet<TerminalSymbol>>(); // S: #,Eps FirstSets[BaseGrammar.StartSymbol] = new HashSet<TerminalSymbol>( new TerminalSymbol[] { ExtendedGrammar.EndOfSourceSymbol, EpsilonSymbol.Instance }); FollowSets = new Dictionary<GrammaticalSymbol, ISet<TerminalSymbol>>(); // S: - FollowSets[BaseGrammar.StartSymbol] = new HashSet<TerminalSymbol>(); LR0CanonicalSets = new Syntan.SyntacticAnalysis.LR.LR0CanonicalSets(); LR0CanonicalSets.Add(new HashSet<Syntan.SyntacticAnalysis.LR.LR0Item>( new Syntan.SyntacticAnalysis.LR.LR0Item[] { new Syntan.SyntacticAnalysis.LR.LR0Item(BaseGrammar.Rules[0], 0) })); // SLR1ParserTable SLR1ParserTable = new Syntan.SyntacticAnalysis.LR.ParserTable(1, 1, 1); SLR1ParserTable.SetAction(0, 0, Syntan.SyntacticAnalysis.LR.ParserTable.Action.Accept()); }
/// <summary> /// Creates a new instance from the given <paramref name="base_grammar"/>. /// </summary> /// <param name="base_grammar">This grammar will extend on this grammar.</param> public RestrictedStartSymbolGrammar( Grammar base_grammar ) { if( base_grammar == null ) throw new ArgumentNullException("base_grammar"); this.base_gr = base_grammar; this.Initialize(); }
static Grammar() { var start_sym = new GrammaticalSymbol("S"); EmptyGrammar = new Grammar( new TerminalSymbol[0], new GrammaticalSymbol[] { start_sym }, new Rule[] { new Rule(start_sym, new Symbol[0]) }, 0); }
static Grammar1() { var terminals = new TerminalSymbol[] { new TerminalSymbol("a"), }; var grammaticals = new GrammaticalSymbol[] { new GrammaticalSymbol("S"), }; var rules = new Rule[] { // S->aS new Rule( grammaticals[0], new Symbol[] { terminals[0], grammaticals[0], }), // S-> new Rule( grammaticals[0], new Symbol[0]), }; BaseGrammar = new Grammar(terminals, grammaticals, rules, 0); RestrictedGrammar = new RestrictedStartSymbolGrammar(BaseGrammar); ExtendedGrammar = new ExtendedGrammar(RestrictedGrammar); EpsilonGrammaticals = new HashSet<GrammaticalSymbol>(RestrictedGrammar.Grammaticals); FirstSets = new Dictionary<GrammaticalSymbol, ISet<TerminalSymbol>>(); // S': a,Eps FirstSets[ExtendedGrammar.StartSymbol] = new HashSet<TerminalSymbol>(BaseGrammar.Terminals); FirstSets[ExtendedGrammar.StartSymbol].Add(EpsilonSymbol.Instance); // S: a,Eps FirstSets[BaseGrammar.StartSymbol] = new HashSet<TerminalSymbol>(BaseGrammar.Terminals); FirstSets[BaseGrammar.StartSymbol].Add(EpsilonSymbol.Instance); FollowSets = new Dictionary<GrammaticalSymbol, ISet<TerminalSymbol>>(); // S': FollowSets[ExtendedGrammar.Grammaticals[0]] = new HashSet<TerminalSymbol>(); // S: # FollowSets[ExtendedGrammar.Grammaticals[1]] = new HashSet<TerminalSymbol>(); FollowSets[ExtendedGrammar.Grammaticals[1]].Add(ExtendedGrammar.EndOfSourceSymbol); }
static Grammar3() { var terminals = new TerminalSymbol[] { new TerminalSymbol("a"), new TerminalSymbol("b"), }; var grammaticals = new GrammaticalSymbol[] { new GrammaticalSymbol("S"), new GrammaticalSymbol("A"), new GrammaticalSymbol("B"), }; var rules = new Rule[] { // S->AB new Rule( grammaticals[0], new Symbol[] { grammaticals[1], grammaticals[2], }), // S->aSbS new Rule( grammaticals[1], new Symbol[] { terminals[0], grammaticals[0], terminals[1], grammaticals[0], }), // A-> new Rule( grammaticals[1], new Symbol[0]), // B-> new Rule( grammaticals[2], new Symbol[0]), }; BaseGrammar = new Grammar(terminals, grammaticals, rules, 0); RestrictedGrammar = new RestrictedStartSymbolGrammar(BaseGrammar); ExtendedGrammar = new ExtendedGrammar(RestrictedGrammar); EpsilonGrammaticals = new HashSet<GrammaticalSymbol>(ExtendedGrammar.Grammaticals); FollowSets = new Dictionary<GrammaticalSymbol, ISet<TerminalSymbol>>(); // S': - FollowSets[ExtendedGrammar.StartSymbol] = new HashSet<TerminalSymbol>(); // S: b,# FollowSets[ExtendedGrammar.Grammaticals[1]] = new HashSet<TerminalSymbol>( new TerminalSymbol[]{ ExtendedGrammar.Terminals[1], ExtendedGrammar.EndOfSourceSymbol, }); // A: b,# FollowSets[ExtendedGrammar.Grammaticals[2]] = FollowSets[ExtendedGrammar.Grammaticals[1]]; // B: b,# FollowSets[ExtendedGrammar.Grammaticals[3]] = FollowSets[ExtendedGrammar.Grammaticals[1]]; }
private void LoadGrammar( Grammar grammar ) { this.terminals.Clear(); this.grammaticals.Clear(); this.rules.Clear(); try { // Check symbol names foreach( var tr in grammar.Terminals ) if( tr.Name.Length != 1 ) throw new ArgumentException(string.Format("Terminal's name '{0}' is not simple.", tr.Name)); foreach( var gr in grammar.Grammaticals ) if( gr.Name.Length != 1 && gr.Name != "S'" ) throw new ArgumentException(string.Format("Grammatical's name '{0}' is not simple.", gr.Name)); foreach( var rule in grammar.Rules ) { var rule_rep = new RuleStrRep(); rule_rep.Lhs = rule.LeftHandSide.Name; if( this.grammaticals.ContainsKey(rule.LeftHandSide.Name) ) this.grammaticals[rule.LeftHandSide.Name] += 1; else this.grammaticals[rule.LeftHandSide.Name] = 1; foreach( var symbol in rule.RightHandSide ) { rule_rep.Rhs.Add(symbol.Name); if( symbol is GrammaticalSymbol ) { if( this.grammaticals.ContainsKey(symbol.Name) ) this.grammaticals[symbol.Name] += 1; else this.grammaticals[symbol.Name] = 1; } else { if( this.terminals.ContainsKey(symbol.Name) ) this.terminals[symbol.Name] += 1; else this.terminals[symbol.Name] = 1; } } this.rules.Add(rule_rep); } } finally { // Update gui this.UpdateRulesList(); this.UpdateGrammaticals(); this.UpdateTerminals(); } }
static Grammar2() { var terminals = new TerminalSymbol[] { new TerminalSymbol("+"), new TerminalSymbol("*"), new TerminalSymbol("("), new TerminalSymbol(")"), new TerminalSymbol("i"), }; var grammaticals = new GrammaticalSymbol[] { new GrammaticalSymbol("S"), new GrammaticalSymbol("E"), new GrammaticalSymbol("E'"), new GrammaticalSymbol("T"), new GrammaticalSymbol("T'"), new GrammaticalSymbol("F"), }; var rules = new Rule[] { // S->E new Rule( grammaticals[0], new Symbol[] { grammaticals[1], }), // E->TE' new Rule( grammaticals[1], new Symbol[] { grammaticals[3], grammaticals[2], }), // E'->+TE' new Rule( grammaticals[2], new Symbol[] { terminals[0], grammaticals[3], grammaticals[2], }), // E'-> new Rule( grammaticals[2], new Symbol[] { }), // T->FT' new Rule( grammaticals[3], new Symbol[] { grammaticals[5], grammaticals[4], }), // T'->*FT' new Rule( grammaticals[4], new Symbol[] { terminals[1], grammaticals[5], grammaticals[4], }), // T'-> new Rule( grammaticals[4], new Symbol[] { }), // F->(E) new Rule( grammaticals[5], new Symbol[] { terminals[2], grammaticals[1], terminals[3], }), // F->i new Rule( grammaticals[5], new Symbol[] { terminals[4], }), }; BaseGrammar = new Grammar(terminals, grammaticals, rules, 0); RestrictedGrammar = new RestrictedStartSymbolGrammar(BaseGrammar); ExtendedGrammar = new ExtendedGrammar(RestrictedGrammar); EpsilonGrammaticals = new HashSet<GrammaticalSymbol>( new GrammaticalSymbol[] { grammaticals[2], grammaticals[4] }); FirstSets = new Dictionary<GrammaticalSymbol, ISet<TerminalSymbol>>(); // S: (,i FirstSets[BaseGrammar.Grammaticals[0]] = new HashSet<TerminalSymbol>(new TerminalSymbol[] { BaseGrammar.Terminals[2], BaseGrammar.Terminals[4], }); // E: (,i FirstSets[BaseGrammar.Grammaticals[1]] = new HashSet<TerminalSymbol>(new TerminalSymbol[] { BaseGrammar.Terminals[2], BaseGrammar.Terminals[4], }); // E': +,Eps FirstSets[BaseGrammar.Grammaticals[2]] = new HashSet<TerminalSymbol>(new TerminalSymbol[] { BaseGrammar.Terminals[0], EpsilonSymbol.Instance, }); // T: (,i FirstSets[BaseGrammar.Grammaticals[3]] = new HashSet<TerminalSymbol>(new TerminalSymbol[] { BaseGrammar.Terminals[2], BaseGrammar.Terminals[4], }); // T': *,Eps FirstSets[BaseGrammar.Grammaticals[4]] = new HashSet<TerminalSymbol>(new TerminalSymbol[] { BaseGrammar.Terminals[1], EpsilonSymbol.Instance, }); // F: (,i FirstSets[BaseGrammar.Grammaticals[5]] = new HashSet<TerminalSymbol>(new TerminalSymbol[] { BaseGrammar.Terminals[2], BaseGrammar.Terminals[4], }); FollowSets = new Dictionary<GrammaticalSymbol, ISet<TerminalSymbol>>(); // S: FollowSets[ExtendedGrammar.Grammaticals[0]] = new HashSet<TerminalSymbol>(); // E: ),EoS FollowSets[ExtendedGrammar.Grammaticals[1]] = new HashSet<TerminalSymbol>(new TerminalSymbol[] { ExtendedGrammar.Terminals[3], ExtendedGrammar.Terminals[5], }); // E': ),EoS FollowSets[ExtendedGrammar.Grammaticals[2]] = new HashSet<TerminalSymbol>(new TerminalSymbol[] { ExtendedGrammar.Terminals[3], ExtendedGrammar.Terminals[5], }); // T: +,),EoS FollowSets[ExtendedGrammar.Grammaticals[3]] = new HashSet<TerminalSymbol>(new TerminalSymbol[] { ExtendedGrammar.Terminals[0], ExtendedGrammar.Terminals[3], ExtendedGrammar.Terminals[5], }); // T': +,),EoS FollowSets[ExtendedGrammar.Grammaticals[4]] = new HashSet<TerminalSymbol>(new TerminalSymbol[] { ExtendedGrammar.Terminals[0], ExtendedGrammar.Terminals[3], ExtendedGrammar.Terminals[5], }); // F: +,*,),EoS FollowSets[ExtendedGrammar.Grammaticals[5]] = new HashSet<TerminalSymbol>(new TerminalSymbol[] { ExtendedGrammar.Terminals[0], ExtendedGrammar.Terminals[1], ExtendedGrammar.Terminals[3], ExtendedGrammar.Terminals[5], }); //TODO: Use real fixture!! LR0CanonicalSets = LR0CanonicalSets.Build(RestrictedGrammar); //TODO: Use real fixtures!! SLR1ParserTable = SLR1ParserTableBuilder.Build(ExtendedGrammar, LR0CanonicalSets, FollowSets); }
RestrictedStartSymbolGrammar( SerializationInfo info, StreamingContext context ) { this.base_gr = (Grammar)info.GetValue("BaseGrammar", typeof(Grammar)); this.Initialize(); }