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 bool IsSet(this TermListOptions options, TermListOptions option) { return((options & option) != 0); }
public static BnfExpression MakePlusRule(NonTerminal listNonTerminal, BnfTerm delimiter, BnfTerm listMember, TermListOptions options) { bool allowTrailingDelimiter = (options & TermListOptions.AllowTrailingDelimiter) != 0; if (delimiter == null || !allowTrailingDelimiter) { return(MakePlusRule(listNonTerminal, delimiter, listMember)); } //create plus list var plusList = new NonTerminal(listMember.Name + "+"); plusList.Rule = MakePlusRule(listNonTerminal, delimiter, listMember); listNonTerminal.Rule = plusList | plusList + delimiter; listNonTerminal.SetFlag(TermFlags.IsListContainer); return(listNonTerminal.Rule); }
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; }
protected BnfExpression MakeListRule(NonTerminal list, BnfTerm delimiter, BnfTerm listMember, TermListOptions options = TermListOptions.PlusList) { //If it is a star-list (allows empty), then we first build plus-list var isPlusList = !options.IsSet(TermListOptions.AllowEmpty); var allowTrailingDelim = options.IsSet(TermListOptions.AllowTrailingDelimiter) && delimiter != null; //"plusList" is the list for which we will construct expression - it is either extra plus-list or original list. // In the former case (extra plus-list) we will use it later to construct expression for list NonTerminal plusList = isPlusList ? list : new NonTerminal(listMember.Name + "+"); plusList.SetFlag(TermFlags.IsList); plusList.Rule = plusList; // rule => list if (delimiter != null) plusList.Rule += delimiter; // rule => list + delim if (options.IsSet(TermListOptions.AddPreferShiftHint)) plusList.Rule += PreferShiftHere(); // rule => list + delim + PreferShiftHere() plusList.Rule += listMember; // rule => list + delim + PreferShiftHere() + elem plusList.Rule |= listMember; // rule => list + delim + PreferShiftHere() + elem | elem if (isPlusList) { // if we build plus list - we're almost done; plusList == list // add trailing delimiter if necessary; for star list we'll add it to final expression if (allowTrailingDelim) plusList.Rule |= list + delimiter; // rule => list + delim + PreferShiftHere() + elem | elem | list + delim } else { // Setup list.Rule using plus-list we just created list.Rule = Empty | plusList; if (allowTrailingDelim) list.Rule |= plusList + delimiter | delimiter; plusList.SetFlag(TermFlags.NoAstNode); list.SetFlag(TermFlags.IsListContainer); //indicates that real list is one level lower } return list.Rule; }
public static bool IsSet(this TermListOptions options, TermListOptions option) { return (options & option) != 0; }
public static BnfExpression MakePlusRule(NonTerminal listNonTerminal, BnfTerm delimiter, BnfTerm listMember, TermListOptions options) { bool allowTrailingDelimiter = (options & TermListOptions.AllowTrailingDelimiter) != 0; if (delimiter == null || !allowTrailingDelimiter) return MakePlusRule(listNonTerminal, delimiter, listMember); //create plus list var plusList = new NonTerminal(listMember.Name + "+"); plusList.Rule = MakePlusRule(listNonTerminal, delimiter, listMember); listNonTerminal.Rule = plusList | plusList + delimiter; listNonTerminal.SetFlag(TermFlags.IsListContainer); return listNonTerminal.Rule; }
public BnfExpression MakeStarRule(NonTerminal listNonTerminal, BnfTerm delimiter, BnfTerm listMember, TermListOptions options) { return MakeListRule(listNonTerminal, delimiter, listMember, options | TermListOptions.StarList); }
protected BnfExpression MakeListRule(NonTerminal list, BnfTerm delimiter, BnfTerm listMember, TermListOptions options = TermListOptions.PlusList) { //If it is a star-list (allows empty), then we first build plus-list var isStarList = options.IsSet(TermListOptions.AllowEmpty); NonTerminal plusList = isStarList ? new NonTerminal(listMember.Name + "+") : list; //"list" is the real list for which we will construct expression - it is either extra plus-list or original listNonTerminal. // In the latter case we will use it later to construct expression for listNonTerminal plusList.Rule = plusList; // rule => list if (delimiter != null) plusList.Rule += delimiter; // rule => list + delim if (options.IsSet(TermListOptions.AddPreferShiftHint)) plusList.Rule += PreferShiftHere(); // rule => list + delim + PreferShiftHere() plusList.Rule += listMember; // rule => list + delim + PreferShiftHere() + elem plusList.Rule |= listMember; // rule => list + delim + PreferShiftHere() + elem | elem //trailing delimiter if (options.IsSet(TermListOptions.AllowTrailingDelimiter) & delimiter != null) plusList.Rule |= list + delimiter; // => list + delim + PreferShiftHere() + elem | elem | list + delim // set Rule value plusList.SetFlag(TermFlags.IsList); //If we do not use exra list - we're done, return list.Rule if (plusList == list) return list.Rule; // Let's setup listNonTerminal.Rule using plus-list we just created //If we are here, TermListOptions.AllowEmpty is set, so we have star-list list.Rule = Empty | plusList; plusList.SetFlag(TermFlags.NoAstNode); list.SetFlag(TermFlags.IsListContainer); //indicates that real list is one level lower return list.Rule; }
protected BnfExpression MakeListRule(NonTerminal list, BnfTerm delimiter, BnfTerm listMember, TermListOptions options = TermListOptions.PlusList) { //If it is a star-list (allows empty), then we first build plus-list var isPlusList = !options.IsSet(TermListOptions.AllowEmpty); var allowTrailingDelim = options.IsSet(TermListOptions.AllowTrailingDelimiter) && delimiter != null; //"plusList" is the list for which we will construct expression - it is either extra plus-list or original list. // In the former case (extra plus-list) we will use it later to construct expression for list NonTerminal plusList = isPlusList ? list : new NonTerminal(listMember.Name + "+"); plusList.SetFlag(TermFlags.IsList); plusList.Rule = plusList; // rule => list if (delimiter != null) { plusList.Rule += delimiter; // rule => list + delim } if (options.IsSet(TermListOptions.AddPreferShiftHint)) { plusList.Rule += PreferShiftHere(); // rule => list + delim + PreferShiftHere() } plusList.Rule += listMember; // rule => list + delim + PreferShiftHere() + elem plusList.Rule |= listMember; // rule => list + delim + PreferShiftHere() + elem | elem if (isPlusList) { // if we build plus list - we're almost done; plusList == list // add trailing delimiter if necessary; for star list we'll add it to final expression if (allowTrailingDelim) { plusList.Rule |= list + delimiter; // rule => list + delim + PreferShiftHere() + elem | elem | list + delim } } else { // Setup list.Rule using plus-list we just created list.Rule = Empty | plusList; if (allowTrailingDelim) { list.Rule |= plusList + delimiter | delimiter; } plusList.SetFlag(TermFlags.NoAstNode); list.SetFlag(TermFlags.IsListContainer); //indicates that real list is one level lower } return(list.Rule); }//method
protected BnfExpression MakeListRule(NonTerminal list, BnfTerm delimiter, BnfTerm listMember, TermListOptions options = TermListOptions.PlusList) { //If it is a star-list (allows empty), then we first build plus-list var isStarList = options.IsSet(TermListOptions.AllowEmpty); NonTerminal plusList = isStarList ? new NonTerminal(listMember.Name + "+") : list; //"list" is the real list for which we will construct expression - it is either extra plus-list or original listNonTerminal. // In the latter case we will use it later to construct expression for listNonTerminal plusList.Rule = plusList; // rule => list if (delimiter != null) { plusList.Rule += delimiter; // rule => list + delim } if (options.IsSet(TermListOptions.AddPreferShiftHint)) { plusList.Rule += PreferShiftHere(); // rule => list + delim + PreferShiftHere() } plusList.Rule += listMember; // rule => list + delim + PreferShiftHere() + elem plusList.Rule |= listMember; // rule => list + delim + PreferShiftHere() + elem | elem //trailing delimiter if (options.IsSet(TermListOptions.AllowTrailingDelimiter) & delimiter != null) { plusList.Rule |= list + delimiter; // => list + delim + PreferShiftHere() + elem | elem | list + delim } // set Rule value plusList.SetFlag(TermFlags.IsList); //If we do not use exra list - we're done, return list.Rule if (plusList == list) { return(list.Rule); } // Let's setup listNonTerminal.Rule using plus-list we just created //If we are here, TermListOptions.AllowEmpty is set, so we have star-list list.Rule = Empty | plusList; plusList.SetFlag(TermFlags.NoAstNode); list.SetFlag(TermFlags.IsListContainer); //indicates that real list is one level lower return(list.Rule); }//method
public BnfExpression MakeStarRule(NonTerminal listNonTerminal, BnfTerm delimiter, BnfTerm listMember, TermListOptions options) { return(MakeListRule(listNonTerminal, delimiter, listMember, options | TermListOptions.StarList)); }
public static bool IsSet(this TermListOptions flags, TermListOptions flag) { return((flags & flag) != 0); }
public static bool IsSet(this TermListOptions flags, TermListOptions flag) { return (flags & flag) != 0; }