Exemple #1
0
        public IGrammar Generate(EbnfDefinition ebnf)
        {
            var grammarModel = new GrammarModel();

            Definition(ebnf, grammarModel);
            return(grammarModel.ToGrammar());
        }
        public void GrammarModelToGrammarShouldCreateGrammar()
        {
            var grammarModel = new GrammarModel();

            var S = new ProductionModel("S");
            var A = new ProductionModel("A");
            var B = new ProductionModel("B");

            var a     = new StringLiteralLexerRule("a");
            var b     = new StringLiteralLexerRule("b");
            var space = new StringLiteralLexerRule(" ");

            S.AddWithAnd(A.LeftHandSide);
            S.AddWithAnd(B.LeftHandSide);
            S.AddWithOr(B.LeftHandSide);
            A.AddWithAnd(new LexerRuleModel(a));
            B.AddWithAnd(new LexerRuleModel(b));

            grammarModel.Productions.Add(S);
            grammarModel.Productions.Add(A);
            grammarModel.Productions.Add(B);

            grammarModel.IgnoreRules.Add(new LexerRuleModel(space));

            grammarModel.Start = S;

            var grammar = grammarModel.ToGrammar();

            Assert.AreEqual(4, grammar.Productions.Count);
            Assert.AreEqual(1, grammar.Ignores.Count);
        }
Exemple #3
0
        public void GrammarModelToGrammarShouldCreateGrammar()
        {
            var grammarModel = new GrammarModel();

            var S = ProductionModel.From("S");
            var A = ProductionModel.From("A");
            var B = ProductionModel.From("B");

            var a     = new StringLiteralLexerRule("a");
            var b     = new StringLiteralLexerRule("b");
            var space = new StringLiteralLexerRule(" ");

            S.AddWithAnd(A.LeftHandSide);
            S.AddWithAnd(B.LeftHandSide);
            S.AddWithOr(B.LeftHandSide);
            A.AddWithAnd(new LexerRuleModel(a));
            B.AddWithAnd(new LexerRuleModel(b));

            grammarModel.AddProduction(S);
            grammarModel.AddProduction(A);
            grammarModel.AddProduction(B);

            var lexerRuleModel = new LexerRuleModel(space);

            grammarModel.AddLexerRule(lexerRuleModel);
            grammarModel.AddIgnoreSetting(new IgnoreSettingModel(new QualifiedName(lexerRuleModel.LexerRule.TokenName.Id)));

            grammarModel.Start = S;

            var grammar = grammarModel.ToGrammar();

            Assert.AreEqual(4, grammar.Productions.Count);
            Assert.AreEqual(1, grammar.Ignores.Count);
        }
Exemple #4
0
        public void GrammarModelShouldAddProductionModel()
        {
            var grammar = new GrammarModel();

            grammar.AddProduction(ProductionModel.From(""));
            Assert.AreEqual(1, grammar.ProductionModels.Count);
        }
        public GrammarExpression(
            ProductionExpression start,
            IEnumerable <ProductionExpression> productions,
            IEnumerable <ILexerRule> ignore)
        {
            GrammarModel = new GrammarModel
            {
                Start = start.ProductionModel
            };

            if (productions != null)
            {
                foreach (var production in productions)
                {
                    GrammarModel.Productions.Add(production.ProductionModel);
                }
            }
            if (ignore != null)
            {
                foreach (var ignoreRule in ignore)
                {
                    GrammarModel.IgnoreRules.Add(new LexerRuleModel(ignoreRule));
                }
            }
        }
        public void GrammarModelToGrammarShouldAddProductionWhenEmptyDefinition()
        {
            var S            = new ProductionModel("S");
            var grammarModel = new GrammarModel(S);
            var grammar      = grammarModel.ToGrammar();

            Assert.AreEqual(1, grammar.Productions.Count);
        }
        public void GrammarModelShouldAddIgnoreLexerRuleModel()
        {
            var grammar = new GrammarModel();

            grammar.IgnoreRules.Add(new LexerRuleModel {
                Value = new StringLiteralLexerRule("this is a literal")
            });
            Assert.AreEqual(1, grammar.IgnoreRules.Count);
        }
Exemple #8
0
        private void Definition(IEbnfDefinition definition, GrammarModel grammarModel)
        {
            Block(definition.Block, grammarModel);

            if (definition is EbnfDefinitionConcatenation definitionConcatenation)
            {
                Definition(definitionConcatenation.Definition, grammarModel);
            }
        }
