Files
libremetaverse/LibreMetaverse.LslTools/Tools/ParserReduce.cs
2024-06-30 16:49:51 -05:00

116 lines
3.7 KiB
C#

/*
* Copyright (c) 2019-2024, Sjofn LLC
* All rights reserved.
*
* - Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* - Neither the name of the openmetaverse.co nor the names
* of its contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
using System;
using System.Collections;
namespace LibreMetaverse.LslTools
{
public class ParserReduce : ParserEntry
{
public int m_depth;
public Production m_prod;
public SymbolSet m_lookAhead;
public ParserReduce(ParserAction action, int depth, Production prod)
: base(action)
{
this.m_depth = depth;
this.m_prod = prod;
}
private ParserReduce()
{
}
public void BuildLookback(Transition a)
{
SymbolsGen sgen = a.m_ps.m_sgen;
if (this.m_lookAhead != null)
return;
this.m_lookAhead = new SymbolSet(sgen);
foreach (ParseState q in (IEnumerable) sgen.m_symbols.m_states.Values)
{
Transition transition = (Transition) q.m_transitions[(object) this.m_prod.m_lhs.yytext];
if (transition != null)
{
Path path = new Path(q, this.m_prod.Prefix(this.m_prod.m_rhs.Count));
if (path.valid && path.Top == a.m_ps)
transition.m_lookbackOf[(object) this] = (object) true;
}
}
}
public override void Pass(ref ParseStackEntry top)
{
Parser yyps = top.yyps;
SYMBOL ns = this.m_action.Action(yyps);
yyps.m_ungot = top.m_value;
if (yyps.m_debug)
Console.WriteLine("about to pop {0} count is {1}", (object) this.m_depth, (object) yyps.m_stack.Count);
yyps.Pop(ref top, this.m_depth, ns);
if (ns.pos == 0)
{
ns.pos = top.m_value.pos;
}
top.m_value = ns;
}
public override bool IsReduce()
{
return true;
}
public override string str
{
get
{
if (this.m_prod == null)
return "?? null reduce";
return $"reduce {(object)this.m_prod.m_pno}";
}
}
public new static object Serialise(object o, Serialiser s)
{
if (s == null)
return (object) new ParserReduce();
ParserReduce parserReduce = (ParserReduce) o;
if (s.Encode)
{
ParserEntry.Serialise((object) parserReduce, s);
s.Serialise((object) parserReduce.m_depth);
s.Serialise((object) parserReduce.m_prod);
return (object) null;
}
ParserEntry.Serialise((object) parserReduce, s);
parserReduce.m_depth = (int) s.Deserialise();
parserReduce.m_prod = (Production) s.Deserialise();
return (object) parserReduce;
}
}
}