protected void GenerateAllFirstSets() { bool bChanged = true; while (bChanged) { bChanged = false; for (int i = 0; i < m_Rules.Count; i++) { MyArrayList FirstSet = new MyArrayList(); BNFRule bnfRl = (BNFRule)m_Rules[i]; RuleStart strt = bnfRl.GetStart(); if (strt != null) { RuleElement re = strt.GetNext(); FirstSet = BetaTotalRuleFirstSet(re); } int FrstSize = 0; if (strt.GetRuleConnect().FirstSet != null) { FrstSize = strt.GetRuleConnect().FirstSet.Count; } strt.GetRuleConnect().FirstSet = ParseHelper.UnionSet(strt.GetRuleConnect().FirstSet, FirstSet); FrstSize = strt.GetRuleConnect().FirstSet.Count - FrstSize; if (FrstSize != 0) { bChanged = true; } } } }
private bool FirstClosureFromRule(MyArrayList Huelle, string Token, MyArrayList FirstSet) { bool bChanged = false; MyArrayList TkRules = base.GetStartRulesOneToken(Token); if (TkRules != null && Huelle != null) { for (int i = 0; i < TkRules.Count; i++) { RuleStart rs = (RuleStart)TkRules[i]; int RuleNr = rs.GetRuleConnect().Index; int HuelPos = RuleInsideHuelle(Huelle, RuleNr, 1); if (HuelPos < 0) { LR1Element LrElm = new LR1Element(rs.GetRuleConnect().Index, m_HuellenCounter, m_LRMECnter++); LrElm.FirstSet = FirstSet; Huelle.Add(LrElm); bChanged = true; } else { LR1Element LrElm = (LR1Element)Huelle[HuelPos]; int FrstSize = LrElm.FirstSet.Count; LrElm.FirstSet = ParseHelper.UnionSet(LrElm.FirstSet, FirstSet); if (FrstSize != LrElm.FirstSet.Count) { bChanged = true; } } } } return(bChanged); }
protected void CheckEpsilonInRules() { bool bChanged = true; while (bChanged) { bChanged = false; for (int i = 0; i < m_Rules.Count; i++) { bool EpsFree = false; BNFRule bnfRl = (BNFRule)m_Rules[i]; RuleStart strt = bnfRl.GetStart(); if (strt != null) { RuleElement re = strt.GetNext(); EpsFree = BetaTotalRuleEpsFree(re); } if (strt.GetRuleConnect().EpsilonFree != EpsFree) { bChanged = true; } strt.GetRuleConnect().EpsilonFree = EpsFree; } } }
private MyArrayList GenerateFollowList(MyArrayList NonTerms) { MyArrayList Follows = new MyArrayList(); for (int i = 0; i < NonTerms.Count; i++) { RuleElement re = (RuleElement)NonTerms[i]; RuleStart rs = re.GetBegin(); BNFRule rl = rs.GetRuleConnect(); RuleElement nextRe = re.GetNext(); if (nextRe == null) { Follows = ParseHelper.UnionSet(Follows, rl.FollowSet); } else { if (nextRe.IsTerminal()) { Follows.Add(nextRe); } else { RuleToken rt = (RuleToken)nextRe; MyArrayList AllFirstSet = BetaTotalRuleFirstSet(rt); Follows = ParseHelper.UnionSet(Follows, AllFirstSet); if (!BetaTotalRuleEpsFree(rt)) { Follows = ParseHelper.UnionSet(Follows, rl.FollowSet); } } } } return(Follows); }
protected virtual bool GenerateParseTable() { MyArrayList Terminals = GetAllTerminals(); Terminals.Add(new RuleTerminal(m_EofTerminal, null)); MyArrayList StartTokens = GetDifStartTokens(); m_LL1ParseTabelle = new TopDownParseTabelle(Terminals, StartTokens); bool dblEntry = false; for (int i = 0; i < m_Rules.Count; i++) { BNFRule rl = (BNFRule)m_Rules[i]; RuleStart rs = rl.GetStart(); int len = rs.GetRuleConnect().FirstSet.Count; for (int j = 0; j < len; j++) { RuleElement re = (RuleElement)rs.GetRuleConnect().FirstSet[j]; string colSign = re.GetToken(); string rowSign = rs.GetToken(); if (!m_LL1ParseTabelle.Add(colSign, rowSign, rs)) { dblEntry = true; } } if (!rl.EpsilonFree) { len = rs.GetRuleConnect().FollowSet.Count; for (int j = 0; j < len; j++) { RuleElement re = (RuleElement)rs.GetRuleConnect().FollowSet[j]; string colSign = re.GetToken(); string rowSign = rs.GetToken(); if (!m_LL1ParseTabelle.Add(colSign, rowSign, rs)) { dblEntry = true; } } } } return(!dblEntry); }
protected virtual bool RuleIsEpsilonFree(RuleStart rs) { RuleElement re = null; if (rs != null) { re = rs.GetNext(); } else { return(false); } while (re != null) { if (re.IsTerminal()) { rs.GetRuleConnect().EpsilonFree = true; return(true); } else { if (re.GetToken().Equals("")) { rs.GetRuleConnect().EpsilonFree = false; return(false); } else { RuleToken rt = (RuleToken)re; bool res = RuleIsEpsilonFree(rt.GetConnected()); if (res) { rs.GetRuleConnect().EpsilonFree = res; return(res); } else { re = re.GetNext(); } } } } rs.GetRuleConnect().EpsilonFree = false; return(false); }
private MyArrayList TotalRuleFollowSet(RuleStart rs) { MyArrayList res = new MyArrayList(); rs = GoToFirstStartRule(rs); while (rs != null) { res = ParseHelper.UnionSet(res, rs.GetRuleConnect().FollowSet); rs = rs.GetAlternate(); } return(res); }
private bool FirstClosureFromRule(MyArrayList Huelle, string Token) { bool bChanged = false; MyArrayList TkRules = base.GetStartRulesOneToken(Token); if (TkRules != null && Huelle != null) { for (int i = 0; i < TkRules.Count; i++) { RuleStart rs = (RuleStart)TkRules[i]; int RuleNr = rs.GetRuleConnect().Index; if (!IsRuleInsideHuelle(Huelle, RuleNr, 1)) { LRElement LrElm = new LRElement(rs.GetRuleConnect().Index, m_HuellenCounter, m_LRMECnter++); Huelle.Add(LrElm); bChanged = true; } } } return(bChanged); }
private bool SetAllFollows(RuleStart rs, MyArrayList Follows) { bool changed = false; rs = GoToFirstStartRule(rs); while (rs != null) { int FlwSize = 0; if (rs.GetRuleConnect().FollowSet != null) { FlwSize = rs.GetRuleConnect().FollowSet.Count; } rs.GetRuleConnect().FollowSet = ParseHelper.UnionSet(rs.GetRuleConnect().FollowSet, Follows); FlwSize = rs.GetRuleConnect().FollowSet.Count - FlwSize; if (FlwSize != 0) { changed = true; } rs = rs.GetAlternate(); } return(changed); }
// protected virtual void GenerateAllFirstSets() // { // for(int i=0;i<m_Rules.Count;i++) // { // BNFRule bnfRl = (BNFRule)m_Rules[i]; // RuleStart strt = bnfRl.GetStart(); // strt.GetRuleConnect().FirstSet = GenerateFirstSet(strt); // } // } // protected virtual void CheckEpsilonInRules() // { // for(int i=0;i<m_Rules.Count;i++) // { // BNFRule bnfRl = (BNFRule)m_Rules[i]; // RuleStart strt = bnfRl.GetStart(); // RuleIsEpsilonFree(strt); // } // } protected bool TotalRuleEpsFree(RuleStart rs) { rs = GoToFirstStartRule(rs); while (rs != null) { if (!rs.GetRuleConnect().EpsilonFree) { return(false); } rs = rs.GetAlternate(); } return(true); }
private void DeleteStartRule(RuleStart rs) { BNFRule bnfRl = rs.GetRuleConnect(); RuleStart AltNext = rs.GetAlternate(); RuleStart AltBack = rs.GetAlternateBack(); if (AltBack != null) { AltBack.SetAlternate(AltNext); } if (AltNext != null) { AltNext.SetAlternateBack(AltBack); } int index = bnfRl.Index; m_Rules.RemoveAt(index); }