internal LRElement(LRElement LreElm, int HlNr, int Nr) { m_Kernel = true; m_RulePos = LreElm.m_RulePos; m_PosInRule = LreElm.m_PosInRule + 1; m_HuellenNr = HlNr; m_Nr = Nr; }
internal LRElement(LRElement lrmElm) { m_Kernel = lrmElm.IsKernel; m_RulePos = lrmElm.RulePos; m_PosInRule = lrmElm.PosInRule; m_HuellenNr = lrmElm.HuellenNr; m_Nr = lrmElm.Number; }
protected int GetHuellenNr(MyArrayList Huelle) { if (Huelle != null && Huelle.Count > 0) { LRElement lrm = (LRElement)Huelle[0]; return(lrm.HuellenNr); } return(-1); }
private RuleElement GetElementFromHuelle(LRElement elm) { RuleElement re = null; if (elm.RulePos < m_Rules.Count) { BNFRule rl = (BNFRule)m_Rules[elm.RulePos]; if (rl != null) { re = rl[elm.PosInRule]; } } return(re); }
private int GetRuleInsideHuelle(MyArrayList Huelle, LRElement lrm) { if (Huelle != null && lrm != null) { for (int i = 0; i < Huelle.Count; i++) { LRElement LrElm = (LRElement)Huelle[i]; if (LrElm != null) { if (LrElm.RulePos == lrm.RulePos && LrElm.PosInRule == lrm.PosInRule) { return(i); } } } } return(-1); }
private RuleElement GetRuleElement(LRElement LrElm, int LookAHead) { RuleElement re = null; if (LrElm != null) { int RulePos = LrElm.RulePos; if (RulePos >= 0 && RulePos < m_Rules.Count) { BNFRule rl = (BNFRule)m_Rules[RulePos]; if (rl != null) { re = rl[LrElm.PosInRule + LookAHead]; } } } return(re); }
private bool IsRuleInsideHuelle(MyArrayList Huelle, int RuleNr, int RuleInPos) { if (Huelle != null) { for (int i = 0; i < Huelle.Count; i++) { LRElement LrElm = (LRElement)Huelle[i]; if (LrElm != null) { if (LrElm.RulePos == RuleNr && LrElm.PosInRule == RuleInPos) { return(true); } } } } return(false); }
protected RuleElement GetRuleElement(LRElement LrElm) { RuleElement re = null; if (LrElm != null) { int RulePos = LrElm.RulePos; if (RulePos >= 0 && RulePos < m_Rules.Count) { BNFRule rl = (BNFRule)m_Rules[RulePos]; if (rl != null) { re = rl[LrElm.PosInRule]; } } } return(re); }
private int RuleInsideAllHuellen(MyArrayList AllHuellen, LRElement LrElm) { if (AllHuellen != null && LrElm != null) { for (int i = 0; i < AllHuellen.Count; i++) { MyArrayList Huelle = (MyArrayList)AllHuellen[i]; if (Huelle != null) { if (IsRuleInsideHuelle(Huelle, LrElm.RulePos, LrElm.PosInRule)) { return(i); } } } } return(-1); }
private bool IsSameClosureWithoutFirst(MyArrayList Closure1, MyArrayList Closure2) { if (Closure1 != null && Closure2 != null) { if (Closure1.Count == Closure2.Count) { for (int i = 0; i < Closure1.Count; i++) { LRElement lrm1 = (LRElement)Closure1[i]; if (GetRuleInsideHuelle(Closure2, lrm1) < 0) { return(false); } } return(true); } } return(false); }
protected virtual bool IsSameClosure(MyArrayList Closure1, MyArrayList Closure2) { if (Closure1 != null && Closure2 != null) { if (Closure1.Count == Closure2.Count) { for (int i = 0; i < Closure1.Count; i++) { LRElement lrm1 = (LRElement)Closure1[i]; if (!IsRuleInsideHuelle(Closure2, lrm1)) { return(false); } } return(true); } } return(false); }
private MyArrayList GetDifProduktionNrsFromClosure(MyArrayList Huelle) { MyArrayList ProdTokens = new MyArrayList(); if (Huelle != null) { for (int i = 0; i < Huelle.Count; i++) { LRElement LrElm = (LRElement)Huelle[i]; RuleElement re = GetRuleElement(LrElm); if (re != null) { if (!IsProdRuleInside(ProdTokens, re)) { ProdTokens.Add(re); } } } } return(ProdTokens); }
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); }
protected virtual MyArrayList GetLrElm(MyArrayList Huelle, string Token) { MyArrayList LreElmLst = new MyArrayList(); if (Huelle != null) { for (int i = 0; i < Huelle.Count; i++) { LRElement LrElm = (LRElement)Huelle[i]; RuleElement re = GetRuleElement(LrElm); if (re != null) { if (re.GetToken().Equals(Token)) { LRElement nextLRElm = new LRElement(LrElm, m_HuellenCounter, m_LRMECnter++); LreElmLst.Add(nextLRElm); } } } } return(LreElmLst); }
protected virtual void Closure(MyArrayList Huelle) { bool bChanged = true; if (Huelle != null) { while (bChanged) { bChanged = false; for (int i = 0; i < Huelle.Count; i++) { LRElement LrElm = (LRElement)Huelle[i]; RuleElement re = GetRuleElement(LrElm); if (re != null && !re.IsTerminal() && re.GetToken().Length > 0) { if (FirstClosureFromRule(Huelle, re.GetToken())) { bChanged = true; } } } } } }
public virtual string PrintHuellen() { string res = ""; if (m_Huellen != null) { for (int i = 0; i < m_Huellen.Count; i++) { res += "I" + i + ":\n"; MyArrayList Huelle = (MyArrayList)m_Huellen[i]; if (Huelle != null) { for (int j = 0; j < Huelle.Count; j++) { LRElement LrElm = (LRElement)Huelle[j]; BNFRule rl = (BNFRule)m_Rules[LrElm.RulePos]; res += "(" + LrElm.RulePos + "," + LrElm.PosInRule + ")" + "\t" + GetRuleString(rl.GetStart(), LrElm.PosInRule) + "\n"; } } res += "\n\n"; } } return(res); }
protected override bool GenerateParseTable() { MyArrayList Terminals = GetAllTerminals(); Terminals.Add(new RuleTerminal(m_EofTerminal, null)); MyArrayList Tokens = GetDifStartTokens(); MyArrayList column = new MyArrayList(); for (int i = 0; i < Terminals.Count; i++) { RuleElement re = (RuleElement)Terminals[i]; column.Add(re); } for (int i = 0; i < Tokens.Count; i++) { RuleStart rs = (RuleStart)Tokens[i]; column.Add(rs); } m_bupt = new ButtomUpParseTabelle(column, Terminals, m_Huellen.Count); for (int i = 0; i < m_GotoTable.Count; i++) { GotoEntry ge = (GotoEntry)m_GotoTable[i]; RuleElement re = ge.TokenSymbol; if (re.IsTerminal()) { ButtomUpParseTabelle.ActionEntry buptAE = new ButtomUpParseTabelle.ActionEntry(ButtomUpParseTabelle.Actions.SHIFT, ge.JumpToState); m_bupt.Add(re, ge.ThisState, buptAE); } else { ButtomUpParseTabelle.ActionEntry buptAE = new ButtomUpParseTabelle.ActionEntry(ButtomUpParseTabelle.Actions.JUMP, ge.JumpToState); m_bupt.Add(re, ge.ThisState, buptAE); } } bool dblEntry = false; for (int i = 0; i < m_Huellen.Count; i++) { MyArrayList ActHuelle = (MyArrayList)m_Huellen[i]; for (int j = 0; j < ActHuelle.Count; j++) { LRElement lrm = (LRElement)ActHuelle[j]; RuleElement re = GetRuleElement(lrm); if (re == null) { BNFRule rl = (BNFRule)m_Rules[lrm.RulePos]; MyArrayList flws = rl.FollowSet; if (flws != null) { for (int z = 0; z < flws.Count; z++) { RuleElement flw_re = (RuleElement)flws[z]; ButtomUpParseTabelle.ActionEntry buptAE = new ButtomUpParseTabelle.ActionEntry(ButtomUpParseTabelle.Actions.REDUCE, lrm.RulePos); ButtomUpParseTabelle.ActionEntry ae = m_bupt.Get(flw_re, i); if (ae == null) { m_bupt.Add(flw_re, i, buptAE); } else { if (ae.GetAction != ButtomUpParseTabelle.Actions.ACCEPT) { dblEntry = true; } } } if (rl.GetStart().GetToken().Equals(m_StartSign)) { ButtomUpParseTabelle.ActionEntry buptAE = new ButtomUpParseTabelle.ActionEntry(ButtomUpParseTabelle.Actions.ACCEPT, lrm.RulePos); m_bupt.Add(m_EofTerminal, i, buptAE); } } } } } return(!dblEntry); }