public static BnfExpression MakePlusRule(NonTerminal listNonTerminal, BnfTerm delimiter, BnfTerm listMember) { if (delimiter == null) { listNonTerminal.Rule = listMember | listNonTerminal + listMember; } else { listNonTerminal.Rule = listMember | listNonTerminal + delimiter + listMember; } listNonTerminal.SetFlag(TermFlags.IsList); return(listNonTerminal.Rule); }
//Pipe/Alternative //New version proposed by the codeplex user bdaugherty internal static BnfExpression Op_Pipe(BnfTerm term1, BnfTerm term2) { BnfExpression expr1 = term1 as BnfExpression; if (expr1 == null) { expr1 = new BnfExpression(term1); } BnfExpression expr2 = term2 as BnfExpression; if (expr2 == null) { expr2 = new BnfExpression(term2); } expr1.Data.AddRange(expr2.Data); return(expr1); }
public BnfExpression(BnfTerm element) : this() { Data[0].Add(element); }
public static BnfExpression MakeStarRule(NonTerminal listNonTerminal, BnfTerm delimiter, BnfTerm listMember, TermListOptions options) { bool allowTrailingDelimiter = (options & TermListOptions.AllowTrailingDelimiter) != 0; if (delimiter == null) { //it is much simpler case listNonTerminal.SetFlag(TermFlags.IsList); listNonTerminal.Rule = _currentGrammar.Empty | listNonTerminal + listMember; return(listNonTerminal.Rule); } //Note that deceptively simple version of the star-rule // Elem* -> Empty | Elem | Elem* + delim + Elem // does not work when you have delimiters. This simple version allows lists starting with delimiters - // which is wrong. The correct formula is to first define "Elem+"-list, and then define "Elem*" list // as "Elem* -> Empty|Elem+" NonTerminal plusList = new NonTerminal(listMember.Name + "+"); plusList.Rule = MakePlusRule(plusList, delimiter, listMember); plusList.SetFlag(TermFlags.NoAstNode); //to allow it to have AstNodeType not assigned if (allowTrailingDelimiter) { listNonTerminal.Rule = _currentGrammar.Empty | plusList | plusList + delimiter; } else { listNonTerminal.Rule = _currentGrammar.Empty | plusList; } listNonTerminal.SetFlag(TermFlags.IsListContainer); return(listNonTerminal.Rule); }
public static BnfExpression MakeStarRule(NonTerminal listNonTerminal, BnfTerm delimiter, BnfTerm listMember) { return(MakeStarRule(listNonTerminal, delimiter, listMember, TermListOptions.None)); }
}//method #endregion #region MakePlusRule, MakeStarRule methods public static BnfExpression MakePlusRule(NonTerminal listNonTerminal, BnfTerm listMember) { return(MakePlusRule(listNonTerminal, null, listMember)); }
public ParseTreeNode(BnfTerm term) : this() { Term = term; }