Exemplo n.º 1
0
        /// <summary>
        /// Initializes a new instance of the <see cref="Parser"/> class.
        /// </summary>
        /// <param name="language">The language.</param>
        /// <param name="scanner">The scanner.</param>
        /// <param name="root">The root.</param>
        /// <exception cref="Exception">
        ///   </exception>
        public Parser(LanguageData language, Scanner scanner, NonTerminal root)
        {
            Language = language;
            Context  = new ParsingContext(this);
            Scanner  = scanner ?? language.CreateScanner();

            if (Scanner != null)
            {
                Scanner.Initialize(this);
            }
            else
            {
                Language.Errors.Add(GrammarErrorLevel.Error, null, "Scanner is not initialized for this grammar");
            }
            CoreParser = new CoreParser(this);
            Root       = root;
            if (Root == null)
            {
                Root         = Language.Grammar.Root;
                InitialState = Language.ParserData.InitialState;
            }
            else
            {
                if (Root != Language.Grammar.Root && !Language.Grammar.SnippetRoots.Contains(Root))
                {
                    throw new Exception(string.Format(Resources.ErrRootNotRegistered, root.Name));
                }

                InitialState = Language.ParserData.InitialStates[Root];
            }
        }
Exemplo n.º 2
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.º 3
0
 public NonTerminal Star()
 {
     if (_star != null)
     {
         return(_star);
     }
     _star      = new NonTerminal(this.Name + "*");
     _star.Rule = Grammar.MakeStarRule(_star, this);
     return(_star);
 }
Exemplo n.º 4
0
 public NonTerminal Plus()
 {
     if (_plus != null)
     {
         return(_plus);
     }
     _plus      = new NonTerminal(this.Name + "+");
     _plus.Rule = Grammar.MakePlusRule(_plus, this);
     return(_plus);
 }
Exemplo n.º 5
0
 NonTerminal _q, _plus, _star; //cash them
 public NonTerminal Q()
 {
     if (_q != null)
     {
         return(_q);
     }
     _q      = new NonTerminal(this.Name + "?");
     _q.Rule = this | Grammar.CurrentGrammar.Empty;
     return(_q);
 }
Exemplo n.º 6
0
 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);
 }
Exemplo n.º 7
0
 public static BnfExpression MakeStarRule(NonTerminal listNonTerminal, BnfTerm delimiter, BnfTerm listMember)
 {
     return(MakeStarRule(listNonTerminal, delimiter, listMember, TermListOptions.None));
 }
Exemplo n.º 8
0
        }//method

        #endregion

        #region MakePlusRule, MakeStarRule methods
        public static BnfExpression MakePlusRule(NonTerminal listNonTerminal, BnfTerm listMember)
        {
            return(MakePlusRule(listNonTerminal, null, listMember));
        }