Exemple #9
0
        public void GrammarModelShouldAddIgnoreLexerRuleModel()
        {
            var grammar        = new GrammarModel();
            var lexerRuleModel = new LexerRuleModel(new StringLiteralLexerRule("this is a literal"));

            grammar.AddIgnoreSetting(new IgnoreSettingModel(new QualifiedName("AAA")));
            grammar.AddLexerRule(lexerRuleModel);
            Assert.AreEqual(1, grammar.LexerRuleModels.Count);
            Assert.AreEqual(1, grammar.IgnoreSettings.Count);
        }
        public void GrammarModelToGrammarShouldResolverProductionReferencesFromOtherGrammars()
        {
            var S = new ProductionModel {
                LeftHandSide = new NonTerminalModel(new FullyQualifiedName("ns1", "S"))
            };
            var A = new ProductionModel {
                LeftHandSide = new NonTerminalModel(new FullyQualifiedName("ns1", "A"))
            };

            S.Alterations.Add(
                new AlterationModel(
                    new[] { A }));
            A.Alterations.Add(
                new AlterationModel(
                    new[] { new LexerRuleModel(
                                new StringLiteralLexerRule("a")) })
                );
            var ns1GrammarModel = new GrammarModel
            {
                Start = S
            };

            ns1GrammarModel.Productions.Add(S);
            ns1GrammarModel.Productions.Add(A);

            var ns1ProductionReferece = new ProductionReferenceModel(ns1GrammarModel.ToGrammar());

            var Z = new ProductionModel {
                LeftHandSide = new NonTerminalModel(new FullyQualifiedName("ns2", "Z"))
            };
            var X = new ProductionModel {
                LeftHandSide = new NonTerminalModel(new FullyQualifiedName("ns2", "X"))
            };

            X.Alterations.Add(
                new AlterationModel(
                    new SymbolModel[]
            {
                Z, ns1ProductionReferece
            }));

            var ns2GrammarModel = new GrammarModel
            {
                Start = Z
            };

            ns2GrammarModel.Productions.Add(Z);
            ns2GrammarModel.Productions.Add(X);

            var ns2Grammar = ns2GrammarModel.ToGrammar();

            Assert.AreEqual(4, ns2Grammar.Productions.Count);
        }
Exemple #11
0
        private void Definition(EbnfDefinition definition, GrammarModel grammarModel)
        {
            Block(definition.Block, grammarModel);

            if (definition.NodeType != EbnfNodeType.EbnfDefinitionConcatenation)
            {
                return;
            }

            var definitionConcatenation = definition as EbnfDefinitionConcatenation;

            Definition(definitionConcatenation.Definition, grammarModel);
        }
        public void GrammarModelConstructorGivenOnlyStartProductionShouldTraverseRecursiveStructureOnlyOnce()
        {
            var S = new ProductionModel("S");
            var A = new ProductionModel("A");

            S.AddWithAnd(S);
            S.AddWithOr(A);
            A.AddWithAnd(new LexerRuleModel(new StringLiteralLexerRule("a")));

            var grammarModel = new GrammarModel(S);
            var grammar      = grammarModel.ToGrammar();

            Assert.AreEqual(3, grammar.Productions.Count);
        }
Exemple #13
0
        void Block(EbnfBlock block, GrammarModel grammarModel)
        {
            switch (block.NodeType)
            {
            case EbnfNodeType.EbnfBlockLexerRule:
                var blockLexerRule = block as EbnfBlockLexerRule;
                grammarModel.LexerRules.Add(LexerRule(blockLexerRule));
                break;

            case EbnfNodeType.EbnfBlockRule:
                var blockRule = block as EbnfBlockRule;
                foreach (var production in Rule(blockRule.Rule))
                {
                    grammarModel.Productions.Add(production);
                }
                break;

            case EbnfNodeType.EbnfBlockSetting:
                var blockSetting = block as EbnfBlockSetting;

                switch (blockSetting.Setting.SettingIdentifier.Value)
                {
                case StartProductionSettingModel.SettingKey:
                    grammarModel.StartSetting = StartSetting(blockSetting);
                    break;

                case IgnoreSettingModel.SettingKey:
                    var ignoreSettings = IgnoreSettings(blockSetting);
                    for (var i = 0; i < ignoreSettings.Count; i++)
                    {
                        grammarModel.IgnoreSettings.Add(ignoreSettings[i]);
                    }
                    break;

                case TriviaSettingModel.SettingKey:
                    var triviaSettings = TriviaSettings(blockSetting);
                    for (var i = 0; i < triviaSettings.Count; i++)
                    {
                        grammarModel.TriviaSettings.Add(triviaSettings[i]);
                    }
                    break;
                }
                break;
            }
        }
