Exemple #1
0
 public void Print0()
 {
     Console.WriteLine();
     if (this.m_state == 0)
     {
         Console.WriteLine("state 0");
     }
     else
     {
         Console.WriteLine("state {0} accessed by {1}", (object)this.m_state, (object)this.m_accessingSymbol.yytext);
     }
     if (this.m_items != null)
     {
         for (ProdItemList prodItemList = this.m_items; prodItemList.m_pi != null; prodItemList = prodItemList.m_next)
         {
             prodItemList.m_pi.Print();
             Console.WriteLine();
         }
     }
     Console.WriteLine();
     foreach (ParsingInfo pi in (IEnumerable)this.m_sgen.m_symbols.symbolInfo.Values)
     {
         this.PrintTransition(pi);
     }
 }
Exemple #2
0
 public ParseState(SymbolsGen syms, CSymbol acc)
 {
     this.m_sgen            = syms;
     this.m_state           = syms.state++;
     this.m_accessingSymbol = acc;
     this.m_items           = new ProdItemList();
 }
Exemple #3
0
 public void Closure()
 {
     while (this.m_changed)
     {
         this.m_changed = false;
         for (ProdItemList prodItemList = this.m_items; prodItemList.m_pi != null; prodItemList = prodItemList.m_next)
         {
             this.CheckClosure(prodItemList.m_pi);
         }
     }
 }
Exemple #4
0
 public void AddEntries()
 {
     for (ProdItemList prodItemList = this.m_items; prodItemList.m_pi != null; prodItemList = prodItemList.m_next)
     {
         ProdItem pi1 = prodItemList.m_pi;
         if (!pi1.m_done)
         {
             CSymbol csymbol = pi1.Next();
             if (csymbol != null && !pi1.IsReducingAction())
             {
                 ParseState parseState = new ParseState(this.m_sgen, csymbol);
                 parseState.MaybeAdd(new ProdItem(pi1.m_prod, pi1.m_pos + 1));
                 for (ProdItemList next = prodItemList.m_next; next != null && next.m_pi != null; next = next.m_next)
                 {
                     ProdItem pi2 = next.m_pi;
                     if (csymbol == pi2.Next())
                     {
                         parseState.MaybeAdd(new ProdItem(pi2.m_prod, pi2.m_pos + 1));
                         pi2.m_done = true;
                     }
                 }
                 if (!this.m_items.AtEnd)
                 {
                     if (csymbol.IsAction())
                     {
                         ParseState next = parseState.CheckExists();
                         foreach (CSymbol key in (IEnumerable)csymbol.m_follow.Keys)
                         {
                             if (key != this.m_sgen.m_symbols.EOFSymbol)
                             {
                                 this.GetTransition(key).m_next = new ParserShift((ParserAction)csymbol, next);
                             }
                         }
                     }
                     else
                     {
                         this.GetTransition(csymbol).m_next = new ParserShift((ParserAction)null, parseState.CheckExists());
                     }
                 }
             }
         }
     }
 }
Exemple #5
0
        public bool SameAs(ParseState p)
        {
            if (this.m_accessingSymbol != p.m_accessingSymbol)
            {
                return(false);
            }
            ProdItemList prodItemList1 = this.m_items;
            ProdItemList prodItemList2;

            for (prodItemList2 = p.m_items; !prodItemList1.AtEnd && !prodItemList2.AtEnd && (prodItemList1.m_pi.m_prod == prodItemList2.m_pi.m_prod && prodItemList1.m_pi.m_pos == prodItemList2.m_pi.m_pos); prodItemList2 = prodItemList2.m_next)
            {
                prodItemList1 = prodItemList1.m_next;
            }
            if (prodItemList1.AtEnd)
            {
                return(prodItemList2.AtEnd);
            }
            return(false);
        }
Exemple #6
0
 public void Print()
 {
     Console.WriteLine();
     if (this.m_state == 0)
     {
         Console.WriteLine("state 0");
     }
     else
     {
         Console.WriteLine("state {0} accessed by {1}", (object)this.m_state, (object)this.m_accessingSymbol.yytext);
     }
     if (this.m_items != null)
     {
         for (ProdItemList prodItemList = this.m_items; prodItemList.m_pi != null; prodItemList = prodItemList.m_next)
         {
             prodItemList.m_pi.Print();
             prodItemList.m_pi.m_prod.m_lhs.m_follow.Print();
         }
     }
     foreach (Transition transition in (IEnumerable)this.m_transitions.Values)
     {
         transition.Print0();
     }
 }
Exemple #7
0
 public void ReduceStates()
 {
     for (ProdItemList prodItemList = this.m_items; prodItemList.m_pi != null; prodItemList = prodItemList.m_next)
     {
         ProdItem pi = prodItemList.m_pi;
         if (pi.Next() == null)
         {
             Production prod = pi.m_prod;
             if (prod.m_pno != 0)
             {
                 int          count = prod.m_rhs.Count;
                 CSymbol      rh;
                 ParserReduce parserReduce;
                 if (count > 0 && (rh = (CSymbol)prod.m_rhs[count - 1]) != null && rh.IsAction())
                 {
                     ParserAction action = (ParserAction)rh;
                     action.m_len = count;
                     parserReduce = new ParserReduce(action, count - 1, prod);
                 }
                 else
                 {
                     this.m_sgen.m_lexer.yytext = "%" + prod.m_lhs.yytext;
                     this.m_sgen.m_prod         = prod;
                     ParserSimpleAction parserSimpleAction = new ParserSimpleAction(this.m_sgen);
                     parserSimpleAction.m_sym = prod.m_lhs;
                     parserSimpleAction.m_len = count;
                     parserReduce             = new ParserReduce((ParserAction)parserSimpleAction, count, prod);
                 }
                 foreach (CSymbol key in (IEnumerable)pi.m_prod.m_lhs.m_follow.Keys)
                 {
                     this.GetTransition(key).m_reduce[(object)prod] = (object)parserReduce;
                 }
             }
         }
     }
 }
Exemple #8
0
		public ParseState(SymbolsGen syms,CSymbol acc) 
		{ 
			m_sgen = syms;
			m_state=syms.state++; 
			m_accessingSymbol=acc;
			m_items = new ProdItemList();
		}
Exemple #9
0
		public ProdItemList() { m_pi=null; m_next=null; } // sentinel only
		public bool Add(ProdItem pi) 
		{
			if (m_pi==null) 
			{  // m_pi==null iff m_next==null
				m_next = new ProdItemList();
				m_pi = pi; 
			} 
			else if (m_pi.m_prod.m_pno < pi.m_prod.m_pno ||
				(m_pi.m_prod.m_pno==pi.m_prod.m_pno && m_pi.m_pos<pi.m_pos)) 
			{
				m_next = new ProdItemList(m_pi,m_next);
				m_pi = pi;
			} 
			else if (m_pi.m_prod.m_pno == pi.m_prod.m_pno && m_pi.m_pos==pi.m_pos) 
				return false;
			else
				return m_next.Add(pi);
			return true; // was added
		}
Exemple #10
0
		public ProdItemList() { m_pi=null; m_next=null; } // sentinel only
Exemple #11
0
		public ProdItemList (ProdItem pi,ProdItemList n) { m_pi=pi; m_next=n; }
Exemple #12
0
 public ProdItemList()
 {
     m_pi=null; m_next=null;
 }