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; } } }
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; } } } }
/// <summary> /// Find all Tokens inside Rule /// </summary> /// <param name="Token">Token String to find</param> /// <returns></returns> public MyArrayList FindToken(string Token) { MyArrayList sr = new MyArrayList(); if (Start != null) { RuleElement pos = Start.GetNext(); while (pos != null) { if (pos.GetToken().Equals(Token)) { sr.Add(pos); } pos = pos.GetNext(); } } return(sr); }
protected virtual MyArrayList GenerateFirstSet(RuleStart rs) { MyArrayList res = new MyArrayList(); RuleElement re = null; if (rs != null) { re = rs.GetNext(); } else { return(null); } while (re != null) { if (re.GetToken().Equals("")) { re = re.GetNext(); } else { if (re.IsTerminal()) { res.Add(re); return(res); } else { RuleToken rt = (RuleToken)re; RuleStart conStr = GoToFirstStartRule(rt.GetConnected()); MyArrayList res2 = null; while (conStr != null) { res2 = GenerateFirstSet(conStr); res = ParseHelper.UnionSet(res, res2); conStr = conStr.GetAlternate(); } if (TotalRuleEpsFree(rt.GetConnected())) { return(res); } else { re = re.GetNext(); } } } } return(res); }
private void EleminateDirectLeftRecursion(RuleStart strt) { string ElemStartTkn = ""; if (strt != null) { ElemStartTkn = FindUnusedToken(strt.GetToken()); } while (strt != null) { if (IsRuleLeftRekursiv(strt)) { RuleElement re = strt.GetNext(); if (re != null) { strt.SetNext(re.GetNext()); re = GotoLastRule(strt); re.SetNext(new RuleToken(ElemStartTkn, strt)); strt.SetToken(ElemStartTkn); } BNFRule bnfRl = new BNFRule(m_Rules.Count); bnfRl.SetStart(ElemStartTkn); bnfRl.GetStart().SetNext(new RuleEpsilon(bnfRl.GetStart())); m_Rules.Add(bnfRl); } else { RuleElement re = strt.GetNext(); if (re != null) { re = GotoLastRule(strt); re.SetNext(new RuleToken(ElemStartTkn, strt)); } } strt = strt.GetAlternate(); } }
private string[] Rule2String(RuleStart rs) { MyArrayList elements = new MyArrayList(); if (rs != null) { RuleElement re = rs.GetNext(); while (re != null) { elements.Add(re.GetToken()); re = re.GetNext(); } } return((string[])elements.ToArray(typeof(string))); }
private bool IsRuleLeftRekursiv(RuleStart rs) { RuleElement re = rs.GetNext(); if (re != null) { string StartToken = rs.GetToken(); string FirstToken = re.GetToken(); if (StartToken.Equals(FirstToken)) { return(true); } } return(false); }
private MyArrayList Rules2Array(RuleStart rs) { MyArrayList invRules = new MyArrayList(); if (rs != null) { RuleElement re = rs.GetNext(); while (re != null) { invRules.Add(re); re = re.GetNext(); } } return(invRules); }
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); }