/// Spart License (zlib/png) /// /// /// Copyright (c) 2003 Jonathan de Halleux /// /// This software is provided 'as-is', without any express or implied warranty. /// In no event will the authors be held liable for any damages arising from /// the use of this software. /// /// Permission is granted to anyone to use this software for any purpose, /// including commercial applications, and to alter it and redistribute it /// freely, subject to the following restrictions: /// /// 1. The origin of this software must not be misrepresented; you must not /// claim that you wrote the original software. If you use this software in a /// product, an acknowledgment in the product documentation would be /// appreciated but is not required. /// /// 2. Altered source versions must be plainly marked as such, and must not be /// misrepresented as being the original software. /// /// 3. This notice may not be removed or altered from any source distribution. /// /// Author: Jonathan de Halleuxnamespace Spart.Parsers.NonTerminal namespace Spart.Parsers.NonTerminal { using System; using Spart.Scanners; /// /// NonTerminal parser abstract class /// public abstract class NonTerminalParser : Parser { private String m_ID; /// /// Default constructor /// public NonTerminalParser() :base() { ID = GetHashCode().ToString(); } /// /// Rule ID, used for debugging /// public string ID { get { return m_ID; } set { if( m_ID != value ) m_ID = value; } } /// /// Pre parse event /// public event PreParseEventHandler PreParse; /// /// Post parse event /// public event PostParseEventHandler PostParse; /// /// Preparse event caller /// /// public virtual void OnPreParse(IScanner scan) { if (PreParse != null) PreParse(this, new PreParseEventArgs(this,scan) ); } /// /// Post parse event caller /// /// /// public virtual void OnPostParse(ParserMatch match, IScanner scan) { if (PostParse != null) PostParse(this,new PostParseEventArgs(match,this,scan)); } /// /// Adds event handlers /// /// public void AddContext(IParserContext context) { PreParse+=new PreParseEventHandler(context.PreParse); PostParse+=new PostParseEventHandler(context.PostParse); } /// /// Removes event handlers /// /// public void RemoveContext(IParserContext context) { PreParse-=new PreParseEventHandler(context.PreParse); PostParse-=new PostParseEventHandler(context.PostParse); } public override Parser Clone() { NonTerminalParser clone = base.Clone() as NonTerminalParser; return clone; } } }