Exemple #14
0
        public void GrammarModelToGrammarShouldResolverProductionReferencesFromOtherGrammars()
        {
            var S = ProductionModel.From(new QualifiedName("ns1", "S"));
            var A = ProductionModel.From(new QualifiedName("ns1", "A"));

            S.Alterations.Add(
                new AlterationModel(
                    new[] { A }));
            A.Alterations.Add(
                new AlterationModel(
                    new[] { new LexerRuleModel(
                                new StringLiteralLexerRule("a")) })
                );
            var ns1GrammarModel = new GrammarModel
            {
                Start = S
            };

            ns1GrammarModel.AddProduction(S);
            ns1GrammarModel.AddProduction(A);

            var ns1ProductionReference = new GrammarReferenceModel(ns1GrammarModel.ToGrammar());

            var Z = ProductionModel.From(new QualifiedName("ns2", "Z"));
            var X = ProductionModel.From(new QualifiedName("ns2", "X"));

            X.Alterations.Add(
                new AlterationModel(
                    new SymbolModel[]
            {
                Z, ns1ProductionReference
            }));

            var ns2GrammarModel = new GrammarModel
            {
                Start = Z
            };

            ns2GrammarModel.AddProduction(Z);
            ns2GrammarModel.AddProduction(X);

            var ns2Grammar = ns2GrammarModel.ToGrammar();

            Assert.AreEqual(4, ns2Grammar.Productions.Count);
        }
        public void GrammarModelConstructorGivenOnlyStartProductionShouldDiscoverLinkedProductions()
        {
            var S = new ProductionModel("S");
            var A = new ProductionModel("A");
            var B = new ProductionModel("B");
            var C = new ProductionModel("C");

            S.AddWithAnd(A);
            A.AddWithAnd(B);
            A.AddWithOr(C);
            B.AddWithAnd(new LexerRuleModel(new StringLiteralLexerRule("b")));
            C.AddWithAnd(new LexerRuleModel(new StringLiteralLexerRule("c")));

            var grammarModel = new GrammarModel(S);
            var grammar      = grammarModel.ToGrammar();

            Assert.AreEqual(5, grammar.Productions.Count);
        }
Exemple #16
0
        void Block(EbnfBlock block, GrammarModel grammarModel)
        {
            switch (block.NodeType)
            {
            case EbnfNodeType.EbnfBlockLexerRule:
                break;

            case EbnfNodeType.EbnfBlockRule:
                var blockRule = block as EbnfBlockRule;
                foreach (var production in Rule(blockRule.Rule))
                {
                    grammarModel.Productions.Add(production);
                }
                break;

            case EbnfNodeType.EbnfBlockSetting:
                break;
            }
        }
Exemple #17
0
        private void Block(IEbnfBlock block, GrammarModel grammarModel)
        {
            switch (block)
            {
            case EbnfBlockLexerRule blockLexerRule:
                grammarModel.AddLexerRule(LexerRule(blockLexerRule));
                break;

            case EbnfBlockRule blockRule:
                foreach (var production in Rule(blockRule.Rule))
                {
                    grammarModel.AddProduction(production);
                }

                break;

            case EbnfBlockSetting blockSetting:
                switch (blockSetting.Setting.SettingIdentifier.Value)
                {
                case StartProductionSettingModel.SettingKey:
                    grammarModel.StartSetting = StartSetting(blockSetting);
                    break;

                case IgnoreSettingModel.SettingKey:
                    grammarModel.AddIgnoreSetting(IgnoreSetting(blockSetting));
                    break;

                case TriviaSettingModel.SettingKey:
                    grammarModel.AddTriviaSetting(TriviaSetting(blockSetting));
                    break;

                default:
                    throw new NotImplementedException($"invalid setting `{blockSetting.Setting.SettingIdentifier}´" +
                                                      $" with value `{blockSetting.Setting.Identifier}´");
                }

                break;

            default:
                throw new NotImplementedException();
            }
        }
        private static void writeGrammar(FixtureModel model, TextWriter writer, GrammarModel grammar, bool inParagraph)
        {
            if (inParagraph)
            {
                writer.WriteLine($"* {grammar.TitleOrFormat()}");
            }
            else
            {
                writer.WriteLine($"## {grammar.key}");
                writer.WriteLine($"### {grammar.TitleOrFormat()}");
            }


            if (grammar is Sentence)
            {
                writeSentence((Sentence)grammar, writer);
            }

            if (grammar is Table)
            {
                writeTable((Table)grammar, writer);
            }

            if (grammar is EmbeddedSection)
            {
                writeEmbed((EmbeddedSection)grammar, writer);
            }

            if (grammar is Paragraph)
            {
                writeParagraph(grammar.As <Paragraph>(), model, writer);
            }



            if (!inParagraph)
            {
                writer.WriteLine();
                writer.WriteLine();
            }
        }
        private static void writeGrammar(FixtureModel model, TextWriter writer, GrammarModel grammar, bool inParagraph)
        {
            if (inParagraph)
            {
                writer.WriteLine($"* {grammar.TitleOrFormat()}");                
            }
            else
            {
                writer.WriteLine($"## {grammar.key}");
                writer.WriteLine($"### {grammar.TitleOrFormat()}");
            }


            if (grammar is Sentence)
            {
                writeSentence((Sentence) grammar, writer);
            }

            if (grammar is Table)
            {
                writeTable((Table) grammar, writer);
            }

            if (grammar is EmbeddedSection)
            {
                writeEmbed((EmbeddedSection) grammar, writer);
            }

            if (grammar is Paragraph)
            {
                writeParagraph(grammar.As<Paragraph>(), model, writer);
            }

            

            if (!inParagraph)
            {
                writer.WriteLine();
                writer.WriteLine();
            }
        }
