public ParserReduce(ParserAction action,int depth,Production prod) : base(action) {m_depth=depth; m_prod = prod; }
public bool Lookback(Production pr,ParseState p) { return new Path(this,pr.Prefix(pr.m_rhs.Count)).Top==this; }
public ProdItem(Production prod, int pos) { m_prod=prod; m_pos=pos; m_done=false; }
public Precedence.PrecType ShiftPrecedence(Production prod,ParseState ps) // 4.5h { if (prod==null) // no reduce available return Precedence.PrecType.left; // shift // 4.5h if (!((SymbolSet)prod.m_lhs.m_follow).Contains(this)) // if this is not a follow symbol of the prod's lhs, there is no conflict return Precedence.PrecType.left; // shift // 4.5h if (m_prec==null) { // no precedence information Console.WriteLine("Shift/Reduce conflict {0} on reduction {1} in state {2}", yytext, prod.m_pno,ps.m_state); return Precedence.PrecType.left; // shift anyway // 4.5h } if (m_prec.m_type==Precedence.PrecType.nonassoc) // 4.5h return Precedence.PrecType.nonassoc; // 4.5h int p = Precedence.Check(this,prod,0); if (p==0) { if (Precedence.Check(m_prec,Precedence.PrecType.right,0)!=0) { // equal precedence but right associative: shift return Precedence.PrecType.left; // 4.5h } return Precedence.PrecType.right; // don't shift // 4.5h } return (p>0)?Precedence.PrecType.left:Precedence.PrecType.right; // shift if symbol has higher precedence than production, else reduce // 4.5h }
public static void Check(Production p) { int efflen = p.m_rhs.Count; while (efflen>1 && ((CSymbol)p.m_rhs[efflen-1]).IsAction()) efflen--; if (efflen==3) { CSymbol op = (CSymbol)p.m_rhs[1]; int b = CheckType(op.m_prec, PrecType.left, 0); if (b!=0 && ((CSymbol)p.m_rhs[2])==p.m_lhs) // allow operators such as E : V = E here p.m_prec = b; } else if (efflen==2) { if ((CSymbol)p.m_rhs[0]==p.m_lhs) { int aft = Check(((CSymbol)p.m_rhs[1]).m_prec, PrecType.after,0); if (aft!=0) p.m_prec = aft; } else if ((CSymbol)p.m_rhs[1]==p.m_lhs) { int bef = Check(((CSymbol)p.m_rhs[0]).m_prec, PrecType.before,0); if (bef!=0) p.m_prec = bef; } } }
public static int Check(CSymbol s, Production p, int d) { if (s.m_prec==null) return 0; int a = CheckType(s.m_prec, PrecType.after,d+1); int b = CheckType(s.m_prec, PrecType.left,d+1); if (a>b) return a - p.m_prec; else return b - p.m_prec; }
/// <exclude/> public ProdItem() { m_prod = null; m_pos = 0; m_done=false; }