14 using System.Collections;
15 using System.Collections.Generic;
17 using System.Reflection;
53 public delegate
void AstNodeCreator(ParsingContext context, ParseTreeNode parseNode);
58 public BnfTerm(
string name) : this(name, name) { }
59 public BnfTerm(
string name,
string errorAlias) {
61 ErrorAlias = errorAlias;
63 public BnfTerm(
string name,
string errorAlias, Type nodeType) : this(name, errorAlias) {
64 AstNodeType = nodeType;
72 #region virtuals and overrides
79 return GrammarData.Grammar.GetParseNodeCaption(node);
89 if (Name == null)
return 0;
90 return Name.GetHashCode();
94 public const int NoPrecedence = 0;
96 #region properties: Name, DisplayName, Key, Options
107 get {
return GrammarData.Grammar; }
110 return (
Flags & flag) != 0;
124 #region AST node creations: AstNodeType, AstNodeCreator, AstNodeCreated
137 Type nodeType = GetAstNodeType(context, nodeInfo);
138 if (nodeType == null)
140 nodeInfo.AstNode = Activator.CreateInstance(nodeType);
144 iInit.Init(context, nodeInfo);
150 return AstNodeType ?? Grammar.DefaultNodeType;
153 protected internal void OnAstNodeCreated(
ParseTreeNode parseNode) {
154 if (this.AstNodeCreated == null || parseNode.
AstNode == null)
return;
156 AstNodeCreated(
this, args);
161 #region Kleene operators: Q(), Plus(), Star()
162 NonTerminal _q, _plus, _star;
168 _q.Rule =
this | Grammar.CurrentGrammar.Empty;
176 _plus.Rule = Grammar.MakePlusRule(_plus,
this);
182 if (_star != null)
return _star;
184 _star.Rule = Grammar.MakeStarRule(_star,
this);
189 #region Operators: +, |, implicit
191 return Op_Plus(term1, term2);
202 return Op_Pipe(term1, term2);
216 if (expr1 == null || expr1.Data.Count > 1)
217 expr1 =
new BnfExpression(term1);
218 expr1.Data[expr1.Data.Count - 1].Add(term2);
224 internal static BnfExpression Op_Pipe(BnfTerm term1, BnfTerm term2) {
225 BnfExpression expr1 = term1 as BnfExpression;
227 expr1 =
new BnfExpression(term1);
228 BnfExpression expr2 = term2 as BnfExpression;
230 expr2 =
new BnfExpression(term2);
231 expr1.Data.AddRange(expr2.Data);
248 public object AstNode {
249 get {
return ParseTreeNode.AstNode; }
BnfTerm(string name, string errorAlias)
KeyTerm ToTerm(string text)
override string ToString()
Currently ignored by Parser, may be used in the future to set specific precedence value of the follow...
Flags
Enumeration of the new Assimp's flags.
delegate void AstNodeCreator(ParsingContext context, ParseTreeNode parseNode)
virtual void Init(GrammarData grammarData)
void SetFlag(TermFlags flag)
virtual Type GetAstNodeType(ParsingContext context, ParseTreeNode nodeInfo)
bool FlagIsSet(TermFlags flag)
EventHandler< AstNodeEventArgs > AstNodeCreated
BnfTerm(string name, string errorAlias, AstNodeCreator nodeCreator)
void SetFlag(TermFlags flag, bool value)
AstNodeCreator AstNodeCreator
virtual string GetParseNodeCaption(ParseTreeNode node)
static Grammar CurrentGrammar
BnfTerm(string name, string errorAlias, Type nodeType)
AstNodeEventArgs(ParseTreeNode parseTreeNode)
override int GetHashCode()
readonly ParseTreeNode ParseTreeNode
virtual void CreateAstNode(ParsingContext context, ParseTreeNode nodeInfo)