Exemple #20
0
        private void Initialize(ProductionExpression start, IReadOnlyList <ProductionExpression> productions, IReadOnlyList <LexerRuleModel> ignore, IReadOnlyList <LexerRuleModel> trivia)
        {
            GrammarModel = new GrammarModel
            {
                Start = start.ProductionModel
            };

            if (productions != null)
            {
                for (var p = 0; p < productions.Count; p++)
                {
                    GrammarModel.Productions.Add(productions[p].ProductionModel);
                }
            }

            if (ignore != null)
            {
                for (var i = 0; i < ignore.Count; i++)
                {
                    var ignoreRule = ignore[i];
                    GrammarModel.IgnoreSettings.Add(
                        new IgnoreSettingModel(ignoreRule));

                    GrammarModel.LexerRules.Add(
                        ignoreRule);
                }
            }

            if (trivia != null)
            {
                for (var t = 0; t < trivia.Count; t++)
                {
                    var triviaRule = trivia[t];
                    GrammarModel.TriviaSettings.Add(
                        new TriviaSettingModel(triviaRule));
                    GrammarModel.LexerRules.Add(
                        triviaRule);
                }
            }
        }
Exemple #21
0
        private void Initialize(ProductionExpression start, IReadOnlyList <ProductionExpression> productions, IReadOnlyList <LexerRuleModel> ignore, IReadOnlyList <LexerRuleModel> trivia)
        {
            GrammarModel = new GrammarModel
            {
                Start = start.ProductionModel
            };

            if (productions != null)
            {
                foreach (var production in productions)
                {
                    GrammarModel.Productions.Add(production.ProductionModel);
                }
            }

            if (ignore != null)
            {
                foreach (var ignoreRule in ignore)
                {
                    GrammarModel.IgnoreSettings.Add(
                        new IgnoreSettingModel(ignoreRule));

                    GrammarModel.LexerRules.Add(
                        ignoreRule);
                }
            }

            if (trivia != null)
            {
                foreach (var triviaRule in trivia)
                {
                    GrammarModel.TriviaSettings.Add(
                        new TriviaSettingModel(triviaRule));
                    GrammarModel.LexerRules.Add(
                        triviaRule);
                }
            }
        }
        public void GrammarModelGivenNullStartShouldResolveStartFromProductions()
        {
            var S = new ProductionModel("S");
            var A = new ProductionModel("A");
            var B = new ProductionModel("B");

            S.AddWithAnd(A);
            S.AddWithAnd(B);
            A.AddWithAnd(new LexerRuleModel(new StringLiteralLexerRule("a")));
            A.AddWithAnd(B);
            B.AddWithAnd(new LexerRuleModel(new StringLiteralLexerRule("b")));

            var grammarModel = new GrammarModel();

            grammarModel.Productions.Add(S);
            grammarModel.Productions.Add(A);
            grammarModel.Productions.Add(B);

            var grammar = grammarModel.ToGrammar();

            Assert.AreEqual(3, grammar.Productions.Count);
            Assert.IsNotNull(grammar.Start);
        }
Exemple #23
0
        private void Initialize(ProductionExpression start,
                                IReadOnlyList <ProductionExpression> productions,
                                IReadOnlyList <LexerRuleModel> ignore,
                                IReadOnlyList <LexerRuleModel> trivia)
        {
            GrammarModel = new GrammarModel
            {
                Start = start.ProductionModel
            };

            if (productions != null)
            {
                foreach (var production in productions)
                {
                    GrammarModel.AddProduction(production.ProductionModel);
                }
            }

            if (ignore != null)
            {
                foreach (var ignoreRule in ignore)
                {
                    GrammarModel.AddIgnoreSetting(new IgnoreSettingModel(new QualifiedName(ignoreRule.LexerRule.TokenName.Id)));
                    GrammarModel.AddLexerRule(ignoreRule);
                }
            }

            if (trivia != null)
            {
                foreach (var triviaRule in trivia)
                {
                    GrammarModel.AddTriviaSetting(new TriviaSettingModel(new QualifiedName(triviaRule.LexerRule.TokenName.Id)));
                    GrammarModel.AddLexerRule(triviaRule);
                }
            }
        }
Exemple #24
0
 public TextGenerator(GrammarDefinitionReader reader)
 {
     reader.ReadGrammar();
     _grammar = reader.Grammar;
 }