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);
        }
Exemplo n.º 2
0
 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);
        }
Exemplo n.º 4
0
 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;
 }
Exemplo n.º 5
0
 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;
 }
Exemplo n.º 7
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; 
 }
Exemplo n.º 8
0
 public BnfExpression MakeStarRule(NonTerminal listNonTerminal, BnfTerm delimiter, BnfTerm listMember, TermListOptions options)
 {
     return MakeListRule(listNonTerminal, delimiter, listMember, options | TermListOptions.StarList);
 }
Exemplo n.º 9
0
 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;
 }
Exemplo n.º 10
0
        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
Exemplo n.º 11
0
        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
Exemplo n.º 12
0
 public BnfExpression MakeStarRule(NonTerminal listNonTerminal, BnfTerm delimiter, BnfTerm listMember, TermListOptions options)
 {
     return(MakeListRule(listNonTerminal, delimiter, listMember, options | TermListOptions.StarList));
 }
Exemplo n.º 13
0
 public static bool IsSet(this TermListOptions flags, TermListOptions flag)
 {
     return((flags & flag) != 0);
 }
Exemplo n.º 14
0
 public static bool IsSet(this TermListOptions flags, TermListOptions flag)
 {
     return (flags & flag) != 0;
 }