public string DecorateRule(ail.net.parser.GrammarRule xi_rule) { ail.net.framework.Assert.NonNullReference(xi_rule, "xi_rule"); StringBuilder result = new StringBuilder(); foreach (ail.net.parser.GrammarSymbol symbol in xi_rule.Lhs) { result.Append(symbol.Name); } result.Append(@" : "); foreach (ail.net.parser.GrammarSymbol symbol in xi_rule.Rhs) { if (symbol.IsTerminal()) { result.Append(@"'"); } result.Append(symbol.Name); if (symbol.IsTerminal()) { result.Append(@"'"); } result.Append(@" "); } return(result.ToString()); }
public override void Populate() { base.Populate(); StartSymbolId = (int)ail.net.test.SssToken.EType.eS; // S -> S + S ail.net.parser.GrammarRule rule = AddRule((int)ail.net.test.SssGrammar.EGrammar.eSSS); rule.AddLhsSymbol((int)ail.net.test.SssToken.EType.eS, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "S"); rule.AddRhsSymbol((int)ail.net.test.SssToken.EType.eS, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "S"); rule.AddRhsSymbol((int)ail.net.test.SssToken.EType.ePlus, ail.net.parser.GrammarSymbol.EType.eTerminal, "+"); rule.AddRhsSymbol((int)ail.net.test.SssToken.EType.eS, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "S"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // S -> S rule = AddRule((int)ail.net.test.SssGrammar.EGrammar.eSS); rule.AddLhsSymbol((int)ail.net.test.SssToken.EType.eS, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "S"); rule.AddRhsSymbol((int)ail.net.test.SssToken.EType.eS, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "S"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // S -> n rule = AddRule((int)ail.net.test.SssGrammar.EGrammar.eSn); rule.AddLhsSymbol((int)ail.net.test.SssToken.EType.eS, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "S"); rule.AddRhsSymbol((int)ail.net.test.SssToken.EType.eN, ail.net.parser.GrammarSymbol.EType.eTerminal, "n"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); BuildNullabilitySet(); Console.WriteLine(ail.net.parser.GrammarPool.Instance.DecoratePool()); }
private void PopulatePredictTable() { ail.net.framework.Assert.Condition(Grammar.Rules.Count > 0, "ail.net.parser.EarleyParser.PopulatePredictTable: Grammar.Rules.Count > 0"); PredictTableAttr = new Hashtable(); foreach (ail.net.parser.GrammarSymbol symbol in GrammarPool.Instance.Pool.Values) { if (symbol.IsNonTerminal()) { ArrayList list = new ArrayList(); PredictTable[symbol.Id] = list; for (int i = 0; i < CoreItemTable.Count; i++) { ail.net.parser.GrammarRule rule = ((ail.net.parser.EarleyParser.CoreItem)CoreItemTable[i]).Rule; ail.net.parser.GrammarSymbol l_symbol = (ail.net.parser.GrammarSymbol)rule.Lhs[0]; int dot = ((ail.net.parser.EarleyParser.CoreItem)CoreItemTable[i]).Dot; if (l_symbol.Id == symbol.Id && dot == 0) { list.Add(CoreItemTable[i]); } } } } PredictedNonTerminalsAttr = new bool[Lexer.Token.GetTokenSize()]; PredictedNonTerminalsZeroizerAttr = new bool[Lexer.Token.GetTokenSize()]; }
public override void Populate() { base.Populate(); StartSymbolId = (int)ail.net.test.AhoToken.EType.eE; // E -> T + E ail.net.parser.GrammarRule rule = AddRule((int)ail.net.test.AhoGrammar.EGrammar.eETE); rule.AddLhsSymbol((int)ail.net.test.AhoToken.EType.eE, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "E"); rule.AddRhsSymbol((int)ail.net.test.AhoToken.EType.eT, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "T"); rule.AddRhsSymbol((int)ail.net.test.AhoToken.EType.ePlus, ail.net.parser.GrammarSymbol.EType.eTerminal, "+"); rule.AddRhsSymbol((int)ail.net.test.AhoToken.EType.eE, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "E"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // E -> T rule = AddRule((int)ail.net.test.AhoGrammar.EGrammar.eET); rule.AddLhsSymbol((int)ail.net.test.AhoToken.EType.eE, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "E"); rule.AddRhsSymbol((int)ail.net.test.AhoToken.EType.eT, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "T"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // T -> F * T rule = AddRule((int)ail.net.test.AhoGrammar.EGrammar.eTFT); rule.AddLhsSymbol((int)ail.net.test.AhoToken.EType.eT, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "T"); rule.AddRhsSymbol((int)ail.net.test.AhoToken.EType.eF, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "F"); rule.AddRhsSymbol((int)ail.net.test.AhoToken.EType.eMult, ail.net.parser.GrammarSymbol.EType.eTerminal, "*"); rule.AddRhsSymbol((int)ail.net.test.AhoToken.EType.eT, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "T"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // T -> F rule = AddRule((int)ail.net.test.AhoGrammar.EGrammar.eTF); rule.AddLhsSymbol((int)ail.net.test.AhoToken.EType.eT, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "T"); rule.AddRhsSymbol((int)ail.net.test.AhoToken.EType.eF, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "F"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // F -> ( E ) rule = AddRule((int)ail.net.test.AhoGrammar.EGrammar.eFE); rule.AddLhsSymbol((int)ail.net.test.AhoToken.EType.eF, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "F"); rule.AddRhsSymbol((int)ail.net.test.AhoToken.EType.eLeftParens, ail.net.parser.GrammarSymbol.EType.eTerminal, "("); rule.AddRhsSymbol((int)ail.net.test.AhoToken.EType.eE, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "E"); rule.AddRhsSymbol((int)ail.net.test.AhoToken.EType.eRightParens, ail.net.parser.GrammarSymbol.EType.eTerminal, ")"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // F -> a rule = AddRule((int)ail.net.test.AhoGrammar.EGrammar.eFa); rule.AddLhsSymbol((int)ail.net.test.AhoToken.EType.eF, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "F"); rule.AddRhsSymbol((int)ail.net.test.AhoToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eTerminal, "a"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); BuildNullabilitySet(); Console.WriteLine(ail.net.parser.GrammarPool.Instance.DecoratePool()); }
public override void Populate() { base.Populate(); StartSymbolId = (int)ail.net.test.SAaBbLR1eToken.EType.eS0; // S' -> S ail.net.parser.GrammarRule rule = AddRule((int)ail.net.test.SAaBbLR1eGrammar.EGrammar.eS0_S); rule.AddLhsSymbol((int)ail.net.test.SAaBbLR1eToken.EType.eS0, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "S'"); rule.AddRhsSymbol((int)ail.net.test.SAaBbLR1eToken.EType.eS, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "S"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // S -> A a A b rule = AddRule((int)ail.net.test.SAaBbLR1eGrammar.EGrammar.eS_AaAb); rule.AddLhsSymbol((int)ail.net.test.SAaBbLR1eToken.EType.eS, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "S"); rule.AddRhsSymbol((int)ail.net.test.SAaBbLR1eToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); rule.AddRhsSymbol((int)ail.net.test.SAaBbLR1eToken.EType.ea, ail.net.parser.GrammarSymbol.EType.eTerminal, "a"); rule.AddRhsSymbol((int)ail.net.test.SAaBbLR1eToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); rule.AddRhsSymbol((int)ail.net.test.SAaBbLR1eToken.EType.eb, ail.net.parser.GrammarSymbol.EType.eTerminal, "b"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // S -> B b B a rule = AddRule((int)ail.net.test.SAaBbLR1eGrammar.EGrammar.eS_BbBa); rule.AddLhsSymbol((int)ail.net.test.SAaBbLR1eToken.EType.eS, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "S"); rule.AddRhsSymbol((int)ail.net.test.SAaBbLR1eToken.EType.eB, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "B"); rule.AddRhsSymbol((int)ail.net.test.SAaBbLR1eToken.EType.eb, ail.net.parser.GrammarSymbol.EType.eTerminal, "b"); rule.AddRhsSymbol((int)ail.net.test.SAaBbLR1eToken.EType.eB, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "B"); rule.AddRhsSymbol((int)ail.net.test.SAaBbLR1eToken.EType.ea, ail.net.parser.GrammarSymbol.EType.eTerminal, "a"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // A -> e(psilon) rule = AddRule((int)ail.net.test.SAaBbLR1eGrammar.EGrammar.eA_e); rule.AddLhsSymbol((int)ail.net.test.SAaBbLR1eToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); rule.AddRhsSymbol((int)ail.net.test.EpsToken.EType.eEpsilon, ail.net.parser.GrammarSymbol.EType.eTerminal, ail.net.parser.GrammarSymbol.kEpsilon); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // B -> e(psilon) rule = AddRule((int)ail.net.test.SAaBbLR1eGrammar.EGrammar.eB_e); rule.AddLhsSymbol((int)ail.net.test.SAaBbLR1eToken.EType.eB, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "B"); rule.AddRhsSymbol((int)ail.net.test.EpsToken.EType.eEpsilon, ail.net.parser.GrammarSymbol.EType.eTerminal, ail.net.parser.GrammarSymbol.kEpsilon); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); BuildNullabilitySet(); BuildFirstSet(); BuildFollowSet(); Console.WriteLine(ail.net.parser.GrammarPool.Instance.DecoratePool()); }
public override void Populate() { base.Populate(); StartSymbolId = (int)ail.net.test.AhoLR1conflictsToken.EType.eE; // E0 -> E ail.net.parser.GrammarRule rule = AddRule((int)ail.net.test.AhoLR1conflictsGrammar.EGrammar.eE0_E); rule.AddLhsSymbol((int)ail.net.test.AhoLR1conflictsToken.EType.eE0, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "E'"); rule.AddRhsSymbol((int)ail.net.test.AhoLR1conflictsToken.EType.eE, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "E"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // E -> E + E rule = AddRule((int)ail.net.test.AhoLR1conflictsGrammar.EGrammar.eE_EpE); rule.AddLhsSymbol((int)ail.net.test.AhoLR1conflictsToken.EType.eE, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "E"); rule.AddRhsSymbol((int)ail.net.test.AhoLR1conflictsToken.EType.eE, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "E"); rule.AddRhsSymbol((int)ail.net.test.AhoLR1conflictsToken.EType.ePlus, ail.net.parser.GrammarSymbol.EType.eTerminal, "+"); rule.AddRhsSymbol((int)ail.net.test.AhoLR1conflictsToken.EType.eE, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "E"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // E -> E * E rule = AddRule((int)ail.net.test.AhoLR1conflictsGrammar.EGrammar.eE_EmE); rule.AddLhsSymbol((int)ail.net.test.AhoLR1conflictsToken.EType.eE, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "E"); rule.AddRhsSymbol((int)ail.net.test.AhoLR1conflictsToken.EType.eE, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "E"); rule.AddRhsSymbol((int)ail.net.test.AhoLR1conflictsToken.EType.eMult, ail.net.parser.GrammarSymbol.EType.eTerminal, "*"); rule.AddRhsSymbol((int)ail.net.test.AhoLR1conflictsToken.EType.eE, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "E"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // E -> ( E ) rule = AddRule((int)ail.net.test.AhoLR1conflictsGrammar.EGrammar.eE_lEr); rule.AddLhsSymbol((int)ail.net.test.AhoLR1conflictsToken.EType.eE, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "E"); rule.AddRhsSymbol((int)ail.net.test.AhoLR1conflictsToken.EType.eLeftParens, ail.net.parser.GrammarSymbol.EType.eTerminal, "("); rule.AddRhsSymbol((int)ail.net.test.AhoLR1conflictsToken.EType.eE, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "E"); rule.AddRhsSymbol((int)ail.net.test.AhoLR1conflictsToken.EType.eRightParens, ail.net.parser.GrammarSymbol.EType.eTerminal, ")"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // E -> a rule = AddRule((int)ail.net.test.AhoLR1conflictsGrammar.EGrammar.eE_a); rule.AddLhsSymbol((int)ail.net.test.AhoLR1conflictsToken.EType.eE, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "E"); rule.AddRhsSymbol((int)ail.net.test.AhoLR1conflictsToken.EType.ea, ail.net.parser.GrammarSymbol.EType.eTerminal, "a"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); BuildNullabilitySet(); BuildFirstSet(); Console.WriteLine(ail.net.parser.GrammarPool.Instance.DecoratePool()); }
public override void Populate() { base.Populate(); StartSymbolId = (int)ail.net.test.KarpovLR1eToken.EType.eS0; // S' -> # S # $ ail.net.parser.GrammarRule rule = AddRule((int)ail.net.test.KarpovLR1eGrammar.EGrammar.eS0_sSs); rule.AddLhsSymbol((int)ail.net.test.KarpovLR1eToken.EType.eS0, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "S'"); rule.AddRhsSymbol((int)ail.net.test.KarpovLR1eToken.EType.es, ail.net.parser.GrammarSymbol.EType.eTerminal, "#"); rule.AddRhsSymbol((int)ail.net.test.KarpovLR1eToken.EType.eS, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "S"); rule.AddRhsSymbol((int)ail.net.test.KarpovLR1eToken.EType.es, ail.net.parser.GrammarSymbol.EType.eTerminal, "#"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // S -> a S c rule = AddRule((int)ail.net.test.KarpovLR1eGrammar.EGrammar.eS_aSc); rule.AddLhsSymbol((int)ail.net.test.KarpovLR1eToken.EType.eS, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "S"); rule.AddRhsSymbol((int)ail.net.test.KarpovLR1eToken.EType.ea, ail.net.parser.GrammarSymbol.EType.eTerminal, "a"); rule.AddRhsSymbol((int)ail.net.test.KarpovLR1eToken.EType.eS, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "S"); rule.AddRhsSymbol((int)ail.net.test.KarpovLR1eToken.EType.ec, ail.net.parser.GrammarSymbol.EType.eTerminal, "c"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // S -> e(psilon) rule = AddRule((int)ail.net.test.AhoLR1eGrammar.EGrammar.eS_e); rule.AddLhsSymbol((int)ail.net.test.AhoLR1eToken.EType.eS, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "S"); rule.AddRhsSymbol((int)ail.net.test.EpsToken.EType.eEpsilon, ail.net.parser.GrammarSymbol.EType.eTerminal, ail.net.parser.GrammarSymbol.kEpsilon); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); BuildNullabilitySet(); // BuildFirstSet(); // BuildFollowSet(); BuildFirstKSet(1); BuildFollowKSet(1); Console.WriteLine("Pool:\n" + ail.net.parser.GrammarPool.Instance.DecoratePool()); string firstset = DecorateFirstKSet(); string effset = DecorateEFFirstKSet(); Console.WriteLine(); Console.WriteLine(Decorate()); Console.WriteLine(); Console.WriteLine("First set: \n" + firstset); Console.WriteLine(); Console.WriteLine(); Console.WriteLine("EFF set: \n" + effset); }
public override void Populate() { base.Populate(); StartSymbolId = (int)ail.net.test.AycToken.EType.eS0; // S0 -> S ail.net.parser.GrammarRule rule = AddRule((int)ail.net.test.AycGrammar.EGrammar.eS0_S); rule.AddLhsSymbol((int)ail.net.test.AycToken.EType.eS0, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "S0"); rule.AddRhsSymbol((int)ail.net.test.AycToken.EType.eS, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "S"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // S -> A A A A rule = AddRule((int)ail.net.test.AycGrammar.EGrammar.eS_AAAA); rule.AddLhsSymbol((int)ail.net.test.AycToken.EType.eS, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "S"); rule.AddRhsSymbol((int)ail.net.test.AycToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); rule.AddRhsSymbol((int)ail.net.test.AycToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); rule.AddRhsSymbol((int)ail.net.test.AycToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); rule.AddRhsSymbol((int)ail.net.test.AycToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // A -> a rule = AddRule((int)ail.net.test.AycGrammar.EGrammar.eA_a); rule.AddLhsSymbol((int)ail.net.test.AycToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); rule.AddRhsSymbol((int)ail.net.test.AycToken.EType.ea, ail.net.parser.GrammarSymbol.EType.eTerminal, "a"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // A -> E rule = AddRule((int)ail.net.test.AycGrammar.EGrammar.eA_E); rule.AddLhsSymbol((int)ail.net.test.AycToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); rule.AddRhsSymbol((int)ail.net.test.AycToken.EType.eE, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "E"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // E -> e(psilon) rule = AddRule((int)ail.net.test.AycGrammar.EGrammar.eE_e); rule.AddLhsSymbol((int)ail.net.test.AycToken.EType.eE, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "E"); rule.AddRhsSymbol((int)ail.net.test.EpsToken.EType.eEpsilon, ail.net.parser.GrammarSymbol.EType.eTerminal, ail.net.parser.GrammarSymbol.kEpsilon); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); BuildNullabilitySet(); Console.WriteLine(ail.net.parser.GrammarPool.Instance.DecoratePool()); }
public ail.net.parser.GrammarRule AddRule(int xi_id) { ail.net.parser.GrammarRule result = null; if (!RulesAttr.Contains(xi_id)) { result = new ail.net.parser.GrammarRule(xi_id); RulesAttr.Add(result); if (StartRuleAttr == null) { StartRuleAttr = result; } } ail.net.framework.Assert.NonNullReference(result, "result"); return(result); }
public override void Populate() { base.Populate(); StartSymbolId = (int)ail.net.test.AhoLR1Token.EType.eS0; // S' -> S ail.net.parser.GrammarRule rule = AddRule((int)ail.net.test.AhoLR1Grammar.EGrammar.eS0_S); rule.AddLhsSymbol((int)ail.net.test.AhoLR1Token.EType.eS0, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "S'"); rule.AddRhsSymbol((int)ail.net.test.AhoLR1Token.EType.eS, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "S"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // S -> C C rule = AddRule((int)ail.net.test.AhoLR1Grammar.EGrammar.eS_CC); rule.AddLhsSymbol((int)ail.net.test.AhoLR1Token.EType.eS, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "S"); rule.AddRhsSymbol((int)ail.net.test.AhoLR1Token.EType.eC, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "C"); rule.AddRhsSymbol((int)ail.net.test.AhoLR1Token.EType.eC, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "C"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // C -> c C rule = AddRule((int)ail.net.test.AhoLR1Grammar.EGrammar.eC_cC); rule.AddLhsSymbol((int)ail.net.test.AhoLR1Token.EType.eC, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "C"); rule.AddRhsSymbol((int)ail.net.test.AhoLR1Token.EType.ec, ail.net.parser.GrammarSymbol.EType.eTerminal, "c"); rule.AddRhsSymbol((int)ail.net.test.AhoLR1Token.EType.eC, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "C"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // C -> d rule = AddRule((int)ail.net.test.AhoLR1Grammar.EGrammar.eC_d); rule.AddLhsSymbol((int)ail.net.test.AhoLR1Token.EType.eC, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "C"); rule.AddRhsSymbol((int)ail.net.test.AhoLR1Token.EType.ed, ail.net.parser.GrammarSymbol.EType.eTerminal, "d"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); BuildNullabilitySet(); BuildFirstSet(); BuildFollowSet(); Console.WriteLine(ail.net.parser.GrammarPool.Instance.DecoratePool()); }
public override void Populate() { base.Populate(); StartSymbolId = (int)ail.net.test.GlrAlwaysBrokenToken.EType.eS; // S -> b A ail.net.parser.GrammarRule rule = AddRule((int)ail.net.test.GlrAlwaysBrokenGrammar.EGrammar.eS_bA); rule.AddLhsSymbol((int)ail.net.test.GlrAlwaysBrokenToken.EType.eS, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "S"); rule.AddRhsSymbol((int)ail.net.test.GlrAlwaysBrokenToken.EType.eb, ail.net.parser.GrammarSymbol.EType.eTerminal, "b"); rule.AddRhsSymbol((int)ail.net.test.GlrAlwaysBrokenToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // A -> a A B rule = AddRule((int)ail.net.test.GlrAlwaysBrokenGrammar.EGrammar.eA_aAB); rule.AddLhsSymbol((int)ail.net.test.GlrAlwaysBrokenToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); rule.AddRhsSymbol((int)ail.net.test.GlrAlwaysBrokenToken.EType.ea, ail.net.parser.GrammarSymbol.EType.eTerminal, "a"); rule.AddRhsSymbol((int)ail.net.test.GlrAlwaysBrokenToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); rule.AddRhsSymbol((int)ail.net.test.GlrAlwaysBrokenToken.EType.eB, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "B"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // A -> e(psilon) rule = AddRule((int)ail.net.test.GlrAlwaysBrokenGrammar.EGrammar.eA_e); rule.AddLhsSymbol((int)ail.net.test.GlrAlwaysBrokenToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); rule.AddRhsSymbol((int)ail.net.test.EpsToken.EType.eEpsilon, ail.net.parser.GrammarSymbol.EType.eTerminal, ail.net.parser.GrammarSymbol.kEpsilon); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // B -> e(psilon) rule = AddRule((int)ail.net.test.GlrAlwaysBrokenGrammar.EGrammar.eB_e); rule.AddLhsSymbol((int)ail.net.test.GlrAlwaysBrokenToken.EType.eB, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "B"); rule.AddRhsSymbol((int)ail.net.test.EpsToken.EType.eEpsilon, ail.net.parser.GrammarSymbol.EType.eTerminal, ail.net.parser.GrammarSymbol.kEpsilon); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); BuildNullabilitySet(); Console.WriteLine(ail.net.parser.GrammarPool.Instance.DecoratePool()); }
public override void Populate() { base.Populate(); StartSymbolId = (int)ail.net.test.EpsToken.EType.eA; // A -> a A a ail.net.parser.GrammarRule rule = AddRule((int)ail.net.test.EpsGrammar.EGrammar.eAaAa); rule.AddLhsSymbol((int)ail.net.test.EpsToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); rule.AddRhsSymbol((int)ail.net.test.EpsToken.EType.ea, ail.net.parser.GrammarSymbol.EType.eTerminal, "a"); rule.AddRhsSymbol((int)ail.net.test.EpsToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); rule.AddRhsSymbol((int)ail.net.test.EpsToken.EType.ea, ail.net.parser.GrammarSymbol.EType.eTerminal, "a"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // A -> L rule = AddRule((int)ail.net.test.EpsGrammar.EGrammar.eAL); rule.AddLhsSymbol((int)ail.net.test.EpsToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); rule.AddRhsSymbol((int)ail.net.test.EpsToken.EType.eL, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "L"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // L -> a rule = AddRule((int)ail.net.test.EpsGrammar.EGrammar.eLa); rule.AddLhsSymbol((int)ail.net.test.EpsToken.EType.eL, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "L"); rule.AddRhsSymbol((int)ail.net.test.EpsToken.EType.ea, ail.net.parser.GrammarSymbol.EType.eTerminal, "a"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // L -> e(psilon) rule = AddRule((int)ail.net.test.EpsGrammar.EGrammar.eLe); rule.AddLhsSymbol((int)ail.net.test.EpsToken.EType.eL, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "L"); rule.AddRhsSymbol((int)ail.net.test.EpsToken.EType.eEpsilon, ail.net.parser.GrammarSymbol.EType.eTerminal, ail.net.parser.GrammarSymbol.kEpsilon); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); BuildNullabilitySet(); Console.WriteLine(ail.net.parser.GrammarPool.Instance.DecoratePool()); }
public override void Populate() { base.Populate(); StartSymbolId = (int)ail.net.test.First3KSudkampToken.EType.eS; // S -> A a b d ail.net.parser.GrammarRule rule = AddRule((int)ail.net.test.First3KSudkampGrammar.EGrammar.eS_Aabd); rule.AddLhsSymbol((int)ail.net.test.First3KSudkampToken.EType.eS, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "S"); rule.AddRhsSymbol((int)ail.net.test.First3KSudkampToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); rule.AddRhsSymbol((int)ail.net.test.First3KSudkampToken.EType.ea, ail.net.parser.GrammarSymbol.EType.eTerminal, "a"); rule.AddRhsSymbol((int)ail.net.test.First3KSudkampToken.EType.eb, ail.net.parser.GrammarSymbol.EType.eTerminal, "b"); rule.AddRhsSymbol((int)ail.net.test.First3KSudkampToken.EType.ed, ail.net.parser.GrammarSymbol.EType.eTerminal, "d"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // S -> c A b c d rule = AddRule((int)ail.net.test.First3KSudkampGrammar.EGrammar.eS_cAbcd); rule.AddLhsSymbol((int)ail.net.test.First3KSudkampToken.EType.eS, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "S"); rule.AddRhsSymbol((int)ail.net.test.First3KSudkampToken.EType.ec, ail.net.parser.GrammarSymbol.EType.eTerminal, "c"); rule.AddRhsSymbol((int)ail.net.test.First3KSudkampToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); rule.AddRhsSymbol((int)ail.net.test.First3KSudkampToken.EType.eb, ail.net.parser.GrammarSymbol.EType.eTerminal, "b"); rule.AddRhsSymbol((int)ail.net.test.First3KSudkampToken.EType.ec, ail.net.parser.GrammarSymbol.EType.eTerminal, "c"); rule.AddRhsSymbol((int)ail.net.test.First3KSudkampToken.EType.ed, ail.net.parser.GrammarSymbol.EType.eTerminal, "d"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // A -> a rule = AddRule((int)ail.net.test.First3KSudkampGrammar.EGrammar.eA_a); rule.AddLhsSymbol((int)ail.net.test.First3KSudkampToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); rule.AddRhsSymbol((int)ail.net.test.First3KSudkampToken.EType.ea, ail.net.parser.GrammarSymbol.EType.eTerminal, "a"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // A -> b // A -> e rule = AddRule((int)ail.net.test.First3KSudkampGrammar.EGrammar.eA_b); rule.AddLhsSymbol((int)ail.net.test.First3KSudkampToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); rule.AddRhsSymbol((int)ail.net.test.First3KSudkampToken.EType.eb, ail.net.parser.GrammarSymbol.EType.eTerminal, "b"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // A -> e rule = AddRule((int)ail.net.test.First3KSudkampGrammar.EGrammar.eA_e); rule.AddLhsSymbol((int)ail.net.test.First3KSudkampToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); rule.AddRhsSymbol((int)ail.net.test.EpsToken.EType.eEpsilon, ail.net.parser.GrammarSymbol.EType.eTerminal, ail.net.parser.GrammarSymbol.kEpsilon); BuildNullabilitySet(); Console.WriteLine(ail.net.parser.GrammarPool.Instance.DecoratePool()); Console.WriteLine(Decorate()); ClearFirstSet(); BuildFirstSet(); string firstset = DecorateFirstSet(); Console.WriteLine(firstset); ClearFirstSet(); BuildFirstKSet(1); firstset = DecorateFirstKSet(); Console.WriteLine(firstset); // S: aab; bab; abd; cab; cbb; cbc // A: e; a; b // FIRST: // d: // d // c: // c // b: // b // a: // a // A: // ~e~ a b // S: // a b d a a b b a b c b c c a b c b b // ~$~: // ~$~ // ~e~: // ~e~ // FOLLOW: // A: // a b d b c d // S: // ~e~ ClearFirstSet(); ClearFollowSet(); BuildFirstKSet(3); Console.WriteLine(DecorateFirstKSet()); BuildFollowKSet(3); Console.WriteLine(DecorateFollowKSet()); }
public override void Parse() { base.Init(); LRMode = ail.net.parser.LRParser.ELRMode.eLR1; LRCompareMode = ail.net.parser.LRParser.ELRCompareMode.eWithLookahead; BuildCanonicalSet(); Console.WriteLine(DecorateStates(CanonicalSet)); BuildAutomaton(); Console.WriteLine("States: " + States.Count); Console.WriteLine(); Console.WriteLine(DecorateStates()); SaveLR1Automaton(@"c:\tmp\karpov.lr1.automaton.txt"); if (LoadLR1Automaton(@"c:\tmp\karpov.lr1.automaton.txt")) { Console.WriteLine("States: " + States.Count); Console.WriteLine(); Console.WriteLine(DecorateStates()); } BuildAutomaton(); Console.WriteLine("States: " + States.Count); Console.WriteLine(); Console.WriteLine(DecorateStates()); int reduce_reduce_conflicts; int shift_reduce_conflicts; bool is_lr1_grammar = IsLR1Grammar(out reduce_reduce_conflicts, out shift_reduce_conflicts); if (!is_lr1_grammar) { foreach (string error in Errors) { Console.WriteLine(error); } } if (is_lr1_grammar || reduce_reduce_conflicts == 0) { base.BuildActionTableK1(); base.BuildGoToTable(); Console.WriteLine(DecorateK1Tables()); } // all stack elements are int Stack stack = new Stack(); ail.net.parser.LRParser.TableKey key = new ail.net.parser.LRParser.TableKey(); Lexer.NextLexeme(); // get first lexeme Console.WriteLine(Lexer.DecorateLexeme()); stack.Push(0); // push initial state for (;;) { key.Id = Lexer.Token.Type == (int)ail.net.test.KarpovLR1eToken.EType.eEndOfStream ? // see BuildCanonicalSet/BuildAutomaton the first AddItem (int)ail.net.test.KarpovLR1eToken.EType.eEpsilon : (int)Lexer.Token.Type; key.State = (int)stack.Peek(); Hashtable action_table_entries = (Hashtable)ActionTable[key]; // fetch action table value(s) if (action_table_entries != null && action_table_entries.Count > 0) { ArrayList action_table_entries_flat = new ArrayList(action_table_entries.Values); int action_table_value = (int)action_table_entries_flat[0]; // we have possible conflicts here: // shift/reduce - shift has higher prioriy // reduce/reduce - should be filtered out at earlier stages for (int i = 1; i < action_table_entries_flat.Count; i++) { if ((int)action_table_entries_flat[i] >= 0) { action_table_value = (int)action_table_entries_flat[i]; } } if (action_table_entries_flat.Count > 1) { // report conflicts } if (action_table_value >= 0) { // shift stack.Push(Lexer.Token.Type); stack.Push(action_table_value); Lexer.NextLexeme(); Console.WriteLine(Lexer.DecorateLexeme()); } else { if (Math.Abs(action_table_value) == ail.net.parser.LRParser.kAcceptedCode) { // accept Status = ail.net.parser.Parser.EStatus.eRecognized; break; } else { // reduce ail.net.parser.GrammarRule rule = (ail.net.parser.GrammarRule)Grammar.RulesMap[Math.Abs(action_table_value)]; ail.net.framework.Assert.NonNullReference(rule, "rule"); for (int i = 0, n = 2 * (rule.IsEmptyRule() ? 0 : rule.Rhs.Count); i < n; i++) { stack.Pop(); } action_table_value = (int)stack.Peek(); stack.Push(((ail.net.parser.GrammarSymbol)rule.Lhs[0]).Id); key.Id = ((ail.net.parser.GrammarSymbol)rule.Lhs[0]).Id; key.State = action_table_value; action_table_value = (int)GoToTable[key]; stack.Push(action_table_value); } } } else { // error procedure Console.WriteLine("error!"); break; // HandleError(stack); } } }
public void RemoveRule(ail.net.parser.GrammarRule xi_rule) { ail.net.framework.Assert.NonNullReference(xi_rule, "xi_rule"); ail.net.framework.Assert.Condition(RulesAttr.Contains(xi_rule.Id), "Rules.Contains(xi_rule.Id)"); RulesAttr.Remove(xi_rule.Id); }
public override void Populate() { base.Populate(); StartSymbolId = (int)ail.net.test.FirstFollowLaKToken.EType.eS; // S -> A c c ail.net.parser.GrammarRule rule = AddRule((int)ail.net.test.FirstFollowLaKGrammar.EGrammar.eS_Acc); rule.AddLhsSymbol((int)ail.net.test.FirstFollowLaKToken.EType.eS, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "S"); rule.AddRhsSymbol((int)ail.net.test.FirstFollowLaKToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); rule.AddRhsSymbol((int)ail.net.test.FirstFollowLaKToken.EType.ec, ail.net.parser.GrammarSymbol.EType.eTerminal, "c"); rule.AddRhsSymbol((int)ail.net.test.FirstFollowLaKToken.EType.ec, ail.net.parser.GrammarSymbol.EType.eTerminal, "c"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // A -> b B A rule = AddRule((int)ail.net.test.FirstFollowLaKGrammar.EGrammar.eA_bBA); rule.AddLhsSymbol((int)ail.net.test.FirstFollowLaKToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); rule.AddRhsSymbol((int)ail.net.test.FirstFollowLaKToken.EType.eb, ail.net.parser.GrammarSymbol.EType.eTerminal, "b"); rule.AddRhsSymbol((int)ail.net.test.FirstFollowLaKToken.EType.eB, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "B"); rule.AddRhsSymbol((int)ail.net.test.FirstFollowLaKToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // A -> B c A a rule = AddRule((int)ail.net.test.FirstFollowLaKGrammar.EGrammar.eA_BcAa); rule.AddLhsSymbol((int)ail.net.test.FirstFollowLaKToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); rule.AddRhsSymbol((int)ail.net.test.FirstFollowLaKToken.EType.eB, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "B"); rule.AddRhsSymbol((int)ail.net.test.FirstFollowLaKToken.EType.ec, ail.net.parser.GrammarSymbol.EType.eTerminal, "c"); rule.AddRhsSymbol((int)ail.net.test.FirstFollowLaKToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); rule.AddRhsSymbol((int)ail.net.test.FirstFollowLaKToken.EType.ea, ail.net.parser.GrammarSymbol.EType.eTerminal, "a"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // A -> e rule = AddRule((int)ail.net.test.FirstFollowLaKGrammar.EGrammar.eA_e); rule.AddLhsSymbol((int)ail.net.test.FirstFollowLaKToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); rule.AddRhsSymbol((int)ail.net.test.EpsToken.EType.eEpsilon, ail.net.parser.GrammarSymbol.EType.eTerminal, ail.net.parser.GrammarSymbol.kEpsilon); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // B -> a c B rule = AddRule((int)ail.net.test.FirstFollowLaKGrammar.EGrammar.eB_acB); rule.AddLhsSymbol((int)ail.net.test.FirstFollowLaKToken.EType.eB, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "B"); rule.AddRhsSymbol((int)ail.net.test.FirstFollowLaKToken.EType.ea, ail.net.parser.GrammarSymbol.EType.eTerminal, "a"); rule.AddRhsSymbol((int)ail.net.test.FirstFollowLaKToken.EType.ec, ail.net.parser.GrammarSymbol.EType.eTerminal, "c"); rule.AddRhsSymbol((int)ail.net.test.FirstFollowLaKToken.EType.eB, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "B"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // B -> b rule = AddRule((int)ail.net.test.FirstFollowLaKGrammar.EGrammar.eB_b); rule.AddLhsSymbol((int)ail.net.test.FirstFollowLaKToken.EType.eB, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "B"); rule.AddRhsSymbol((int)ail.net.test.FirstFollowLaKToken.EType.eb, ail.net.parser.GrammarSymbol.EType.eTerminal, "b"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); BuildNullabilitySet(); Console.WriteLine(ail.net.parser.GrammarPool.Instance.DecoratePool()); Console.WriteLine(Decorate()); ClearFirstSet(); BuildFirstSet(); string firstset = DecorateFirstSet(); Console.WriteLine(firstset); ClearFirstSet(); BuildFirstKSet(1); firstset = DecorateFirstKSet(); Console.WriteLine(firstset); // S: cc; ba; bb; ac; bc // A: e; ac; ba; bb; bc // B: ac, b ClearFirstSet(); BuildFirstKSet(2); firstset = DecorateFirstKSet(); Console.WriteLine(firstset); }
public override void Populate() { base.Populate(); StartSymbolId = (int)ail.net.test.FirstKSudkampToken.EType.eS; // S -> A ail.net.parser.GrammarRule rule = AddRule((int)ail.net.test.FirstKSudkampGrammar.EGrammar.eS_A); rule.AddLhsSymbol((int)ail.net.test.FirstKSudkampToken.EType.eS, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "S"); rule.AddRhsSymbol((int)ail.net.test.FirstKSudkampToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // A -> a A d rule = AddRule((int)ail.net.test.FirstKSudkampGrammar.EGrammar.eA_aAd); rule.AddLhsSymbol((int)ail.net.test.FirstKSudkampToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); rule.AddRhsSymbol((int)ail.net.test.FirstKSudkampToken.EType.ea, ail.net.parser.GrammarSymbol.EType.eTerminal, "a"); rule.AddRhsSymbol((int)ail.net.test.FirstKSudkampToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); rule.AddRhsSymbol((int)ail.net.test.FirstKSudkampToken.EType.ed, ail.net.parser.GrammarSymbol.EType.eTerminal, "d"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // A -> B C rule = AddRule((int)ail.net.test.FirstKSudkampGrammar.EGrammar.eA_BC); rule.AddLhsSymbol((int)ail.net.test.FirstKSudkampToken.EType.eA, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "A"); rule.AddRhsSymbol((int)ail.net.test.FirstKSudkampToken.EType.eB, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "B"); rule.AddRhsSymbol((int)ail.net.test.FirstKSudkampToken.EType.eC, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "C"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // B -> b B c rule = AddRule((int)ail.net.test.FirstKSudkampGrammar.EGrammar.eB_bBc); rule.AddLhsSymbol((int)ail.net.test.FirstKSudkampToken.EType.eB, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "B"); rule.AddRhsSymbol((int)ail.net.test.FirstKSudkampToken.EType.eb, ail.net.parser.GrammarSymbol.EType.eTerminal, "b"); rule.AddRhsSymbol((int)ail.net.test.FirstKSudkampToken.EType.eB, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "B"); rule.AddRhsSymbol((int)ail.net.test.FirstKSudkampToken.EType.ec, ail.net.parser.GrammarSymbol.EType.eTerminal, "c"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // B -> e rule = AddRule((int)ail.net.test.FirstKSudkampGrammar.EGrammar.eB_e); rule.AddLhsSymbol((int)ail.net.test.FirstKSudkampToken.EType.eB, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "B"); rule.AddRhsSymbol((int)ail.net.test.EpsToken.EType.eEpsilon, ail.net.parser.GrammarSymbol.EType.eTerminal, ail.net.parser.GrammarSymbol.kEpsilon); // C -> a c C rule = AddRule((int)ail.net.test.FirstKSudkampGrammar.EGrammar.eC_acC); rule.AddLhsSymbol((int)ail.net.test.FirstKSudkampToken.EType.eC, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "C"); rule.AddRhsSymbol((int)ail.net.test.FirstKSudkampToken.EType.ea, ail.net.parser.GrammarSymbol.EType.eTerminal, "a"); rule.AddRhsSymbol((int)ail.net.test.FirstKSudkampToken.EType.ec, ail.net.parser.GrammarSymbol.EType.eTerminal, "c"); rule.AddRhsSymbol((int)ail.net.test.FirstKSudkampToken.EType.eC, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "C"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); // C -> a d rule = AddRule((int)ail.net.test.FirstKSudkampGrammar.EGrammar.eC_ad); rule.AddLhsSymbol((int)ail.net.test.FirstKSudkampToken.EType.eC, ail.net.parser.GrammarSymbol.EType.eNonTerminal, "C"); rule.AddRhsSymbol((int)ail.net.test.FirstKSudkampToken.EType.ea, ail.net.parser.GrammarSymbol.EType.eTerminal, "a"); rule.AddRhsSymbol((int)ail.net.test.FirstKSudkampToken.EType.ed, ail.net.parser.GrammarSymbol.EType.eTerminal, "d"); ail.net.framework.Assert.NonNullReference(rule.Lhs[0], "rule.Lhs[0]"); ail.net.framework.Assert.NonNullReference(rule.Rhs[0], "rule.Rhs[0]"); BuildNullabilitySet(); Console.WriteLine(ail.net.parser.GrammarPool.Instance.DecoratePool()); Console.WriteLine(Decorate()); ClearFirstSet(); BuildFirstSet(); string firstset = DecorateFirstSet(); Console.WriteLine(firstset); ClearFirstSet(); BuildFirstKSet(1); firstset = DecorateFirstKSet(); Console.WriteLine(firstset); // S: ad; bc; aa; ab; bb; ac // A: ad; bc; aa; ab; bb; ac // B: e; bc; bb // C: ad; ac Console.WriteLine(); Console.WriteLine(); Console.WriteLine(); Console.WriteLine(); ClearFirstSet(); // BuildFirstKSet(0); // firstset = DecorateFirstKSet(); Console.WriteLine(firstset); Console.WriteLine(); Console.WriteLine(); Console.WriteLine(); Console.WriteLine(); ClearFirstSet(); BuildFirstKSet(2); firstset = DecorateFirstKSet(); Console.WriteLine(firstset); Console.WriteLine(); Console.WriteLine(); // Console.WriteLine(); Console.WriteLine(); Console.WriteLine(); Console.WriteLine(); ClearFollowSet(); BuildFollowKSet(2); string followset = DecorateFollowKSet(); Console.WriteLine("FOLLOW:"); Console.WriteLine(followset); Console.WriteLine(); Console.WriteLine(); }