Exemplo n.º 1
0
        /// <summary>Create the parser to read grammar definition</summary>
        /// <exclude/>
        private static void CreateMetaParser()
        {
            if (_instance != null)
            {
                return;
            }
            int          step           = 1;
            TextBuffer   buffer         = new FlatBuffer(MetaParser.SoftMetaGrammarAndSettings);
            CodeDocument metaGrammarDoc = null;

            try
            {
                // Hard coded parser
                Parser hardcodeParser = GetHardCodeParser(buffer.Status);

                if (buffer.Status.Error == null)
                {
                    step = 2;
                    // Use hard coded grammar to read meta grammar.
                    metaGrammarDoc = hardcodeParser.ParseString(buffer);

                    string gg = metaGrammarDoc.ToMarkup();
                    step = 3;
                }
                if (buffer.Status.Error == null)
                {
                    _instance = new Parser()
                    {
                        Level = 2
                    };
                    ParserBuilder.BuildRules(_instance, metaGrammarDoc, buffer.Status);
                }
            }
            catch (Exception e)
            {
                // if an exception occurs under parsing MetaGrammar it is an HardGrammar error
                var e2 = new ParserException((step <= 2 ? HardGrammar_ : MetaGrammar_) + " " + e.Message);
                if (e is ParserException)
                {
                    e2.AllErrors = ((ParserException)e).AllErrors;
                }
                throw e2;
            }
            if (buffer.Status.Error != null)
            {
                // if an proces-error occurs under parsing MetaGrammar it is an MetaGrammar error
                var e2 = new ParserException((step == 1 ? HardGrammar_ : MetaGrammar_) + " " + buffer.Status.Error.Message);
                e2.AllErrors = buffer.Status.AllErrors;
                throw e2;
            }
        }
Exemplo n.º 2
0
        internal static Parser GetHardCodeParser(ParserStatus status)
        {
            List <Rule> list = new List <Rule>();

            // Build Parser in code.
            // grammar   = {rule} [settings];
            list.Add(new Rule(MetaGrammar_,
                              new Sequence(new RuleLink(Rule_______)),
                              new Optional(new RuleLink(Settings___)))
            {
                Comment = true
            });

            // rule = identifier '=' expression ';'
            list.Add(new Rule(Rule_______,
                              new WordIdent(),
                              new WordSymbol("="),
                              new RuleLink(Expression_),
                              new WordSymbol(";")));

            // expression = element {[or] element};
            list.Add(new Rule(Expression_,
                              new RuleLink(Element____),
                              new Sequence(
                                  new Optional(
                                      new RuleLink(Or_________)),
                                  new RuleLink(Element____)))
            {
                Collapse = true
            });

            // element    = identifier | symbol | block;
            list.Add(new Rule(Element____,
                              new Or(new WordIdent(),
                                     new Or(new RuleLink(WordSymbol_),
                                            new RuleLink(Block______))))
            {
                Collapse = true
            });

            // block      = sequence | optional | parentheses;
            list.Add(new Rule(Block______,
                              new Or(new RuleLink(Sequence___),
                                     new Or(new RuleLink(Optional___),
                                            new RuleLink(Parentheses))))
            {
                Collapse = true
            });

            // sequence     = '{' expression '}';
            list.Add(new Rule(Sequence___,
                              new WordSymbol("{"),
                              new RuleLink(Expression_),
                              new WordSymbol("}")));
            // optional     = '[' expression ']';
            list.Add(new Rule(Optional___,
                              new WordSymbol("["),
                              new RuleLink(Expression_),
                              new WordSymbol("]")));
            // parentheses      = '(' expression ')';
            list.Add(new Rule(Parentheses,
                              new WordSymbol("("),
                              new RuleLink(Expression_),
                              new WordSymbol(")")));
            // or         = '|';
            list.Add(new Rule(Or_________,
                              new WordSymbol("|")));

            // symbol       = string;
            list.Add(new Rule(WordSymbol_,
                              new WordString()));

            // settings   > 'settings' {setter};
            list.Add(new Rule(Settings___,
                              new WordSymbol(Settings___),
                              new Sequence(
                                  new RuleLink(Setter_____)))
            {
                Collapse = true
            });

            // setter     > identifier assignment {',' assignment} ';';
            list.Add(new Rule("setter",
                              new WordIdent(),
                              new RuleLink(Assignment_),
                              new Sequence(
                                  new WordSymbol(","),
                                  new RuleLink(Assignment_)),
                              new WordSymbol(";")));

            // assignment > property '=' value;
            list.Add(new Rule(Assignment_,
                              new RuleLink(Property___),
                              new Optional(
                                  new WordSymbol("="),
                                  new RuleLink(Value______))));


            // property   > identifier;
            list.Add(new Rule(Property___,
                              new WordIdent()));

            // value      > string;";
            list.Add(new Rule(Value______,
                              new WordString()));

            Parser parser = new Parser()
            {
                Level = 1
            };                                          // { Name = HardGrammar_ };

            parser.Rules = list;
            //foreach (var eq in list) eq.Parser = parser;
            ParserBuilder.InitializeGrammar(parser, parser.Rules, status);

            return(parser);
        }