public void ComputeFollowSet() { bool FoundLambda = false; NonTerminal lhs = Prod[0].lhs as NonTerminal; ((IList)lhs.Follow).Add(TokenLookup.TokenKind.EOI); do { FollowSetChanged = false; foreach (Production pp in Prod) { for (int j = 0; j < pp.rhs.Count; j++) { FoundLambda = ComputeFirstSetHelper(pp, j); if (FoundLambda) { NonTerminal nt = pp.rhs[j] as NonTerminal; if (nt == null) { continue; } foreach (TokenLookup.TokenKind tok in ((NonTerminal)pp.lhs).Follow) { if (!((IList)nt.Follow).Contains(tok)) { ((IList)nt.Follow).Add(tok); } } } } } } while (FollowSetChanged); }
public bool ComputeProductionFirstSet(Production pp) { int k = 0; bool Continue = false; k = 0; NonTerminal lhs = pp.lhs as NonTerminal; do { Continue = false; NonTerminal nt = pp.rhs[k] as NonTerminal; if (nt != null) { foreach (TokenLookup.TokenKind tok in nt.First) { if (tok != TokenLookup.TokenKind.Lambda) { Production p = (Production)M[(int)lhs.Category, (int)tok]; if (p != null && p.prodno != pp.prodno) { MessageBox.Show("duplicate table entry productions : " + p.prodno + " and " + pp.prodno + " category " + lhs.Category + " token " + tok); } else { M[(int)lhs.Category, (int)tok] = pp; } } else { Continue = true; } } } else { Terminal t = pp.rhs[k] as Terminal; if (t.Token != TokenLookup.TokenKind.Lambda) { Production p = (Production)M[(int)lhs.Category, (int)t.Token]; if (p != null && p.prodno != pp.prodno) { MessageBox.Show("duplicate table entry productions : " + p.prodno + " and " + pp.prodno + " category " + lhs.Category + " token " + t.Token); } else { M[(int)lhs.Category, (int)t.Token] = pp; } } else { Continue = true; } } k = k + 1; } while (Continue && k <= pp.rhs.Count - 1); return(Continue); }
public bool ComputeFirstSetHelper(Production pp, int index) { int k = 0; bool Continue = false; NonTerminal lhs = null; if (index == pp.rhs.Count - 1) { return(true); } lhs = pp.rhs[index] as NonTerminal; if (lhs == null) { return(false); } k = index + 1; do { Continue = false; NonTerminal nt = pp.rhs[k] as NonTerminal; if (nt != null) { foreach (TokenLookup.TokenKind tok in nt.First) { if (tok != TokenLookup.TokenKind.Lambda && !((IList)lhs.Follow).Contains(tok)) { ((IList)lhs.Follow).Add(tok); lhs.Follow.HasChanged = true; } if (tok == TokenLookup.TokenKind.Lambda) { Continue = true; } } } else { Terminal t = pp.rhs[k] as Terminal; if (t.Token != TokenLookup.TokenKind.Lambda && !((IList)lhs.Follow).Contains(t.Token)) { ((IList)lhs.Follow).Add(t.Token); lhs.Follow.HasChanged = true; } if (t.Token == TokenLookup.TokenKind.Lambda) { Continue = true; } } k = k + 1; } while (Continue && k <= pp.rhs.Count - 1); return(Continue); }
public NonTerminal FindNTermByName(string name) { NonTerminal nt = null; nt = (NonTerminal)HashNTerm[name]; if (nt == null) { MessageBox.Show(" NonTerminal " + name + " does not exist"); return(null); } return(nt); }
private Production FindLambdaProduction(NonTerminal lhs) { foreach (Production pp in Prod) { Terminal t = pp.rhs[0] as Terminal; if (t == null) { continue; } if (pp.lhs == lhs && t.Token == TokenLookup.TokenKind.Lambda) { return(pp); } } return(null); }
/// <summary> /// 预测分析表 /// </summary> public void FillTable() { bool FoundLambda = false; Production lpp = null; M = (Production[, ]) new Production[NTerm.Count, Term.Count]; foreach (Production pp in Prod) { FoundLambda = ComputeProductionFirstSet(pp); if (FoundLambda) { NonTerminal lhs = pp.lhs as NonTerminal; lpp = FindLambdaProduction(lhs); if (lpp == null) { continue; } foreach (TokenLookup.TokenKind tok in lhs.Follow) { if (tok == TokenLookup.TokenKind.UnKnown) { continue; } Production p = (Production)M[(int)lhs.Category, (int)tok]; // first set has precedence if (p == null) { M[(int)lhs.Category, (int)tok] = lpp; // MessageBox.Show("duplicate table entry productions : " + p.prodno + " and " + pp.prodno + // " category " + lhs.Category + " token " + tok); } //else } } } }
public void ComputeFirstSet() { int k = 0; bool FoundLambda = false; bool Continue = true; NonTerminal lhs = null; foreach (Terminal term in Term) { ((IList)term.First).Add(term.Token); } do { FirstSetChanged = false; foreach (Production pp in Prod) { k = 0; Continue = true; while (Continue && k <= pp.rhs.Count - 1) { NonTerminal nt = pp.rhs[k] as NonTerminal; if (nt != null) { FoundLambda = false; foreach (TokenLookup.TokenKind tok in nt.First) { lhs = pp.lhs as NonTerminal; if (tok != TokenLookup.TokenKind.Lambda && !((IList)lhs.First).Contains(tok)) { ((IList)lhs.First).Add(tok); lhs.First.HasChanged = true; } if (tok == TokenLookup.TokenKind.Lambda) { FoundLambda = true; } } Continue = FoundLambda; } else { FoundLambda = false; Terminal t = pp.rhs[k] as Terminal; lhs = pp.lhs as NonTerminal; if (t.Token != TokenLookup.TokenKind.Lambda && !((IList)lhs.First).Contains(t.Token)) { ((IList)lhs.First).Add(t.Token); lhs.First.HasChanged = true; } if (t.Token == TokenLookup.TokenKind.Lambda) { FoundLambda = true; } Continue = FoundLambda; } k = k + 1; } if (Continue && !((IList)lhs.First).Contains(TokenLookup.TokenKind.Lambda)) { ((IList)lhs.First).Add(TokenLookup.TokenKind.Lambda); lhs.First.HasChanged = true; } } } while (FirstSetChanged); }